320x100
320x100

Compose file (docker-compose.yml)

: 여러 도커 컨테이너를 연동시켜 한 번에 관리하는 도커 컴포즈 구성 정보를 정의하는 파일

: 컴포즈 파일만으로 DockerFile을 대체할 수는 없음

 

- 도커 컴포즈

: 여러 컨테이너가 하나의 애플리케이션을 구성할 때 관리의 편의성 제공

: 싱글 호스트 환경에서 주로 사용하며, 멀티 호스트일 경우 컨테이너 오케스트레이션을 사용

 

- 컴포즈 파일의 구조

: yml 형식으로 작성하며 image, build, command, links 등의 지시자를 가짐

 

- 예시

version: "3"

services:
  elasticsearch:
    image: "elasticsearch"
  kibana:
    image: "kibana"
  rdb:
    image: "mysql"

 

 

 

 

 

version

: 도커 컴포즈 구성의 버전

: 컴포즈 파일 최상단에 위치하며, 버전에 따라 사용할 수 있는 기능이 제한됨

: 현재 3.8 버전이 가장 최신 버전

version: "버전"

version: "3.8"

 

 

 

 

 

services

: 컨테이너에서 실행할 서비스에 대해 정의

: 관련있는 컨테이너를 서비스라는 단위로 묶어서 사용

services:
  FrontEnd:
  Application:
  DB:

 

 

 

 

 

build

: 컨테이너로 빌드할 호스트에 존재하는 DockerFile 

version: "3.8"

services:
  # DockerFile이 존재하는 호스트내 디렉터리의 경로 혹은 URL
  webServer1:
    build: .

  # DockerFile이라는 파일 대신 다른 이름의 도커파일을 명시
  webServer2:
    build:
      context: ./dir
      dockerfile: 2mukee-dockerfile
      # 도커 파일 빌드 시 전달할 파라미터 (ARG buildno 라는 항목이 DockerFile에 있는 경우)
      args:
        - buildno: 1
      # 
      cache_from:
        - alpine: latest
        - corp/web_app:3.14

 

 

 

 

 

image

: Docker 컨테이너의 기반이 되는 베이스 이미지를 지정

: 빌드 시 도커 이미지 레지스트리인 dockerhub에서 이미지를 설치하여 빌드

webserver:
  image: docker/dockersample:1.0

 

 

 

 

 

command

: 컨테이너 내에서 동작하는 명령 실행

: 도커 파일 내의 CMD 지시자가 있는 경우 Override(덮어쓰기)를 수행

webserver:
  image: docker/dockersample:1.0
  command: /bin/bash init.sh

 

 

 

 

 

entrypoint

: 컨테이너가 실행되기 시작했을때 실행할 명령

: 도커 파일 내에 ENTRYPOINT 지시자가 있는 경우 이를 Override(덮어쓰기) 수행

webserver:
  image: ubuntu
  entrypoint: /proj/init.sh
  
was:
  image: java:8-jdk
  entrypoint:
    - java
    - -cp
    - zookeepter-fat.jar
    - com.example.generator

 

 

 

 

 

links

: 컨테이너를 compose 내부의 다른 컨테이너와 연결

: 해당 컨테이너 내 /etc/hosts 파일에 내용이 추가되어 해당 컨테이너에서 다른 컨테이너로 접근 가능

links:
  - db
  - db:database
  - redis
# /etc/hosts
192.168.100.2 db
192.168.100.2 database
192.168.100.3 redis

 

 

 

 

 

external_links

: 컨테이너를 compose 외부에 있는 서비스 혹은 컨테이너와 연결

external_links:
  - db
  - db:database
  - redis

 

 

 

 

 

extra_hosts

: 컨테이너 내의 /etc/hosts에 외부 호스트 정보를 추가

: DNS를 지정할때 특정 아이피를 도메인으로 매핑할때 사용

extra_hosts:
  - "2mukee.com: 192.168.5.10"
  # 리눅스 환경에서는 아래 항목을 추가해야 외부 DNS 서버와 통신 가능
  - "host.docker.internal:host-gateway"
# /etc/hosts
192.168.5.10 2mukee.com

 

 

 

 

 

volumes

: 컨테이너에 볼륨을 마운트

: read only (:ro) / readwrite (:rw)를 붙혀 볼륨의 마운트 형식을 지정

web:
  image: nginx:alpine
  volumes:
    # Named Volumes (경로를 특정 이름으로 설정)
    - type: volume
      source: mydata
      target: /data
      volume:
        nocopy: true
    # Host Volumes (호스트의 볼륨에 bind. source(호스트 볼륨) 유무에 따라 정적 바인드, 동적 바인드로 나뉨)
    - type: bind
      source: ./static_data
      target: /data

db:
  image: postgres:latest
  volumes:
    # Short Syntax (호스트 볼륨:컨테이너 볼륨:모드)
    - "/var/data:/var/run/postgres/postgres.sock:rw"
    - "dbdata:/var/lib/postgresql/data"
    
# Named Volumes (호스트의 /var/lib/docker/volumes/서비스명/볼륨명에 바인딩)
volumes:
  mydata:
  dbdata:

 

 

 

 

 

environment

: 컨테이너 내 환경변수 지정

environment:
  - VERSION=latest
  - FOO
  
environment:
  VERSION: latest
  FOO:

 

 

 

 

 

env_file

: 환경변수를 정의한 파일을 지정

env_file: .env

env_file:
  - ./2mukee.env
  - /opt/what-is-pill.env

 

 

 

 

 

depends_on

: 서비스 간 명시적 종속성 부여

: 설정된 서비스가 먼저 실행되어야 해당 서비스가 실행됨

: 다른 방법으로는 links로 다른 컨테이너와 연결 관계를 설정하면 암시적으로 연결이 필요한 컨테이너를 먼저 구동

version: '3.8'

services:
  web:
    build: .
    depends_on:
      - db
      - redis
 
  redis:
    image: redis:latest
  db:
    image: postgres

 

 

 

 

 

devices

: 컨테이너에서 사용할 호스트의 장치

devices:
  # 호스트:컨테이너
  - "/dev/ttyUSB0:/dev/ttyUSB0"

 

 

 

 

 

ports

: 컨테이너에서 호스트와 통신할 포트 지정

: 호스트 포트를 생략하고 컨테이너 포트만 지정할 경우 호스트의 포트는 랜덤

: 프로토콜을 따로 지정하지 않으면 기본적으로 tcp 통신 수행

# 컨테이너 포트만 지정
mysql:
  image: mysql:5.7
  ports:
    - 3306

# 호스트 포트와 컨테이너 포트를 매핑 (호스트:컨테이너)
mariadb
  image: mariadb:latest
  ports:
    - 3333:3389

 

 

 

 

 

expose

: 호스트에는 노출하지 않고 연결된 서비스끼리만 접근 가능한 포트 지정

: 도커 파일의 EXPOSE와 동일하며 Overried(덮어쓰기)를 수행

mariadb:
  image: mariadb:latest
  expose:
    - 3389/tcp

 

 

 

 

 

dns

: 컨테이너에서 사용할 DNS 서버 지정

dns:
  - 8.8.8.8
  - 9.9.9.9

 

 

 

 

 

dns_search

: 컨테이너에서 사용할 DNS 검색 도메인

dns_search:
  - dc1.example.com
  - dc2.example.com

 

 

 

 

 

network-mode

: 컨테이너의 네트워크 모드 설정

# Docker 브릿지 네트워크 생성
network_mode: "bridge"

# 컨테이너 내에서 호스트의 네트워크를 그대로 사용
network_mode: "host"

# 네트워크 사용안함
network_mode: "none"

# 다른 서비스의 네트워크를 함께 사용
network_mode: "service:[서비스명]"

# 다른 컨테이너의 네트워크를 함께 사용
network_mode: "container:[컨테이너 이름 혹은 아이디]"

 

 

 

 

 

networks

: 네트워크 구성을 위한 최상위 키

: services의 하단에도 들어갈 수 있음

: driver / driver_opts / attachable / enable_ipv6 / ipam / external 등 다양한 옵션

- 참조

: https://docs.docker.com/compose/compose-file/06-networks/

 

Networks top-level element

 

docs.docker.com

 

 

 

 

 

driver

: 네트워크의 방식을 지정

version: "3.8"

services:
  web:
    image: nginx
    ports:
      - "8080:80"
    networks:
      mynet1:
        driver: overlay
 
networks:
  mynet1:

 

 

 

 

 

healthcheck

: 컨테이너들의 모음인 서비스의 상태를 체크

# 컨테이너가 시작되고 40초 부터 1분 30초마다 웹 서버가 10초 이내에 기본 페이지를 제공하는지 확인
# 실패시 재시도 3번

healthcheck:
  test: ["/bin/bash", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

 

 

 

 

 

secrets

: 서비스에서 암호화가 필요한 데이터를 지정

: 컴포트 v3.1 부터 사용 가능

version: "3.8"

services:
  mysql:
    image: mysql
    secrets:
      - mysql_user
      - mysql_password
    environment:
      MYSQL_USER_FILE: /run/secrets/mysql_user
      MYSQL_PASSWORD_FILE: /run/secrets/mysql_password

secrets:
  mysql_user:
    # 파일에서 읽어옴
    file: ./mysql_user.txt
  mysql_password:
    # CLI에서 생성
    external: true

 

 

 

 

 

도커 컴포즈 파일 최상위 키 별 공식문서

: https://docs.docker.com/compose/compose-file/03-compose-file/

 

The Compose file

 

docs.docker.com

 

 

 

 

 

 

Reference

 

[Docker] docker compose 정리 (feat. docker-compose.yml)

💡 본 문서는 'docker compose'에 대해 정리해놓은 글입니다. 간단하게 'docker compose'가 무엇이며, 'docker-compose.yml 파일을 작성하는 방법' 및 '실제 여러 컨테이너를 이용한 서비스 구동'까지 다루고 있

csj000714.tistory.com

 

Compose file version 3 reference

 

docs.docker.com

 

[Docker] Docker Compose 에서 volume 사용 하기

기본 문서는 아래 링크 참고 하시면 됩니다. Reference) https://docs.docker.com/compose/compose-file/#volumes https://docs.docker.com/compose/compose-file/#volume-configuration-reference 두 가지의 syntax 를 제공 하고 있습니다. Sh

jjeong.tistory.com

 

Docker Tip #28: Named Volumes vs Path Based Volumes

There's a couple of ways to save and sync data between a container and your Docker host. Let's compare 2 of them.

nickjanetakis.com

300x250
728x90