도커 컴포즈
여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다. 매번 run 명령어에 옵션을 설정해 CLI로 컨테이너를 생성하기보다는 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리할 수 있다면 더욱 편리하다.
이를 위해 도커 컴포즈는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다. 도커 컴포즈는 여러 개의 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작한다.
도커 컴포즈 설치
도커 컴포즈는 따로 설치를 해줘야 한다. 아래 명령어로 curl 을 통해 설치를 하고 chmod +x로 실행권한을 부여한다.
sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
도커 컴포즈는 yaml 파일을 작성해서 사용한다. 아래 예제는 apache 웹서버와 mysql 데이터베이스를 생성하는 docker-compose.yml 파일이다.
version: '3.0'
services:
web:
image: develone/composetest:web
ports:
- "80:80"
links:
- mysql:db
command: apachectl -DFOREGROUND
mysql:
image: develone/composetest:mysql
command : mysqld
YAML 파일에서 들여쓰기할 때 탭(Tab)은 도커 컴포즈가 인식하지 못하므로 2개의 공백(Space)을 사용해 하위 항목을 구분해야 한다.
해당 yaml 파일로 컨테이너를 생성하려면 docker-compose up -d 명령어로 컨테이너를 생성해야 한다.
도커 컴포즈 파일 설명
version
YAML 파일 포맷의 버전을 나타낸다. 도컴 컴포즈 1.8은 버전 2를, 도커 컴포즈 1.9는 버전 2.1을, 도컴 컴포즈 1.10은 버전 3.0을 사용한다.
services
생성될 컨테이너들을 묶어놓은 단위이다. 서비스 항목 아래에는 각 컨테이너에 적용될 생성 옵션을 지정한다.
web, mysql
생성될 서비스의 이름이다. docker run에서 사용하는 옵션과 동일하게 image, ports, links, command 등을 정의할 수 있다.
하나의 프로젝트는 여러 개의 서비스로 구성되고, 각 서비스는 여러 개의 컨테이너로 구성된다. docker-compose scale 명령어로 서비스에 여러 개의 컨테이너가 존재할 수 있게 할 수 있다.
docker-compose up 명령어 끝에 서비스 이름을 입력해 docker-compose.yml 파일에 명시된 특정 서비스의 컨테이너만 생성할 수 있다. docker-compose run 명령어로 컨테이너를 생성할 수도 있다.
생성된 프로젝트는 docker-compose down 명령어로 삭제할 수 있다. 프로젝트는 삭제하면 서비스의 컨테이너 또한 전부 정지된 뒤 삭제된다.
도커 컴포즈는 기본적으로 현재 디렉터리의 이름으로 된 프로젝트를 제어한다. 그러나 docker-compose의 -p 옵션에 프로젝트 이름을 사용해 제어할 프로젝트의 이름을 명시할 수도 있다.
도커 컴포즈 활용
기존에 사용하던 run 명령어를 YAML 파일로 변환하는 것이 도커 컴포즈 사용법의 대부분이다.
YAML 파일은 크게 버전 정의, 서비스 정의, 볼륨 정의, 네트워크 정의의 4가지 항목으로 구성된다.
도커 컴포즈는 기본적으로 현재 디렉터리 또는 상위 디렉터리에서 docker-compose.yml 이라는 이름의 YAML 파일을 찾아서 컨테이넌 생성하지만 -f 옵션을 사용하면 yml 파일의 위치와 이름을 지정할 수 있다.
버전 정의
YAML 파일 포맷에는 버전 1, 2, 2.1, 3이 있지만 최신 버전의 도커 컴포즈를 사용하는 것이 좋음으로 버전 3으로 사용하는것이 권고된다
version: '3.0'
서비스 정의
서비스는 도커 컴포즈로 생성할 컨테이너 옵션을 정의한다. 주요 컨테이너 옵션만 설명할 것이기 때문에 설명하지 않은 서비스 항목에 대해서는 공식 문서(https://docs.docker.com/compose/compose-file/)에서 참고할 수 있다.
- image
서비스의 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정한다.
- links
docker run 명령어의 --link와 같다.
- environment
docker run 명령어의 --env, -e 옵션과 동일하다
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE_NAME=mydb
OR
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE_NAME: mydb
- command
컨테이너가 실행될 때 수행할 명령어를 설정하며, docker run 명령어의 마지막에 붙는 커맨드와 같다. Dockerfile의 RUN과 같은 배열 형태로도 사용할 수 있다.
command: apachectl -DFOREGROUND
OR
command: [apachectl, -DFOREGROUND]
- depends_on
특정 컨테이너에 대한 의존 관계를 나타내며 이 항목에 명시된 컨테이너가 먼저 생성되고 실행된다
services:
web:
image: develone/composetest:web
depends_on
- mysql
mysql:
image: develone/composetest:mysql
mysql 컨테이너가 먼저 생성되고 web 컨테이너가 생성이 된다.
- ports
docker run 명령어의 -p 옵션과 같으며 서비스의 컨테이너를 개방할 포트를 설정한다.
- build
build 항목에 정의된 도커파일에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 설정한다. 새롭게 빌드될 이미지의 이름은 image 항목에 정의된 이름으로 설정된다.
services:
web:
build: ./composetest
image: develone/composetest:web
- extends
다른 YAML 파일이나 현재 YAML 파일에서 서비스 속성을 상속받게 설정한다.
### extend-compose.yml
version: '3.0'
services:
extend_web:
image: ubuntu:14.04
ports:
- "80:80"
### docker-compose.yml
version: '3.0'
services:
web:
extends:
file: extend-compose.yml
service: extend_web
web 서비스가 extend-compose.yml 의 extend_web 서비스의 옵션을 물려받는다.
도커 컴포즈 네트워크
YAML 파일에 네트워크 항목을 정의하지 않으면 도커 컴포즈는 프로젝트별로 브리지 타입의 네트워크를 생성한다. 생성된 네트워크의 이름은 {프로젝트 이름}_default로 설정되며, docker-compose up 명령어로 생성되고 docker-compose down 명령어로 삭제된다.
'Docker' 카테고리의 다른 글
도커 스웜 (0) | 2021.09.20 |
---|---|
도커 데몬 모니터링 (0) | 2021.09.18 |
도커 파일 (0) | 2021.09.12 |
도커 이미지 관리 (0) | 2021.09.11 |
컨테이너 자원 할당 제한 (0) | 2021.09.11 |