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/
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/
Reference
'Container > Docker Compose' 카테고리의 다른 글
도커 컴포즈 주요 명령어 정리 (0) | 2023.08.12 |
---|---|
도커 컴포즈 환경변수 설정 방법 (0) | 2023.08.11 |
도커 컴포즈 및 스택 yml 파일 옵션 정리5 - 기타옵션 (0) | 2021.11.06 |
도커 컴포즈 및 스택 yml 파일 옵션 정리4 - configs / secrests (0) | 2021.11.06 |
도커 컴포즈 및 스택 yml 파일 옵션 정리3 - networks (0) | 2021.11.06 |