👉 이 게시글은 도커 / 쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈 강의를 바탕으로 작성되었습니다.
도커 컴포즈는 하나의 설정파일로 여러 컨테이너를 운용하게 할 수 있게 해주는 도커 컴포넌트 중 하나이다. 여러 개의 컨테이너를 정의하고 실행하는 역할을 하며, 설정 파일인 yaml
을 기반으로 동작한다.
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
다음과 같이 버전이 정상적으로 출력되면 설치가 완료된 것이다.
YAML
파일은 도커 컴포즈에 관한 설정을 담고 있다. Yet Another Markup Language에서 YAML Ain't Markup Language로 의미가 변화하였다. json
이나 xml
과 같이 시스템간 데이터 교환을 위해 만들어졌다. yaml 파일은 다음과 같은 특징을 가지고 있다.
*.yml
, *.yaml
의 형식을 갖고 있다.Docker Compose를 이용하기 위해 다음 예제를 docker-compose.yml
로 사용해보자. 해당 파일을 통해 설치형 클라우드인 Nextcloud와 관계형 DB인 postgresql 컨테이너를 함께 구성할 수 있다.
$ nano docker-compose.yml
version: "3.9"
services:
db:
image: postgres:alpine
environment:
- POSTGRES_PASSWORD=nextcloud
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
restart: always
volumes:
- db_data:/var/lib/postgresql/data
nc:
image: nextcloud:apache
environment:
- POSTGRES_HOST=db
- POSTGRES_PASSWORD=nextcloud
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
ports:
- "80:80"
restart: always
volumes:
- nc_data:/var/www/html
depends_on:
- db
volumes:
nc_data:
db_data:
해당 파일 경로에서 docker-compose up 명령을 수행하면, 다음과 같이 컨테이너가 구동된다.
$ sudo docker-compose up
가상머신 또는 서버의 IP주소로 웹브라우저에 접속하면 다음과 같이 Nextcloud의 관리자 계정을 생성하는 창이 나온다. 아이디와 비밀번호를 입력하고 설치 완료
버튼을 클릭하자.
계정 생성이 완료되었으면 다음과 같이 대시보드가 나오게 되는데, 이제 해당 컨테이너를 구글 드라이버나 네이버 클라우드처럼 개인적으로 사용할 수 있다.
Docker Compose에서 사용되는 명령은 기존에 사용하던 Docker 명령어와 유사하나, 기능적으로 차이가 있는 부분이 있기 때문에 혼동하지 않도록 주의해야 한다.
명령어는 기본적으로 docker-compose.yml
파일이 위치한 경로에서 실행한다.
$ sudo docker-compose up
yaml
파일에 정의된 여러 개의 컨테이너를 구동한다. 컨테이너의 이름은 별도로 생성하지 않으면 <yaml 파일이 위치한 디렉토리명>_<서비스명>_<번호>
의 형태로 정의된다.
옵션 | 기능 |
---|---|
-d, --detach | 컨테이너를 백그라운드에서 실행한다. |
--build | 컨테이너를 생성하기 전에 이미지를 빌드한다. |
--no-build | 실행 대상 이미지가 존재하지 않더라도 빌드하지 않는다. |
--abort-on-container-exit | 여러 컨테이너들 중 하나라도 종료되면 모두 종료된다. (--detach와 함께 사용할 수 없음) |
$ sudo docker-compose ps
docker ps
혹은 docker container ls
를 사용해도 실행중인 컨테이너를 조회할 수 있으나, docker-compose ps
를 통해 조회했을 때와 출력 양식에서 약간의 차이가 있다.
옵션 | 기능 |
---|---|
-q, --quiet | 컨테이너 ID만 출력한다. |
-services | 정의된 서비스명을 출력한다. |
-a, --all | 종료된 컨테이너를 포함한 모든 컨테이너를 출력한다. |
$ sudo docker-compose run <서비스명> <실행 대상 명령>
version
services
services:
db:
...
nc:
...
services는 컨테이너에서 실행할 서비스를 정의한다.
image
services:
db:
image: postgres:alpine
...
nc:
image: nextcloud:apache
...
environment
services:
db:
...
nc:
environment:
- POSTGRES_HOST=db
- POSTGRES_PASSWORD=nextcloud
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
...
restart
컨테이너를 어떤 상황에서 다시 시작할지를 결정하는 요소이다. default값은 no
이며, 상황에 따라 다른 값을 옵션으로 줄 수 있다.
옵션 | 기능 |
---|---|
always | 컨테이너가 중지된 경우 무조건 다시 실행한다. |
on-failure | 구동이 실패한 경우 다시 실행한다. |
unless-stopped | 사용자가 중지시키는 경우를 제외한 모든 경우에 다시 시작한다. |
volumes
컨테이너와 함께 삭제되면 안되는 데이터를 호스트에 연동하여 저장하도록 한다.
ports
컨테이너와 호스트를 연결할 포트를 설정한다. 다만 주의할 점은 yaml 파일에서는 xx:yy
형식의 입력을 시간으로 인식하기 때문에 따옴표를 붙여 "xx:yy"
형식으로 정의하여야 한다.
services:
db:
...
nc:
ports:
- "80:80"
expose
expose
로 지정된 포트를 통해 통신이 가능하지만, 호스트 OS에서의 접근은 불가능하고 동일한 네트워크 대역에 위치한 컨테이너와의 통신만 가능하다. services:
db:
...
expose:
- 5432
...
nc:
...