IT/기초 지식

[Docker] docker-compose.yml 작성법 (항목 설명)

개발자 두더지 2021. 9. 15. 22:24
728x90

 docker-compose.yml에 정의되어 있는 각각의 서비스는 특정의 image 혹은 build를 지정할 필요가 있다. 그 외의 키는 옵션이므로, docker run 커맨드 라인과 유사하다.

 docker run과 동일하게, Dockerfile로 지정된 옵션이 디폴트가 된다(예: CMD, EXPOSE, VOLUME, ENV). 그러므로, docker-compose.yml으로 다시 정의할 필요가 없다.

 

 

image


 태그나 image ID의 일부이다. 로컬이라도 리모트라도 관계없다. 로컬에 존재하지 않으면, Compose는 이미지를 pull한다.

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

 

 

build


 Dockerfile의 어떤 디렉토리 패스를 지정한다. 이 값이 상응하는 경로로 지정된 경우 yml파일 자체가 있는 장소로부터의 상대패스가 된다. 또한, 디렉토리는 내용 구축을 위해, Docker 데몬에도 보내진다.

 Compose는 구축시, 생성된 이름을 태그 붙여 이후의 이미지에도 사용된다.

build: /path/to/build/dir

 

 

dockerfile


대체용 Dockerfile이다. Compose는 구축시에 지정된 파일을 사용한다.

dockerfile: Dockerfile-alternate

 

 

command


디폴트의 커맨드를 덮어쓴다.

command: bundle exec thin -p 3000

 

 

links


컨테이너를 다른 서비스에 링크한다. 서비스명과 링크/에일리어스(alias)를 지정할 수 있을 뿐만 아니라, 혹은 서비스명(에일리어스로써도 사용될 수 있다)에서도 지정할 수 있다.

links:
 - db
 - db:database
 - redis

 에일리어스명을 기재하면 컨테이너 내의 /ect/hosts의 안에 서비스명이 추가 된다. 예를 들면 다음과 같다.

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

 환경 변수도 작성된다. 

 

 

external_links


 이 docker-compose.yml 이나, 특히 Compose 밖에 있는 공유 내지는 공통 서비스가 제공하는 컨테이너와 링크한다. external_links는 컨테이너명이나 링크/에일리어스(CONTAINER:ALIAS)의 지정시에는 links와 비슷한 의미를 가지고 있다.

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

 

 

extra_hosts


호스트명의 맵핑을 추가한다. docker 클라이언트의 --add-host 파라미터와 동일한 값이다.

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

 입력한 IP주소와 호스트명은 컨테이너 내의 /etc/hosts에 서비스와 함께 기재된다. 예를 들면 다음과 같다.

162.242.195.82  somehost
50.31.209.229   otherhost

 

 

ports


 포트를 공개(expose)한다. 호스트와 포트를 지정(호스트:컨테이너)하던가, 컨테이너의 포트만 지정한다(호스트쪽의 포트는 랜덤으로 선택된다).

 메모: 포트의 맵핑에 호스트:컨테이너의 형식을 사용할 때, 컨테이너의 포트가 60이하의 경우는 에러가 표시된다. 이것은 YTML가 xx:yy형식의 60진수로 인식하기 때문이다. 따라서 항상 명확한 포트의 맵핑을 문자열로 지정하는 것을 추천한다.

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

 

 

expose


 호스트 머신상에 포트를 노출(expose)하지만, 공개되지는 않는다. 링크된 서비스만 액세스 할 수 있다. 내부 포스만 지정할 수 있다.

expose:
 - "3000"
 - "8000"

 

 

volumes


패스와 볼륨으로써 마운트한다. 옵션으로써 호스쪽의 경로를 지정 (호스트:컨테이너)하거나, 액세스 모드를 지정한다(호스트:컨테이너:ro).

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

 

 

volumes_from


 다른 서비스나 컨테이너로부터 모든 볼륨을 마운트한다.

volumes_from:
 - service_name
 - container_name

 

 

environment


 환경변수를 추가한다. 배열이나 dictionary(YAML의 배쉬)를 사용할 수 있다.

 키뿐인 환경변수는 Compose 실행시에 사용되는 값에 해당하므로, 비밀로하고 싶은 값이나 호스트 고유의 값을 지정하기 쉽다.

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

 

 

env_file


파일로부터 환경변수를 추가한다. 리스트에는 1개의 값이다. Compose로 파일을 docker-compose -f 파일명으로 지정한 경우는, env_file의 경로는 그 파일이 있는 디렉토리로부터의 상대경로가 된다.

 environment로 지정한 환경변수는 이러한 값에 덮어쓴다.

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

compose는 환경변수로 지정된 파일의 각 행이 변수 = 값의 형식으로 간주한다. #`으로 시작하는 행은 무시되어(예:코멘트), 빈 여백의 행으로 다뤄진다.

# 환경변수 Rails/Rack 의 설정
RACK_ENV=development

 

 

extends


 현재 파일이나 다른 파일로부터 다른 서비스를 확장한다. 옵션으로 설정을 덮어쓴다.

 아래는 간단한 예이다. 2개의 파일 common.yml와 development.yml가 있다. extends를 사용해 development.yml의 서비스를 정의한다. 여기서의 서비스란 common.yml에서 정의되어 있는 것이다:

#common.yml

webapp:
  build: ./webapp
  environment:
    - DEBUG=false
    - SEND_EMAILS=false
#development.yml

web:
  extends:
    file: common.yml
    service: webapp
  ports:
    - "8000:8000"
  links:
    - db
  environment:
    - DEBUG=true
db:
  image: postgres

 여기서는 development.yml의 web서비스는 common.yml의 webapp서비스의 설정을 계승한다. build, environmet의 키와 ports와 links 설정을 추가한다. 새로운 값을 가진 환경변수(DEBUG)가 정의되어있으면, 기존의 것이 덮어써진다. 다른 환경변수(SEND_EMAILS)는 그대로이다.

 

 

lables


 Docker labels를 사용해 컨테이너에 메타 데이터를 추가한다. 배열이나 배쉬가 쓸 수 있다. 역으로 DNS의 개념을 사용해, 다른 소프트웨어가 사용하는 라벨과 충돌하지 않도록 하는 것을 추천한다.

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""

labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

 

 

log driver


 dockler 실행시의 옵션으로 --log-driver를 사용해, 로그 기록용의 드라이버를 지정한다. 현시점에서 사용할 수 있는 값은 json-file, syslog, none이다. 잠시후면 Docker 엔진에 드라이버가 추가되어, 목록이 바뀔 가능성이 있다.

 디폴트의 값은 json-file이다.

log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"

 

 

net


 네트워킹, 모드를 지정한다. Docker 클라이언트로 --net 파라미터를 지정했을 때와 동일하다.

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

 

 

pid


pid: "host"

 PID 모드를 host PID 모드에 세팅한다. 무엇보다 컨테이너와 포스트/오퍼레이팅/시스템상의 PID 주소 곤간을 공유한다. 베어 메탈 머신의 이름 공간등으로, 다른 컨테이너에 액세스, 조작할 수 있도록 컨테이너 실행시에 그 플래그를 사용한다.

 

 

dns


 DNS 서버를 설정한다. 1개 혹은 리스트로 기재한다.

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

 

 

cap_add, cap_drop


 컨테이너의 성능을 추가하거나 낮추거나한다. man 7 capabilities로 상세 내용을 볼 수 있다.

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

 

 

dns_search


 DNS의 search 도메인을 설정한다. 1개 혹은 리스트로 기재한다.

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

 

 

devices


디바이스. 맵핑 목록이다. Docker 클라이언트로 작성시의 옵션 --device와 동일한 형식의 사용법이다.

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

 

 

security_opt


 각각의 컨테이너마다 디폴트의 라벨링, 스키마를 덮어쓴다.

  security_opt:
    - label:user:USER
    - label:role:ROLE

 

 

working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares, cpuset, read_only


 각각 단일의 값을 가진 것으로, docker run와 쌍을 이룬다.

cpu_shares: 73
cpuset: 0,1

working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql

hostname: foo
domainname: foo.com

mem_limit: 1000000000
privileged: true

restart: always

stdin_open: true
tty: true
read_only: true

참고자료

https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa

728x90