[docker-compose] 설정 가이드
docker-compose 설정 가이드
docker-compose는 docker-compose.yml
이라는 Compose 정의 파일에 시스템 안에서 가동하는 여러 서버들의 구성을 모아서 정의함
이정의 파일은 YAML 형식으로 기술
docker-compose.yml
정의 파일의 예
# 버전을 지정(현재 메이저 최신 버전)
version: "3"
# 서비스 정의
services:
webserver:
image: ubuntu
ports:
- "80:80"
networks:
- webnet
redis:
image: redis
networks:
- webnet
# 네트워크 정의
networks:
webnet:
# 데이터 볼륨 정의
volumes:
data-volume:
이미지 지정(image)
베이스 이미지가 로컬에 없으면 Docker Hub로 부터 자동 다운로드 함
이미지 태그를 지정하지 않은 경우는 최신 버전(latest)이 다운로드 됨
이미지 태그를 지정하지 않은 경우
services:
webserver:
image: ubuntu
이미지 태그를 지정한 경우
services:
webserver:
image: asashiho/dockersample:1.0
이미지 빌드(build)
이미지 작성을 Dockerfile
에 기술하고 그것을 자동으로 빌드하여 베이스 이미지로 지정할때는 build를 지정
build에는 Dockerfile
의 파일 경로를 지정
build 지정
docker-compose.yml
파일과 Dockerfile
이 같은 경로에 있을떄 아래와 같이 설정할 수 있다
services:
webserver:
# current directory 설정
build: .
Dockerfile 과 컨텍스트 지정
임의 이름으로 된 Dockerfile
을 빌드 할 때Dockerfile
이 있는 디렉토리의 경로나 Git Repository URL을 context로 지정
services:
webserver:
build:
context: /data
dockerfile: Dockerfile-alternate
빌드 시의 인수 지정
docker 이미지를 build 할 때 인수를 args로 지정할 수 있음
bool 연산자 (true/false/yes/no)를 사용하는 경우는 따옴표로 둘러싸야 됨
변수 값은 docker-compose를 실행하는 머신 위에서만 유효함
services:
webserver:
build:
args:
projectno: 1
user: asa
컨테이너 안에서 작동하는 명령 지정(command/entrypoint)
컨테이너에서 작동하는 명령은 command로 지정
베이스 이미지에서 지정되어 있을 때는 그 명령을 덮어씀
컨테이너 안에서 작동하는 명령 지정
command: /bin/bash
entrypoint 지정
entrypoint:
- php
- -d
- memory_limit=-1
컨테이너 간 연결(links)
다른 컨테이너에 대한 링크 기능을 사용하여 연결하고 싶을때 links를 사용하여 연결할 컨테이너명을 설정
links 항목을 사용하지 않더라도 한 네트워크 안에 있는 서비스끼리 통신을 할 수 있음docker-compose.yml
안에 있는 서비스들은 별도로 지정하지 않으면 하나의 네트워크에 속함
- networking 레퍼런스: https://docs.docker.com/compose/networking/
links:
- logserver
# 컨테이너 명과 별도로 Alias 명을 붙임
- logserver:log01
컨테이너 간 통신(ports/expose)
ports
컨테이너가 외부에 공개하는 포트는 ports로 지정
'호스트 머신의 포트번호: 컨테이너의 포트번호' 를 지정하거나 컨테이너의 포트 번호만 지정
컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트는 랜덤한 값으로 설정됨
공개 포트 지정
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개 할떄 expose를 지정
로그 서버와 같이 호스트 머신에서 직접 액세스하지 않고 웹 애플리케이션 서버 기능을 갖고 있는 컨테이너를 경유해서만 액세스하고 싶은 경우 등에 사용
컨테이너 내부에만 공개하는 포트 지정
expose:
- "3000"
- "8000"
서비스의 의존관계 정의(depends_on)
여러 서비스의 의존관계를 정의할 때는 depends_on을 지정
예를 들어 webserver 컨테이너를 시작하기 전에 db 컨테이너와 redis 컨테이너를 시작하고 싶을 때 아래와 같이 정의
의존관계 지정
services:
webserver:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
※주의: depends_on은 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해 질 때까지 기다리고 제어하지는 않음
컨테이너 환경변수 지정(environment/env_file)
컨테이너 안의 환경변수를 지정할 때는 environment를 지정
YAML 배열 형식 또는 해시 형식 중 하나로 변수를 지정
환경변수 지정
# 배열 형식으로 지정
environment:
- HOGE=fuga
- FOO
# 해시 형식으로 지정
environment:
HOGE: fuga
FOO:
환경 변수 파일에 환경변수를 정의하고 파일을 읽어 올 수 있음docker-compose.yml
과 동일한 디렉토리에 envfile이라는 이름의 파일을 작성 하고 환경변수를 정의 한뒤
env_file 항목에 연결
envfile
HOGE=fuga
FOO=bar
환경변수 파일 읽어 들이기
env_file: envfile
여러 개의 환경변수 파일 읽어 들이기
env_file:
- ./envfile1
- ./app/envfile2
- /tmp/envfile3
애플리케이션 안에서 사용하는 API 키와 같은 비밀정보의 관리는 컨테이너 오케스트레이션 툴의 기능을 사용하는 것을 권장
컨테이너 정보 설정(container_name/labels)
docker-compose로 생성되는 컨테이너에 이름을 붙일 때는 container_name을 지정
docker 컨테이명은 고유해야 하므로 커스텀명을 지정하면 여러 컨테이너로 스케일할 수 없음
컨테이너 명 지정
container_name: web-container
컨테이너 라벨 지정
# 배열 형식으로 지정
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
# 해시 형식으로 지정
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
- 설정한 라벨 확인
docker-compose config
컨테이너 데이터 관리(volumes/volumes_from)
컨테이너에 볼륨을 마운트할때는 volumes를 지정
볼륨 지정
volumes:
- /val/lib/mysql
- cache/:/tmp/cache
읽기 전용 볼륨 지정
볼륨 지정 뒤에 ro를 지정하면 볼륨을 읽기 전용으로 마운트
volumes:
- ~/configs:/etc/configs/:ro
볼륨 마운트 지정
다른 컨테이너로부터 모든 볼륨을 마운트할 때는 volumes_from에 컨테이너명을 지정
volumes_from:
- log