Docker Compose 작성 방법 및 명령어 정리
Docker Compose
- 여러 컨테이너를 모아서 관리하기 위한 툴
- docker-compose.yml 파일에 컨테이너의 구성 정보를 정의함으로써 동일 호스트상의 여러 컨테이너를 일괄적으로 관리 할 수 있다.
- yml 파일에 기술하는 version 은 docker engine 버전에 따라 달라진다.
이미지 지정(image)
- Docker 컨테이너의 바탕이 되는 베이스 이미지를 지정할 때 사용 한다. image 에는 이미지의 이름 또는 이미지 ID 중 하나를 지정한다.
- 베이스 이미지는 로컬 환경에 있으면 그것을 사용하고, 로컬 환경에 없으면 Docker Hub 로부터 자동으로 다운로드 한다.
- 이미지의 태그를 지정하지 않은 경우는 최신 버전(latest)이 다운로드 된다.
이미지 빌드(build)
- 이미지의 작성을 Dockerfile 에 기술 하고 그것을 자동으로 빌드하여 베이스 이미지로 지정할 때는 build 를 지정한다. build 에는 Dockerfile 의 파일 경로를 지정 한다.
- Docker 이미지를 빌드할 때에 인수를 args 로 지정할 수 있다. bool 연산자를 사용하는 경우는 따옴표로 둘러싸야 한다.
-
예시)
services: webserver: build: args: projectno: 1 user: asa
컨테이너 안에서 작동하는 명령 지정(command/entrypoint)
- 베이스 이미지에 지정되어 있을 때는 그 명령을 덮어쓴다.
컨테이너 간 연결(links)
-
예시)
links: - logserver - logserver:1og01
컨테이너 간 통신(ports/expose)
- 컨테이너가 공개하는 포트는 ports 로 지정한다.
- ‘호스트 머신의 포트 번호:컨테이너의 포트 번호’를 지정하거나, 컨테이너의 포트 번호만 지정한다. 또한 컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트는 랜덤한 값으로 설정된다.
- YAML은 xx:yy 형식을 시간으로 해석하므로 포트 번호를 설정할 때는 반드시 겹따옴표로 둘러싸서 문자열을 정의해야 한다.
-
예시)
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
- 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개할 때는 expose를 지정한다.
서비스의 의존관계 정의(depends_on)
- 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해 질 때까지 기다리고 제어를 하지 않는다.
- 의존관계에 있는 데이터베이스 서비스의 준비가 끝날 때까지 기다리는 것은 아니기 때문에 애플리케이션 측에서 이에 대한 대책을 세워야 한다.
컨테이너 환경변수 지정(environment/env_file)
- 배열 형식 또는 해시 형식으로 지정 가능
-
예시)
# 배열 형식으로 지정 environment: - HOGE=fuga - FOO # 해시 형식으로 지정 environment : HOGE: fuga FOO:
-
설정할 변수가 많을 경우에는 파일을 지정 할 수 있다.
HOGE-fuga FOO=bar
-
위의 내용을 yml 파일에 다음과 같이 기술한다.
env_file : envfile명
-
파일명을 여러개 지정할 수도 있다.
env_file: - ./envfile1 - ./app/envfile2 - /tmp/envfile3
컨테이너 데이터 관리(volumes/volumes_from)
- 컨테이너에 볼륨을 마운트할 때 사용한다.
- 호스트 측에서 마운트할 경로를 지정하려면 호스트의 디렉토리 경로:컨테이너의 디렉토리 경로를 지정한다.
-
볼륨 지정 뒤에 ro를 지정하면 볼륨을 읽기 전용으로 마운트 할 수 있다. 설정 파일이 저장된 볼륨 등과 같이 쓰기를 금지하고 싶은 경우에 지정한다.
volumes: - ~/configs:/etc/configs/:ro
- 다른 컨테이너로부터 모든 볼륨을 마운트 할 때는 volumes_from에 컨테이너명을 지정한다.
Docker Compose 의 주요 서브 명령
서브 명령 | 설명 |
---|---|
up | 컨테이너 생성/시작 |
ps | 컨테이너 목록 표시 |
logs | 컨테이너 로그 출력 |
run | 컨테이너 실행 |
start | 컨테이너 시작 |
stop | 컨테이너 정지 |
restart | 컨테이너 재시작 |
pause | 컨테이너 일시 정지 |
unpause | 컨테이너 재개 |
port | 공개 포트 번호 표시 |
config | 구성 확인 |
kill | 실행 중인 컨테이너 강제 정지 |
rm | 컨테이너 삭제 |
down | 리소스 삭제 |
여러 컨테이너 생성(up)
docker-compose up [옵션] [서비스명 .]
옵션 | 설명 |
---|---|
-d | 백그라운드에서 실행한다. |
--no-deps | 링크 서비스를 시작하지 않는다. |
--build | 이미지를 빌드 한다. |
--no-build | 이미지를 빌드하지 않는다. |
-t, --timeout | 컨테이너의 타임아웃을 초로 지정(기본10초)한다. |
--scale SERVICE=서비스 수 | 서비스 수를 지정한다. |
- 작성한 docker-compose.yml을 바탕으로 여러 개의 컨테이너를 생성하여 시작할 때 쓰는 명령어
-
예를 들어 yml 파일에 servera와 serverb라는 2개의 정의가 있고, servera의 컨테이너를 10개, serverb의 컨테이너를 20개 시작시킬 때 다음과 같이 지정할 수 있다.
docker-compose up --scale server_a=10 --scale server_b=20
여러 리소스의 일괄 삭제(down)
docker-compose down [옵션]
옵션 | 설명 |
---|---|
--rmi all | 모든 이미지를 삭제 |
--rmi local | 커스텀 태그가 없는 이미지만 삭제 |
-v, --volumes | Compose 정의 파일의 데이터 볼륨을 삭제 |
- compose 정의 파일을 바탕으로 docker-compose up 명령으로 생성한 컨테이너나 Docker 이미지를 모아서 삭제할 때 사용하는 명령어
- 실행중인 컨테이너를 정지시키고, Docker 이미지, 네트워크, 데이터 볼륨을 일괄적으로 삭제한다.