๐ณ Docker Compose ํ์ผ ๊ตฌ์ฑ ์์
๐พ ๋์ปค ์ปดํฌ์ฆ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฃฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์์ฃผ ์ฌ์ฉํ๋ ํญ๋ชฉ๋ง ์ ๋ฆฌํ์๊ณ , ๋ค๋ฅธ ํญ๋ชฉ๋ค์ ํ์ธํ์๋ ค๋ฉด docker-compose๋ฅผ ํ์ธํ์ธ์.
Docker compose๋?
Docker Compose๋ฅผ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋(container)๋ก ๊ตฌ์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋์ ํ์ผ(YAML)์ ์ ์ํด๋๊ณ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ํ ๋ฒ์ ์ฌ๋ฆฌ๊ฑฐ๋ ๋ด๋ฆด ์ ์์ต๋๋ค. Docker Compose๋ ๊ธฐ๋ณธ์ ์ผ๋กย docker-compose.yml
ย ํ์ผ์ ์ค์ ํ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ
docker-compose.yml
ย ํ์ผ์ ๋๋ต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
version: "3.7"
services:
web:
# ์ปจํ
์ด๋ ์๋น์ค, ์น ์ ํ๋ฆฌ์ผ์ด์
์ค์
db:
# ์ปจํ
์ด๋ ์๋น์ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
networks:
# ๋คํธ์ํฌ ์ค์
volumes:
# ๋ณผ๋ฅจ ์ค์
Docker Compose์์ ์๋น์ค๋ ๋
๋ฆฝ๋ ์ปจํ
์ด๋์์ ๋์๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑ ์์๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ฅ ๋จผ์ ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ฒด๊ฐ ์๋น์ค๊ฐ ๋ ๊ฒ์ด๊ณ , ๊ทธ ๋ฐ์ ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ด ์์กดํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ๋ ์๋น์ค๊ฐ ๋ ์ ์์ต๋๋ค. ์ฆ, ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
๋ฟ๋ง ์๋๋ผ ์ ์์ ์ผ๋ก ๊ตฌ๋๋๊ธฐ ์ํด์ ํ์ํ ๊ธฐ๋ฐ ์์คํ
๊น์ง Docker Compose๋ก ์ค์ ํ๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
.env ํ์ผ
docker-compose.yml
ํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ .env
ํ์ผ์ ์ ์ํ ์ ์์ต๋๋ค. .env
ํ์ผ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ์ ํ๋ฉด docker-compose.yml
์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# .env
MY_ENV="prod"
# docker-compose.yml
version: '3.7'
services:
web:
build:
context: web/
args:
PROFILE: ${MY_ENV}
๊ตฌ์ฑ ์์
docker-compose.yml
์์ฑ์ ์์ฃผ ์ฌ์ฉํ๋ ํญ๋ชฉ์ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
build
build
ย ํญ๋ชฉ์ ํด๋น ์๋น์ค์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํ ์ฉ๋๋ก,ย Dockerfile
์ด ์์นํ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
## docker-compose.ymlย ํ์ผ๊ณผ ๋์ผํ ๋๋ ํ ๋ฆฌ์ ์์นํย Dockerfile ์ ์ฌ์ฉํด์ web ์๋น์ค์ ์ด๋ฏธ์ง๋ฅผ ๋น๋
version: '3.7'
services:
web:
build: .
## Dockerfile์ด ์๋ ๋ค๋ฅธ ์ด๋ฆ์ ํ์ผ๋ก ๋น๋๋ฅผ ํ๊ณ ์ถ๊ฑฐ๋, ๋น๋ ์ธ์๋ฅผ ๋๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ
version: '3.7'
services:
web:
build:
context: ./app
dockerfile: Dockerfile-dev
args:
arg1: "development"
arg2: "docker"
image
ํ๋ก์ ํธ์์ ์ง์ ๊ฐ๋ฐํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๊ฒฝ์ฐ์๋, ์ด๋ฏธ์ง๋ฅผ ์ง์ ๋น๋ํ๋ ๋์ ์ ์ด๋ฏธ์ง ์ ์ฅ์(repository)๋ก ๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
# image ํญ๋ชฉ์ ์ด๋ฏธ์ง ์ ์ฅ์๋ก ๋ถํฐ ๋ด๋ ค๋ฐ์ ์ด๋ฏธ์ง์ ์ด๋ฆ๊ณผ ํ๊ทธ๋ฅผ ๋ช
์ํ๋๋ฐ ์ฌ์ฉ๋ฉ
version: '3.7'
services:
db:
image: postgres:13
cache:
image: redis
ports
ports
ย ํญ๋ชฉ์ ์ธ๋ถ๋ก ๋
ธ์ถ์ํฌ ํฌํธ์ ๋งตํ์ ๋ช
์ํฉ๋๋ค. ๋ฐ์ธ๋(bind)๊ฐ ํ์ํ ํธ์คํธ ์ธ๋ถ ํฌํธ์ ์ปจํ
์ด๋ ๋ด๋ถ ํฌํธ๋ฅผ ์ง์ ํฉ๋๋ค.
services:
web:
ports:
- "8000:8000"
db:
ports:
- "5432:5432"
volumes
volumes
ย ํญ๋ชฉ์ ๋ณผ๋ฅจ ์ค์ ์ ์ํด ์ฐ์
๋๋ค. ๋ง์ดํธ(mount)๊ฐ ํ์ํ ํธ์คํธ์ ๊ฒฝ๋ก์ ์ปจํ
์ด๋์ ๊ฒฝ๋ก๋ฅผ ๋ช
์ํฉ๋๋ค.
# ํธ์คํธ์ ๊ฒฝ๋ก๋ก ๋ณผ๋ฅจ ์ค์
services:
web:
volumes:
- .:/web
# ๋ฏธ๋ฆฌ ์์ฑํ docker volume์ผ๋ก ๋ณผ๋ฅจ ์ค์
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
external: true
depends_on
depends_on
ํญ๋ชฉ์ ์๋น์ค ๊ฐ ์์กด ๊ด๊ณ๋ฅผ ์ง์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ๋ผ์ค๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ ๋์ค ์๋น์ค๊ฐ ๋จผ์ ์ฌ๋ผ์์ผ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
command
command
ย ํญ๋ชฉ์ ํด๋น ์๋น์ค๊ฐ ์ฌ๋ผ์ฌ ๋ย Dockerfile
์ย CMD
ย ๋ช
๋ น๋ฌธ์ ๋ฌด์ํ๊ณ ์คํํ ๋ช
๋ น์ด๋ฅผ ์ค์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
services:
web:
command: node .
environment
environment
ย ํญ๋ชฉ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
# ์๋์ ๊ฐ์ ํ์์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
environment:
- RACK_ENV=development
- SHOW=true
๋๊ธ๋จ๊ธฐ๊ธฐ