๐Ÿณ docker-compose.yml ์ž‘์„ฑ

๊ฐ€์˜ยท2021๋…„ 8์›” 3์ผ
0

๋„์ปค

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

Compose file version 3 reference

Compose file version 3 reference

Compose ํŒŒ์ผ ๊ตฌ์กฐ์™€ ์˜ˆ์‹œ

๋‹ค์Œ์€ ํˆฌํ‘œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ„๋‹จํ•œ ์ปดํฌ์ฆˆ ํŒŒ์ผ ์˜ˆ์‹œ์ด๋‹ค.

version: "3.9"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        max_replicas_per_node: 1
        constraints:
          - "node.role==manager"

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager"

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  frontend:
  backend:

volumes:
  db-data:

Compose file

์ปดํฌ์ฆˆ ํŒŒ์ผ์ด๋ž€ service network ๊ทธ๋ฆฌ๊ณ  volume ์„ ์ •์˜ํ•˜๋Š” ์•ผ๋ฏˆํŒŒ์ผ์ด๋‹ค. ์ปดํฌ์ฆˆ ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ./docker-compose.yml ์ด๋‹ค.

.yml ์ด๋‚˜ .yaml ๋‘˜ ๋‹ค ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • service ์ •์˜๋Š” ๊ฐ๊ฐ์˜ ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋˜๋Š” configuration์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

    configuration์˜ ์˜ˆ์‹œ: docker run ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ™์€ ๊ฒƒ์„ ๋„˜๊ฒจ์ฃผ๋Š” ์ผ ๊ฐ™์€ ๊ฒƒ๋“ค


์ž ์ง€๊ธˆ๋ถ€ํ„ฐ list of all configuration option์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”โ€ผ๏ธ

build

build time์— ์ ์šฉ๋˜๋Š” configuration option๋“ค์ด๋‹ค.

build ๋Š”

  1. buildํ•˜๋ ค๋Š” context์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” String

    build: ./dir
  2. ๋˜๋Š” object์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋‹ค์Œ์€ context, dockerfile, args๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ์ธ ๊ฒฝ์šฐ์ด๋‹ค.

    build:
    	context: ./dir
    	dockerfile: Dockerfile-alternate
    	args:
    		buildno: 1

๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ image ๋ผ๋Š” configuration option์„ ์ถ”๊ฐ€ํ•ด์„œ build ํ›„์— ์ƒ์„ฑ๋˜๋Š” ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

build: ./dir
image: webapp:tag # ์ด๋ฏธ์ง€์ด๋ฆ„์ด webapp ์ด๊ณ  ํƒœ๊ทธ๊ฐ€ tag๋กœ ๋นŒ๋“œ๋œ๋‹ค.

context

์ปจํƒ์ŠคํŠธ๋Š” Dockerfile์„ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ ๋˜๋Š” git repo์˜ url์ด๋‹ค.

์ƒ๋Œ€๊ฒฝ๋กœ๊ฐ€ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์กŒ์„๋•Œ, ์ด๊ฑด compose file์„ ๊ธฐ์ค€์œผ๋กœํ•œ ๊ฒฝ๋กœ๋กœ ํ•ด์„๋œ๋‹ค. ์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” Docker daemon์œผ๋กœ ๋ณด๋‚ด์ง„๋‹ค.

build:
	context: ./dir

dockerfile

Dockerfile์„ ๋Œ€์ฒดํ•˜๋Š” ํŒŒ์ผ์„ ์ง€์ •ํ•ด์ค€๋‹ค.

args

build ๊ณผ์ •์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜์ธ build argument๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ผ๋ฐ˜ ๋„์ปค ํŒŒ์ผ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

# syntax=docker/dockerfile:1

ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"

args๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ build์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์˜ค๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

build:
	context: .
	args:
		buildno: 1
		gitcommithas: cdc3b19

array๋กœ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

build:
	context: .
	args:
		- buildno=1
		- gitcommithash=cdc3b19

build argument๋“ค์€ ๊ทธ ๊ฐ’์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๋นŒ๋“œ ์‹œ ์ธ์ˆ˜๊ฐ’์€ ์ด์ „์— Compose๊ฐ€ ์‹คํ–‰ํ•˜๋˜ ํ™˜๊ฒฝ์˜ ๊ฐ’์ด ๋œ๋‹ค.

network

๋นŒ๋“œํ•˜๋Š” ๋™์•ˆ์— RUN ๊ธฐ๊ณ„์–ด๊ฐ€ ์—ฐ๊ฒฐ๋  ๋„คํŠธ์›Œํฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ค์ •ํ•œ๋‹ค. (๋ญ”์†Œ๋ฆฌ์ง€)

build:
	context: .
	network: host
build:
	context: .
	network: custom_network_1

๋งŒ์•ฝ ๋นŒ๋“œ ํ•˜๋Š”๋™์•ˆ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ ์‹ถ์œผ๋ฉด ๊ฐ’์œผ๋กœ none์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.


command

default command๋ฅผ ๋ฎ์–ด์“ด๋‹ค.

command: bundle exec thin -p 3000

dockerfile์—์„œ์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

command: ["bundle", "exec", "thin", "-p", "3000"]

configs

configํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง“๋Š” ์งง์€ ๋ฌธ๋ฒ•์ด๋‹ค. ์ด grants(์ดˆ๋Œ€)๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ config ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ์— ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•œ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ๋˜๊ฒŒ ํ•œ๋‹ค. ? source name๊ณผ destination mountpoint ๋Š” ๋ชจ๋‘ config name์œผ๋กœ ์„ค์ •๋œ๋‹ค. ?

version: "3.9"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs: # ์‚ฌ์šฉํ•˜๋Š” configuration file๋“ค์˜ ์ด๋ฆ„
      - my_config
      - my_other_config

configs: # ์—ฌ๊ธฐ์„œ ์ •์˜ํ•จ.
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

container_name

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ์ปค์Šคํ…€์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

container_name: my-web-container

๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฐ˜๋“œ์‹œ uniqueํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์„ค์ •ํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋Š” ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ด๋‹ค.


depends_on

์„œ๋น„์Šค(์ปจํ…Œ์ด๋„ˆ) ๊ฐ„์˜ dependency๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. service dependencies ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ์œ ๋ฐœํ•œ๋‹ค.

  • docker-compose up ์€ dependency order๋กœ ์„œ๋น„์Šค๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค.
  • docker-compose up SERVICE ๋Š” ์ž๋™์œผ๋กœ SERVICE's dependencies ๋“ค์„ ํฌํ•จํ•œ๋‹ค. ๐Ÿ‘ป
  • docker-compose stop ์€ ์˜์กด์„ฑ ์ˆœ์„œ์— ๋งž์ถฐ์„œ ์„œ๋น„์Šค๋“ค์„ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
version: "3.9"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

volumes

๋ฐ์ดํ„ฐ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜ธ์ŠคํŠธ(์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šด ์ปดํ“จํ„ฐ)์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹.

  • ์ปจํ…Œ์ด๋„ˆ ์žฌ ์‹คํ–‰์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•จ.

๋ณผ๋ฅจ์€ host์˜ ๊ฒฝ๋กœ ๋˜๋Š” named volumes๋ฅผ ํ•œ ์„œ๋น„์Šค์˜ sub-option์œผ๋กœ ์ง€์ •ํ•˜๋Š” configuration์ด๋‹ค.

์šฐ๋ฆฌ๋Š” single service(์ปจํ…Œ์ด๋„ˆ)์˜ part of a definition์œผ๋กœ host path๋ฅผ ์ง€์ •ํ•  ์ˆ˜์žˆ๊ณ , ์ด ๊ฒฝ์šฐ์—๋Š” top level volumes ํ‚ค์—๋Š” ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๊ฐ€ multiple services๋“ค์„ ๋ชจ๋‘ ์ด์šฉํ•˜๋Š” volume ์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ์—๋Š” ๊ทธ named volume์„ top level volumes ์— ๋ช…์‹œ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

version: "3.9"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data"

volumes:
  mydata:
  dbdata:
  • short syntax
    volumes:
      # Just specify a path and let the Engine create a volume
      - /var/lib/mysql

      # Specify an absolute path mapping
      - /opt/data:/var/lib/mysql

      # Path on the host, relative to the Compose file
      - ./cache:/tmp/cache

      # User-relative path
      - ~/configs:/etc/configs/:ro

      # Named volume
      - datavolume:/var/lib/mysql

0๊ฐœ์˜ ๋Œ“๊ธ€