[Docker] 13. Docker Compose
카테고리: DOCKER
태그: docker
[Docker] 13. Docker Compose
🔔 Docker Compose 이란?
여러 컨테이너를 모아서 관리하기 위한 툴로, 「docker-compose.yml」라는 파일에 컨테이너의 구성 정보를 정의함으로써 동일 호스트상의 여러 컨테이너를 관리할 수 있다.
컨테이너의 구성 정보를 YAML 형식의 파일로 관리할 수 있으므로, 지속적 디플로이나 지속적 인티그레이션 프로세스에 있어서 자동 테스트를 할 때의 환경 구축에도 이용 가능하다.
🔔 Docker Compose 개요
Compose 정의 파일에는 관리하고 싶은 컨테이너의 서비스(services:), 네트워크(networks:), 볼륨(volumes:)을 정의한다.
또한 Compose 정의 파일은 버전에 따라 기술할 수 있는 항목이 다르며, Compose 정의 파일의 버전은 Docker Engine의 버전과 관계가 있다.
- 버전 정보 및 작성 방법 : https://docs.docker.com/compose/compose-file/compose-file-v3/
# 버전을 지정
version: "3.9"
#서비스 정의
services:
webserver:
image: ubuntu
ports:
- "80:80"
networks:
- webnet
redis:
image: redis
networks:
- webnet
#네트워크 정의
networks:
webnet:
# 데이터 볼륨 정의
volumes:
data-volume:
(1) 이미지 지정
컨테이너의 바탕이 되는 베이스 이미지를 지정
services:
webserver:
image: ubuntu
services:
webserver:
image: ubuntu:kinetic-20230217
-
webserver라는 이름의 컨테이너의 베이스 이미지를 centos: 7으로 지정
-
이미지를 로컬 환경에 있으면 그것을 사용하고, 없으면 도커 허브에서 다운로드
-
이미지의 태그를 지정하지 않은 경우 최신 버전(latest)이 다운로드
(2) 이미지 빌드
Dockerfile로 이미지를 그술하고 그것을 자동으로 빌드하여 베이스로 지정할 때 사용
services:
webserver:
build: .
services:
webserver:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
projetno: 1
user: choi
-
build : Dockerfile의 경로
-
context : Dockerfile이 있는 디렉터리의 경로 또는 리포지토리의 URL을 지정
-
dockerfile : 해당 도커 파일의 이름을 지정
-
args: Dockerfile의 ARG 명령과 비슷한 명령으로, docker-compose 명령이 실행되는 구간에서 사용하는 변수
(a) 예시
【디렉터리 구성】

【파일 내용】
# docker-compose.yml
services:
webserver:
build: .
# Dockerfile
FROM ubuntu
【컨테이너 생성】
$ docker-compose up --build Building webserver
Step 1/1 FROM ubuntu
---> 747cb2d60bbe
Successfully built 747cb2d60bbe
Successfully tagged sample_webserver:latest
Starting sample_webserver_1
Attaching to sample_webserver_1
(3) 컨테이너 안에서 작동하는 명령 - command, entrypoint
Dockerfile의 명령과 같음, 베이스 이미지에 지정되어 있을 때는 그 명령을 덮어쓴다.
services:
webserver:
image: centos:7
command: /bin/bash -c "yum update && yum install net-tools"
services:
webserver:
image: centos:7
entrypoint: cat /etc/hosts
# 또는
entrypoint:
- /bin/cat
- /etc/hosts
(4) 컨테이너 간 연결 - links
최신 버전 부터는 links를 작성하지 않아도, 서비스 이름으로 다른 컨테이너에 접근할 수 있다.
(5) 컨테이너 간 통신 - ports, expose
ports : 호스트 머신에 컨테이너를 공개하는 포트 지정
-
“호스트의 Port번호:컨테이너 Port번호”를 지정
-
컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트의 랜덤한 값으로 설정
services:
webserver:
image: httpd:latest
ports:
- "80"
- "8000:8000"
- "127.0.0.1:8001:8001"
# 또는
- target: 8080 ## 컨테이너 내부 포트
published: 8080 ## 호스트OS에서 공개할 포트
protocol: tcp ## 포트 프로토콜
mode: host ## host각 노드에 호스트 포트를 게시하거나 ingress로드 밸런싱할 스웜 모드 포트에 사용
expose : 호스트OS에 포트를 공개하지 않고, 컨테이너만 포트를 공개, 호스트OS와 직접 연결되지 않고 링크등으로 연결된 컨테이너-컨테이너간의 통신만이 필요한 경우 등에 사용 됩니다.
services:
webserver:
image: httpd:latest
expose:
- "8000"
(5) 서비스의 의존관계 정의 - depends_on
web 컨테이너를 시작하기 전에 DB와 Redis 컨테이너를 시작하고 싶을 때 사용
- 주의할 점은 depends_on은 컨테이너의 시작 순서만 제아할 뿐, 컨테이너상의 애플리케이션이 이용 가능해 질 때까지 기다리고 제어를 하지 않는다.
version: "3.9"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
(6) 컨테이너 환경변수 지정 - environment, env_file
컨테이너 안의 환경변수를 지정할 때 environment, 파일로 읽어 들이 때 env_file
version: "3.9"
services:
web:
build: .
environment:
- RACK_ENV=devlop
- SHOW=ture
# 또는
environment:
RACK_ENV: devlop
SHOW: ture
version: "3.9"
services:
web:
build: .
env_file:
- ./common.env
- /apps/web.env
(7) 컨테이너 정보 설정 - container_name, labels
container_name : 컨테이너에 붙일 이름을 지정 (단, 고유해야 함)
container_name: my-web-container
labels : 이미지 구성이나 컨테이너, 볼륨, 네트워크간의 관계에 주석을 달거나 할 때 사용
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"
(8) 컨테이너 데이터 관리 - volumes
컨테이너에 볼륨을 마운트할 때 volumes를 지정
- 호스트에서 마운트할 경로를 지정하려면 “호스트의 디렉터리:컨테이너 디렉터리”
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
# 읽기 전용 볼륨 지정
volumes:
- ~/configs:/etc/configs/:ro
# 다른 컨테이너로부터 모든 볼륨을 마운트할 때는 volume_from에 컨테이너명을 지정한다
# 볼륨 마운트 지정
volumes_from:
- log
댓글 남기기