Docker-compose
Docker Compose
Docker Compose๋?
์ฃผ์ ๋ช ๋ น์ด
Docker Compose ๊ตฌ์ฑํด๋ณด๊ธฐ
Docker Compose Environment
Compose Network ์ค์ ์ต์
docker Compose Version๋ณ yml ๋ณ์
๋ฒ์ ๋ณ ํน์ง ๋ฐ ๊ตฌ์ฑ
Docker Compose๋?
Docker Compose๋ ๋ค์ค ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ณ ๊ณต์ ํ ์ ์๋๋ก ๊ฐ๋ฐ๋ ๋๊ตฌ๋ก
YAML ํ์ผ์ ํตํ์ฌ ๋จ์ผ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์คํํ๊ฑฐ๋ ๋ชจ๋ ์ข ๋ฃ๊ฐ ๊ฐ๋ฅํ๋ฉฐ
YAML ํ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ ์ํ๊ณ ํ๋ก์ ํธ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฃจํธ์ ํ์ผ์ ์ ์ฅํจ์ผ๋ก
๋ค๋ฅธ ์ฌ์ฉ์๊ฐ Repository๋ฅผ ๋ณต์ ํ๊ณ Compose
์คํ๋ง์ผ๋ก ๊ตฌ๋์ด ๊ฐ๋ฅํ๋ค.
\
๋จ์ผ ํธ์คํธ์ ์ฌ๋ฌ ๊ฒฉ๋ฆฌ ๋ ํ๊ฒฝ
Compose๋ ํ๋ก์ ํธ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ํ๊ฒฝ์ ์๋ก ๊ฒฉ๋ฆฌํ๊ณ ์ฌ๋ฌ ๋ค๋ฅธ ์ปจํ ์คํธ์์ ์ด ํ๋ก์ ํธ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ ๊ทผํ๋ค.
์คํ์ -p
์ต์
์ ํตํ์ฌ ํ๋ก์ ํธ ์ด๋ฆ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ฉฐ Default ๊ฐ์ ํ๋ก์ ํธ ํด๋ ์ด๋ฆ์ด ๋๋ค.
docker-dompose up -p {ํ๋ก์ ํธ ์ด๋ฆ}
์ปจํ
์ด๋ ์์ฑ์ ๋ณผ๋ฅจ ๋ฐ์ดํฐ ๋ณด์กด
์ปจํ ์ด๋ ์์ฑ์ ๋ณผ๋ฅจ ๋ฐ์ดํฐ ๋ณด์กดํ์ฌ ๋ฐ์ดํฐ๊ฐ ํ๋ฐ๋์ง ์๋๋ก ์ฒ๋ฆฌํ๋ค.
\
๋ณ๊ฒฝ๋ ์ปจํ
์ด๋ ๋ง ์ฌ์์ฑ
์ปจํ ์ด๋๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ์ฑ์ ์บ์ํ์ฌ ๋ณ๊ฒฝ๋์ง ์์ ์๋น์ค๋ฅผ ๋ค์ ์์ํ๋ฉด Compose๋ ๊ธฐ์กด ์ปจํ ์ด๋๋ฅผ ๋ค์ ์ฌ์ฉํ๋ค.
\
๋ณ์ ๋ฐ ํ๊ฒฝ ๊ฐ ๊ตฌ์ฑ ์ด๋
Compose ํ์ผ์ ๋ณ์๋ฅผ ์ง์
๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ํ๊ฒฝ ๋๋ ๋ค๋ฅธ ์ฌ์ฉ์์ ๋ง๊ฒ ์ปดํฌ์ง์ ์ปค์คํ ์ด ๊ฐ๋ฅํ๋ค.
์ฃผ์ ๋ช
๋ น์ด
up -d
docker-compose.yml
ํ์ผ์ ๋ด์ฉ์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์๋น์ค๋ฅผ ์คํํ๋ค.
up์ผ๋ก compose๋ฅผ ์คํ์ ๋จ๊ณ๋ณ ์งํ์ฌํญ
์๋น์ค๋ฅผ ๋์ธ ๋คํธ์ํฌ ์ค์
ํ์ํ ๋ณผ๋ฅจ ์์ฑ(ํน์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ณผ๋ฅจ๊ณผ ์ฐ๊ฒฐ)
ํ์ํ ์ด๋ฏธ์ง ํ(pull)
ํ์ํ ์ด๋ฏธ์ง ๋น๋(build)
์๋น์ค ์์กด์ฑ์ ๋ฐ๋ผ ์๋น์ค ์คํ
options
-d
: ์๋น์ค ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ. (docker run์์์ -d์ ๊ฐ์)--force-recreate
: ์ปจํ ์ด๋๋ฅผ ์ง์ฐ๊ณ ์๋ก ์์ฑ.--build
: ์๋น์ค ์์ ์ ์ด๋ฏธ์ง๋ฅผ ์๋ก ์์ฑ
ps
ํ์ฌ ํ๊ฒฝ์์ ์คํ ์ค์ธ ๊ฐ ์๋น์ค์ ์ํ๋ฅผ ํ์ํ๋ค.
Name Command State Ports
---------------------------------------------------------------------------
tj_app_1 docker-entrypoint.sh sh -c ... Exit 1
tj_mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
stop, start
์๋น์ค๋ฅผ ๋ฉ์ถ๊ฑฐ๋, ๋ฉ์ถฐ ์๋ ์๋น์ค๋ฅผ ์์ํ๋ค.
$ docker-compose stop
Stopping tj_mysql_1 ... done
$ docker-compose start
Starting app ... done
Starting mysql ... done
down
์๋น์ค๋ฅผ ์ญ์ ํ๋ค. ์ปจํ ์ด๋์ ๋คํธ์ํฌ๋ฅผ ์ญ์ ํ๋ฉฐ, ์ต์ ์ ๋ฐ๋ผ ๋ณผ๋ฅจ๋ ์ญ์ ํ๋ค.
$ docker-compose down
Stopping tj_mysql_1 ... done
Removing tj_app_1 ... done
Removing tj_mysql_1 ... done
Removing network tj_default
options
--volume
: ๋ณผ๋ฅจ๊น์ง ๊ฐ์ด ์ญ์ (DB ๋ฐ์ดํฐ ์ด๊ธฐํ ํ๋๋ฐ ์ฉ์ดํจ)
exec
์คํ ์ค์ธ ์ปจํ ์ด๋์์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
$ docker-compose exec django ./manage.py makemigrations
$ docker-compose exec db psql postgres postgres
run
docker run ๊ณผ ๋ง์ฐฌ ๊ฐ์ง๋ก ํน์ ๋ช
๋ น์ด๋ฅผ ์ผํ์ฑ์ผ๋ก ์คํํ๋ค.
exec
๋ ํ๋ก์ธ์๋ฅผ ์คํ์์ผ๋์๋ ์ฌ์ฉ๋๊ณ run
์ batch์ฑ ์์
์ ์ฌ์ฉ ํนํ ๋๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค.
options
--rm
: ํด๋น ๋ช ๋ น์ด๊ฐ ์ข ๋ฃ๋ ๋ค ์ปจํ ์ด๋๋ ์ข ๋ฃ
logs
output์ผ๋ก ๋์จ log๋ค์ ํ์ธ ํ ๋ ์ฌ์ฉํ๋ค.
docker์ logs์ ๋ง์ฐฌ๊ฐ์ง๋ก --follow
, -f
๋ฅผ ํ์ฌ ์ค์๊ฐ์ผ๋ก ๋์ค๋ ๋ก๊ทธ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
$ docker-compose logs -f
Attaching to docker_app_1, docker_mysql_1
app_1 | yarn install v1.22.5
app_1 | info No lockfile found.
app_1 | [1/4] Resolving packages...
app_1 | [2/4] Fetching packages...
app_1 | [3/4] Linking dependencies...
app_1 | [4/4] Building fresh packages...
app_1 | success Saved lockfile.
app_1 | Done in 0.14s.
app_1 | yarn run v1.22.5
app_1 | error Couldn't find a package.json file in "/app"
app_1 | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
mysql_1 | 2021-01-05 04:43:03+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started.
options
-f
,--follow
: ์ค์๊ฐ ๋ก๊ทธ ์ถ๋ ฅ
config
docker-compose
์ ์ต์ข
์ ์ผ๋ก ์ ์ฉ๋ ์ค์ ์ ๋ณด์ฌ์ค๋ค.
-f
๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ฌ๊ฐ์ ์ค์ ํ์ผ์ ๋์ ์๋ ํ์ธ์ ์ฉ์ดํจ
$ docker-compose config
services:
app:
command: sh -c "yarn install && yarn run dev"
environment:
MYSQL_DB: todos
MYSQL_HOST: mysql
MYSQL_PASSWORD: secret
MYSQL_USER: root
image: node:12-alpine
ports:
- published: 3000
target: 3000
volumes:
- /Users/tj/project/tj/tj-msa/docker:/app:rw
working_dir: /app
mysql:
environment:
MYSQL_DATABASE: todos
MYSQL_ROOT_PASSWORD: secret
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql:rw
version: '3.8'
volumes:
todo-mysql-data: {}
Docker Compose ๊ตฌ์ฑํด๋ณด๊ธฐ.
docker compose ํ์ผ์ ํฌ๊ฒ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด์๋ค.
version: "3.8" # docker-compose ์ค์ ํ์ผ ๋ฒ์
services:
web:
# ์น ์ ํ๋ฆฌ์ผ์ด์
์ค์
db:
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
networks:
# ๋คํธ์ํฌ ์ค์
volumes:
# ๋ณผ๋ฅจ ์ค์
\
docker-compose version ํ์ธ ๋งํฌ
์๋น์ค ์ ์
App Service ์ ์
docker run -dp 3000:3000 \
-w /app -v ${PWD}:/app \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
์๋จ์ Docker
์คํ๋ช
๋ น์ด๋ฅผ ์๋์ฒ๋ผ Docker Compose
๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
version: "3.8"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
Compose ์ฅ์ ์ผ๋ก๋ ์๋๊ฒฝ๋ก ์ ๋ ฅ์ด ๊ฐ๋ฅํ๋ฉฐ yaml๋ก ๊ตฌ์ฑํ์ฌ ์ค์ ํ์ผ์ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค.
MySQL ์๋น์ค ์ ์
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
version: "3.8"
services:
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
์ต์ข
๋ณธ
version: "3.8"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
docker-compose.yml
ํ์ผ๋ช
์ผ๋ก YAML ํ์ผ์ ์์ฑํ๊ณ docker-compose up
๋ช
๋ น์ด๋ฅผ ํตํ์ฌ ์์ํ๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ ์ต์
-d
docker-compose up -d
๋ง์ฝ
docker-compose.yml
์ด ์๋ ๋ค๋ฅธ ํ์ผ์ ์คํํ๊ธฐ ์ํด์docker-compose -f {YAML_FILE_PATH} up
ํ์์ผ๋ก ๋ช ๋ น์ด ๊ฐ๋ฅํ๋ค.
ex) $ docker-compose -f docker-compose-custom.yml up
docker-compose -f docker-compose.yml -f docker-compose-test.yml up
ํํ๋ก ๋๊ฐ๋ ๊ฐ๋ฅํ๋ค. YAML์ ๋๊ฐ ์ด์ ์ค์ ํ ๊ฒฝ์ฐ ์์ ์๋ ์ค์ ๋ณด๋ค ๋ค์ ์๋ ํ์ผ์ด ์ฐ์ ์ ๋๋ค.
Docker Compose Environment
.env
file
.env
fileํ๊ฒฝ๋ณ์ ์ค์ ์ผ๋ก ์๋์ ๊ฐ์ด ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.
web:
image: "webapp:${TAG}"
๊ธฐ๋ณธ์ ์ผ๋ก docker-compose up
์ ํ ์ํ์์๋ .env
ํ์ผ์ ์ฐพ์ ํ์ผ ๋ด๋ถ์ ์๋ ๊ฐ์ ํ๊ฒฝ ๋ณ์๋ก ์ฌ์ฉํ๋ค.
$ cat .env
TAG=v1.5
$ cat docker-compose.yml
version: '3'
services:
web:
image: "webapp:${TAG}"$
$ docker-compose config
version: '3'
services:
web:
image: 'webapp:v1.5'
$ export TAG=v2.0
$ docker-compose config
version: '3'
services:
web:
image: 'webapp:v2.0'
์ฌ๋ฌ ํ์ผ์์ ๋์ผํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉํ ๊ฐ์ ์ ํํ๊ธฐ ์ํด Compose์์ ์ฌ์ฉํ๋ ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
Compose file
Shell environment variables
Environment file
Dockerfile
Variable is not defined
์ํฉ์ ๋ฐ๋ฅธ .env
์ ์ฉ๋ฒ
.env
์ ์ฉ๋ฒdev
, prod
, local
ํ๊ฒฝ์ ๋ฐ๋ผ์
.env.dev
, .env.prod
, .env.local
ํ์์ผ๋ก ํ ๋น์ ์ค ์ ์๋๋ฐ
--env-file
์ต์
์ผ๋ก environment ํ์ผ ์ง์ ์ด ๊ฐ๋ฅํ๋ค.
$ docker-compose --env-file ./config/.env.dev up
CLI Environment
์๋์ ๋ช ๋ น์ด๋ค์ ๊ฐ๊ฐ ๊ทธ ์๋์ compose ํ์ผ์ด ์ผ์นํ๊ฒ ๋งตํ๋๋ค.
$ docker run -e VARIABLE1
web:
environment:
- VARIABLE1
$ docker-compose run -e DEBUG=1 web python console.py
web:
environment:
- DEBUG=1
Docker Cli Environment Variable
CLI์์ ์คํํ ๋์ ์ฐธ๊ณ ๋ณ์ ํค ๊ฐ https://docs.docker.com/compose/reference/envvars/
Compose Network ์ค์ ์ต์
version: "3.9"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
์ Compose๋ฅผ ์คํํ์๋์ ๋คํธ์ํฌ๊ฐ ์์ฑ๋๋ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
myapp_default
๋คํธ์ํฌ ์์ฑweb
์ปจํ ์ด๋๊ฐ ์์ฑ. (web
์ด๋ผ๋ ์ด๋ฆ์ผ๋กmyapp_default
์ ์ ์)db
์ปจํ ์ด๋๊ฐ ์์ฑ. (db
์ด๋ผ๋ ์ด๋ฆ์ผ๋กmyapp_default
์ ์ ์)
๋คํธ์ํฌ๊ฐ ๊ตฌ์ฑ๋ ์ดํ
postgres://db:5432
์ฃผ์๋ก ์ ์ ๊ฐ๋ฅ๋ด๋ถ ์ปจํ ์ด๋ ๋ผ๋ฆฌ๋
postgres://db:5432
๋ก ์ ์ํ๊ณ ์ธ๋ถ์์postgres://{DOCKER_IP}:8001
๋ก ์ ์์ปจํ ์ด๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ๋ค์ ์์ํ ๊ฒฝ์ฐ์๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ๊ฐ์ง๋ง ๋ค๋ฅธ IP๋ก ๋คํธ์ํฌ๊ฐ ์์ฑ๋์ด IP ๋ฒ ์ด์ค๋ IP๋ฅผ ๋ค์ ์ฐพ์์ ์ฐ๊ฒฐํ์ฌ์ผ ํ๊ณ ๋ค๋ฅธ ์ปจํ ์ด๋์์ ๊ธฐ์กด์ ์ ์ํ๋ ์ปจํ ์ด๋ ์ด๋ฆ์ผ๋ก ์ฌ ์ฐ๊ฒฐ์ ์๋ํ์ฌ์ผ ํ๋ค.
Links
๋ค๋ฅธ ์๋น์ค์ ์ปจํ
์ด๋์ ์ฐ๊ฒฐํ๋ค.
์ด๋ฆ๋ง ์ง์ ํ๊ฑฐ๋ {name}:{alias}
ํ์์ผ๋ก ์ง์ ํ ์ ์๋ค.
depend_on
์ฒ๋ผ ๋ํ๋์ ๊ด๊ณ๊ฐ ๋งบ์ด์ง๋ฉฐ ๋คํธ์ํฌ๋ ๊ฐ์ด ์ฐ์ผ๋๋ ํ๋ ์ด์์ ๋คํธ์ํฌ๊ฐ ๊ด๋ฆฌ๋์ด ๋คํธ์ํฌ๋ง ์ฌ์ฉํ๊ธธ ๊ถ์ฅ
version: "3"
services:
web:
build: .
links:
- "redis"
- "db:database"
db:
image: postgres
Custom Network
Custom Network๋ฅผ ํตํด ์ข ๋ ๋ณต์กํ ๋คํธ์ํฌ ํ ํด๋ก์ง๋ฅผ ๋ง๋ค ์ ์๋ค
version: "3"
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Use a custom driver
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
top-level network
์ต์
์์ ์ปค์คํ
ํ๊ฒ ์ง์ ์ด ๊ฐ๋ฅ
์์ ๊ฐ์ด ์ค์ ์ ํ๋ฉด app
์์๋ง proxy
, db
์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ db
์ proxy
๋ ์๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ์ค์ ์ด๋๋ค.
IPv4, IPv6
IPv6 ์ฌ์ฉํ๋ ค๋ฉด enable_ipv6
๋ฅผ ๋ฐ๋์ true
๋ก ํด์ผํ๋ค.
version: "2.4"
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1
Default Network
default๋ฅผ ์ด์ฉํ์ฌ ์์ฒด ๋คํธ์ํฌ๋ฅผ ์ง์ ํ๋ฉด์ ์ฑ ์ ์ฒด์ ๊ธฐ๋ณธ์ ์ธ ๋คํธ์ํฌ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
Use Pre Existing Network
๊ธฐ์กด์ ์ธ๋ถ์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด external
์ ์ฌ์ฉํ์ฌ ๋ช
์ํ๋ค
networks:
default:
external:
name: my-pre-existing-network
docker Compose Version ๋ณ yml ๋ณ์
Versioning
docker-compose.yml
์๋จ์ ์์ฑํ๋ versioning ์์ฑ ๋ฐฉ๋ฒ
Version 1
์์๋ ๋ฒ์ ๋์ ์๋ตVersion 2
๋ถํฐ ๋ง์ด๋ ๋ฒ์ (2.x)๊น์ง ์ค์ ํด์ผ ํจ (์๋ต์ 2.0์ผ๋ก ์ ์ฉ๋๋ค.)Version 3
์ ๋์ปค ์ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋๋๋ก ๋์์ธ ๋จ
๊ฐ docker ๋ฒ์ ๋ณ ์ฌ์ฉ ๊ฐ๋ฅํ docker-compose.yml
๋ฒ์
docker-compose.yml
๋ฒ์ 3.8
19.03.0+
1.26.0+
3.7
18.06.0+
-
3.6
18.02.0+
-
3.5
17.12.0+
-
3.4
17.09.0+
-
3.3
17.06.0+
-
3.2
17.04.0+
-
3.1
1.13.1+
-
3.0
1.13.0+
1.10.0+
2.4
17.12.0+
1.21.0+
2.3
17.06.0+
1.16.0+
2.2
1.13.0+
1.13.0+
2.1
1.12.0+
1.9.0+
2.0
1.10.0+
1.6.0+
1.0
1.9.1.+
Compose ๋ฒ์ ์ ๋ฐ๋ฅธ ์ฐจ์ด์
Structure๊ฐ ํ์ฉํ๋ ํค ๊ฐ๊ณผ ๋งค๊ฐ๋ณ์
์คํํด์ผํ๋ ์ต์ Docker Engine ๋ฒ์
๋คํธ์ํน๊ณผ ๊ด๋ จ๋ Compose์ ๋์
Compose ๋ง์ด๊ทธ๋ ์ด์
Version 2.x -> 3.x ๋ง์ด๊ทธ๋ ์ด์
Compose ๋ฒ์ 2
์ 3
์ ๊ตฌ์กฐ๋ ๋์ผํ์ง๋ง ์ญ์ ๋ ๋งค๊ฐ๋ณ์๋ค์ด ์์ด์ 3.X
์ ๋ง๊ฒ ์์ ํ์ฌ์ค๋ค.
volume_driver
version: "3.8"
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
driver: mydriver
์๋น์ค์์ ๋ณผ๋ฅจ ๋๋ผ์ด๋ฒ๋ฅผ ์ค์ ํ๋ ๋์
top-level volumes option
์ ์ฌ์ฉํ์ฌ ๋ณผ๋ฅจ์ ์ ์ ํ๊ณ ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ volumes_from
: ์๋น์ค๊ฐ์ ๋ณผ๋ฅจ์ ๊ณต์ ํ๋ ค๋ฉดtop-level volumes option
์ ์ฌ์ฉํ์ฌ ์ ์ํ๊ณ ์๋น์ค ์์ค ๋ณผ๋ฅจ ์ต์ ์ ์ฌ์ฉํ์ฌ ๊ณต์ ํ๋ ๊ฐ ์๋น์ค์์ ์ฐธ์กฐcpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
๋3.x
์resource
๋ก ๋์ฒดํด๋น ์ต์ ์ docker swarm์๋ง ์ ์ฉ
์ปจํ ์ด๋์ ์ ์ฉํ๊ธฐ ์ํด์ ์๋ ๋งํฌ์ ๊ฐ์ด ์ ์ฉ ํ์
version: "3.8"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
extends
์ ์ ๊ฑฐ๋์ด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ผํจgroup_add
์3.x
์์ ์ ๊ฑฐ๋จpids_limit
์3.x
์ ๋์ ๋์ง ์์networks -
link_local_ips
์ต์ ์3.x
์ ๋์ ๋์ง ์์
Version 1 -> 2.x ๋ง์ด๊ทธ๋ ์ด์
๋ชจ๋ ๊ฒ์ ํ๋จ๊ณ์ฉ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํ๊ณ
services:
๋ฅผ ์ฝ์์ต์๋จ์ version:
2.x
์ง์ dockerfile
์build
ํ์๋ก ์ฎ๊ธด๋ค.
build:
context: .
dockerfile: Dockerfile-alternate
log_driver
,log_opt
๋logging
ํ์๋ก ๋๊ณ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ค.
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
net
๋network_mode
๋ก ๋์ฒด
net: host -> network_mode: host
net: bridge -> network_mode: bridge
net: none -> network_mode: none
net: "container:web" -> network_mode: "service:web"
# net: "container:[container name/id]" ํํ๋ ๊ฐ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์
net: "container:cont-name" -> network_mode: "container:cont-name"
net: "container:abc12345" -> network_mode: "container:abc12345"
volumes
named volumes์ด ์๋ ๊ฒฝ์ฐtop-level volumes option
์์data
๋ฅผ ์ ์ธํด์ผ ํจ
version: "2.4"
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data: {}
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ ํธ ์ด๋ฆ์ผ๋ก ๋ณผ๋ฅจ์ ์ ์ธํ์ง๋ง
data
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณผ๋ฅจ์ ์์ฑํ๊ณ ์ถ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ถ๋ก ์ ์ธ์ํ๋ค.
volumes:
data:
external: true
๋ฒ์ ๋ณ ํน์ง ๋ฐ ๊ตฌ์ฑ
Version.1
https://docs.docker.com/compose/compose-file/compose-file-v1/
yml ๋ฌธ์์ ๋ฒ์ ๋ช ์ด ์๋ต
volumes
,networks
orbuild arguments
์ฌ์ฉ ๋ถ๊ฐnetworking์ด ์ง์๋์ง ์์
๋ชจ๋ ์ปจํ ์ด๋๋ ๊ธฐ๋ณธ bridge ๋คํธ์ํฌ ์ ๋ฐฐ์น ๋๊ณ ํด๋น IP ์ฃผ์์ ๋ค๋ฅธ ๋ชจ๋ ์ปจํ ์ด๋์์ ์ฐ๊ฒฐ ๊ฐ๋ฅ
์ปจํ ์ด๋ ๊ฐ ๊ฒ์์ ํ์ฑํ ํ๋ ค๋ฉด
links
๋ฅผ ์ฌ์ฉ
links https://docs.docker.com/compose/compose-file/compose-file-v1/#links
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
Version.2
https://docs.docker.com/compose/compose-file/compose-file-v2/
Compose 1.6.0
์ด์Docker Engine of version 1.10.0+.
์์ ๋์yml ๋ฌธ์์ ๋ฒ์ ๋ช ์ ๋ง์ด๋ ๋ฒ์ ๊น์ง ์์ฑ
ex) 2.1
๋ชจ๋ ์๋น์ค๋ services ํค ์๋์ ์ ์ธ
volumes
์ Named volumes ์์ฑ ๊ฐ๋ฅnetworks
์ Network ์์ฑ ๊ฐ๋ฅ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ธฐ๋ณธ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋๋ฉฐ ์๋น์ค ์ด๋ฆ๊ณผ ๋์ผํ ํธ์คํธ ์ด๋ฆ์์ ๊ฒ์ ๊ฐ๋ฅ ์ด๊ฒ์ ๋งํฌ๊ฐ ๊ฑฐ์ ๋ถํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธ.
links ๋์ ์๋ฆฌ ์ด ์ปจํ ์ด๋์ /etc/hosts ํ์ผ์ ๊ทธ ๋ด์ฉ์ด ์ถ๊ฐ๋์ด์ ์ปจํ ์ด๋์์ ๋ค๋ฅธ ์ปจํ ์ด๋ ๋ค์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
192.168.1.186 db
192.168.1.186 database
192.168.1.187 redis
๋คํธ์ํฌ https://docs.docker.com/compose/networking/
Version2 ์์
version: "2.4"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
networks:
- front-tier
- back-tier
redis:
image: redis
volumes:
- redis-data:/var/lib/redis
networks:
- back-tier
volumes:
redis-data:
driver: local
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
์ถ๊ฐ๋ ๋งค๊ฐ๋ณ์
network -
aliases
Network -
depends_on
:
depends_on
version: "2.4"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
์คํ์ depends_on
์ ๋ช
์๋ db
, redis
๊ฐ ๋ฌ ๋ค์ ํด๋น ์๋น์ค๊ฐ ์คํ๋๋ค.
Version 2.1
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
link_local_ips
build, service -
isolation
volumes, networks, build -
labels
volumes -
name
userns_mode
healthcheck
sysctls
pids_limit
oom_kill_disable
cpu_period
Version 2.2
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
init
scale
cpu_rt_runtime
,cpu_rt_period
build -
network์
Version 2.3
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
build -
target
,extra_hosts
,shm_size
healthcheck -
start_period
service -
runtime
volumns -
LONG SYNTAX
์ ๊ณตdevice_cgroup_rules
LONG SYNTAX
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
Version 3
https://docs.docker.com/compose/compose-file/compose-file-v3/ ์ญ์ ๋ ๋งค๊ฐ ๋ณ์
volume_driver
volumes_from
cpu_shares
cpu_quota
cpuset
mem_limit
memswap_limit
extends
group_add
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
Version 3.1
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
Version 3.2
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
build -
cache_from
network driver option -
attachable
)deploy -
endpoint_mode
deploy -
placement preference
Version 3.3
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
Version 3.4
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
healthcheck -
start_period
update - order
volumes - name
Version 3.5
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
Version 3.6
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
volume mount type -
tmpfs
Version 3.7
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
service -
init
deploy -
rollback_config
root of service
,network
,volume
,secret
์ extension-fields ์ ๊ณต
Version 3.8
์ถ๊ฐ๋ ๋งค๊ฐ ๋ณ์
secret -
driver
,driver_opts
option (swarm์ ๋ฐฐํฌ์์๋ง ์ ์ฉ)
์ฐธ๊ณ ํ ๋ฌธ์ https://docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose#%EB%8F%84%EC%BB%A4-%EC%BB%B4%ED%8F%AC%EC%A6%88%EC%9D%98-%EC%A3%BC%EC%9A%94-%EB%AA%85%EB%A0%B9%EC%96%B4 https://docs.docker.com/compose/environment-variables/ https://docs.docker.com/compose/env-file/ https://docs.docker.com/compose/reference/envvars/
Last updated