Docker Compose
Docker Compose는 여러 컨테이너들을 모아서 관리하기 위한 도구로써 docker-compose.yml
라는 파일에 컨테이너 구성정보를 정의하여 동일 호스트 상의 여러 컨테이너를 일괄적으로 관리 할 수 있다.
Docker Compose 시작
$ docker-compose up
Docker Compose 컨테이너의 상태
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------
redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
webserver_1 python /opt/imageview/app.py Up 0.0.0.0:80->80/tcp
Docker Compose 컨테이너 정지
컨테이너 정지
$ docker-compose stop
컨테이너 리소스 삭제
$ docker-compose down
Docker Compose 구성 관리
docker-compose.yml
Docker Compose는 (docker-compose.yml
or docker-compose.yaml
)형식의 파일을 이용하여 시스템 안에서 가동하는 여러 서버의 구성들을 정의한다.
Compose 정의 파일에는 관리하고 싶은 컨테이너 서비스(services:
) 네트워크(networks:
) 볼륨(volumes:
)을 정의할 수 있다.
그리고 버전에 따라서 기술할 수 있는 항목이 다르다.
version: '3.3'
버전
Compose 버전 | Docker Engine 버전 |
3.3 | 17.06.0 |
3.2 | 17.04.0 |
3.1 | 1.13.1 |
3.0 | 1.13.0 |
ex)
#docker-compose.yml X
#버전명 지정
version: '3.3'
# 서비스 정의
services:
# WebServer config
webserver:
image: ubuntu
ports:
- "80:80"
networks:
- webnet
# Redis config
redis:
image: redis
networks:
- webnet
# 네트워크 정의
netwokrs:
webnet:
#데이터 볼륨 정의
volumes:
data-volume:
이미지 지정(image)
Docker Container의 베이스 이미지를 지정하려면 image
를 사용하여 이미지 이름 또는 이미지 ID를 지정한다.
이미지는 공식 이미지 뿐만아니라 Docker Hub에 공개되어있는 이미지는 모두 지정가능하다.
이미지 태그를 지정하지 않을 경우
services:
webserver:
image: ubuntu
이미지 태그를 지정한 경우
services:
webserver:
image: asashiho/dockersample:1.0
이미지 빌드(build)
Dockerfile을 작성하고 자동으로 빌드하여 베이스 이미지로 지정할 때 build
를 지정하다.
build에는 Dockerfile의 파일 경로를지정한다.
ㅁ sample
ㅣ
ㄴㅡㅡㅁ docker-compose.yml
ㄴㅡㅡㅁ Dockerfile
- docker-compose.ymal
services: webserver: build: . #current directory
- Dockerfile
FROM ubuntu
$ docker-compose up --build
Creating network "dockertext2_default" with the default driver
Building webserver
Step 1/1 : FROM ubuntu
---> df5de72bdb3b
Successfully built df5de72bdb3b
Successfully tagged dockertext2_webserver:latest
Creating dockertext2_webserver_1 ... done
Attaching to dockertext2_webserver_1
- 임의으로 된 Dockerfile을 빌드할 때는
dockerfile
를 지정한다. - Dockerfile이 있는 디렉토리 경로나 Git URL을
context
로 지정한다.
services:
webserver:
build:
context: /data
dockerfile: Dockerfile-alternate
- Docker 이미지를 빌드 할 때
args(인수)
를 지정할 수 있다.
services:
webserver:
build:
args:
projectno:1
user: aaa
컨테이너 안에서 작동하는 명령 지정(command/entrypoint)
command
는 컨테이너에서 작동할 때 사용한다. 베이스 이미지에서 지정되어있을 땐 그 명령을 덮어쓴다.
command: bin/bash
entrypoint를 덮어쓸 수도 있다.
entrypoint:
- php
- -d
- memory:limit=-1
컨테이간 연결(links)
다른 컨테이너에 대한 링크를 연결할 때 links
를 사용한다.
# logserver라는 이름을 가진 컨테이너를 연결 하고 싶을 때.
# 별도의 명칭을 붙이고 싶을 때 서비스명:alias
links:
- logserver
- logserver:log01
컨테이너 간 통신(ports/expose)
ports
는 컨테이너 공개하는 포트를 지정한다.
"<호스트 포트번호>:<컨테이너 포트번호>"
-
"<IP>:<호스트 포트번호>:<컨테이너 포트번호>"
ports:
- "3000"
- "8080:8080"
- "49111:22"
- "127.0.0.1:8081:8081"
expose
는 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개할 때 사용한다.
로그서버와 같이 호스트 머신에 직접 엑세스하지 않고, 애플리케이션 서버 기능을 갖고 있는 컨테이너를 경유해서만 엑세스 하고 싶을 경우 등에 사용.
expose:
- "3000"
- "8000"
서비스의 의존관계 정의(depends_on)
depends_on
: 여러 서비스의 의존관계를 정의할 때 사용
depends_on
은 컨테이너 시작 순서만 제어할 뿐 컨테이너 상의 애플리케이션이 이용 가능해질 때까지 기다리지 제어하지 않는다.- 의존관계에 있는 DB service의 준비가 끝날 때까지 기다리는 것이 아니기 때문에 애플리케이션 측에서는 대응이 필요.
ex) webserver 컨테이너를 시작하기 전 db 컨테이너와 redis컨테이너를 시작하고 싶을 때
services:
webserver:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
컨테이너 환경변수 지정(environment/env_file)
environment
: 컨테이너 안의 환경변수를 지정할 때 사용
## 배열 형식으로 지정
environment:
- HOGE=fuga
- FOO=bar
## 해시 형식으로 지정
environment:
HOGE: fuga
FOO: bar
env_file
: 환경변수 파일을 읽어 사용할 때 사용
envfile
HOGE=fuga
FOO:bar
docker-compose.yaml
#단일 환경변수 호출
env_file: envfile
#여러개 화경변수 호출
env_file:
- ./envfile1
- ./envfile2
- ./envfile3
컨테이너 정보 설정(container_name/labels)
container_name
: Docker Compose로 생성되는 컨테이너에 이름을 붙일 경우에 사용
# 컨테이너명 지정
container_name: web-container
labels
: 컨테이너에 라벨을 붙일 경우 사용
# 배열 형식으로 지정
labels:
- "com.example.desc="Account webapp"
- "com.example.depart="Finance"
# 해시 형식으로 지정
labels:
com.example.desc:"Account webapp"
com.example.depart:"Finance"
컨테이너 데이터 관리(volumes/volumes_from)
volumes
: 컨테이너 볼륨을 마운트 할 때 사용
- 호스트 측에서 마운트 경로를 지정하려면
호스트의 디렉토리 경로:컨테이너 디렉토리 경로
를 지정volumes: # 볼륨지정 - /var/lib/mysql - /cache/:/tmp/cache # 볼륨 지정 뒤 'ro' 를 지정하면 볼륨을 읽기전용으로 마운트 할 수 있다. # 읽기전용 볼륨 지정 - ~/configs:/etc/configs/:ro
Docker Compose를 사용한 컨테이너 운용
Docker Compose 버전 확인
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
Docker Compose 기본 명령
$ docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]
서브명령(Commands)
서브명령 | 설명 |
up | 컨테이너 생성/시작 |
ps | 컨테이너 목록 표시 |
logs | 컨테이너 로그 출력 |
run | 컨테이너 실행 |
start | 컨테이너 시작 |
stop | 컨테이너 정지 |
restart | 컨테이너 재시작 |
pause | 컨테이너 일시 정지 |
unpause | 컨테이너 재개 |
port | 공개 포트번호 표시 |
config | 구성 확인 |
kill | 실행중인 컨테이너 강제 정지 |
rm | 컨테이너 삭제 |
down | 리소스 삭제 |
- current directory 이외의 장소에 docker-compose.yaml 파일 이 있을 경우 -f
옵션을 통해 파일 경로를 지정하여 실행할 수 있다.
$ docker-compose -f ./sample/docker-compose.yaml up
특정 컨테이너만 종료하고 싶을 때
$ docker-compose stop webserver
여러 컨테이너 생성(up)
docker-compose up
명령 사용
$ docker-compose up [옵션] [서비스명...]
지정할 수 있는 주요 옵션
옵션 | 설명 |
---|---|
-d | 백그라운드에서 실행 |
--no-deps | 링크 서비스를 시작하지 않는다. |
--build | 이미지를 빌드 |
--no-build | 이미지 빌드안함 |
-t, --timeout | 컨테이너의 타입아웃을 초로 지정(default:10) |
--scale SERVICE=서비스수 | 서비스수를 지정 |
service_a, service_b docker-compose.yml 생성
version: '3.3'
services:
service_a:
image: nginx
service_b:
image: redis
여러 컨테이너 일괄 생성 및 시작
$ docker-compose up
여러 컨테이너 일괄 백그라운드로 시작
$ docker-compose up -d
Docker 이미지 빌드
$ docker-compose up --build
컨테이너를 생성할 개수를 지정
$ docker-compose up --scale service_a=20
여러 컨테이너 확인(ps/logs)
컨테이너들을 확인하고 싶을 때
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------
sample_service_a_1 /docker-entrypoint.sh ngin ... Exit 0
sample_service_b_1 docker-entrypoint.sh redis ... Exit 0
컨테이너 ID 확인
$ docker-compose ps -q
754cd9049961f74527bc3e97cd18039016d55979bffad67d16559715c63afb22
858a229977e1e38c92aa829441bd652ce0018f1763208f8f68294b1a2f4a7c9e
컨테이너의 로그 확인
$ docker-compose logs
컨테이너에서 명령 실행(run)
컨테이너 실행 명령 docker-compose run
ex) service_a라는 이름의 컨테이너에서 /bin/bash를 실행
$ docker-compose run service_a /bin/bash
여러 컨테이너 시작/정지/재시작(start/stop/restart)
시작 (start)
$ docker-compose start
정지 (stop)
$ docker-compose stop
재시작 (restart)
$ docker-compose restart
특정 컨테이너 재시작 (restart)
$ docker-compose restart service_a
여러 컨테이너 일시 정지/재개(pause/unpause)
일시정지 (pause)
$ docker-compose pause
재개 (unpause)
$ docker-compose unpause
서비스 구성 확인(port/config)
서비스 공개용 포트를 확인할 때
docker-compose port [옵션] <서비스명> <프라이빗 포트 번호>
ex) 공개포트 확인
$ docker-compose port webserver 80
Compose의 구성을 확인하고 싶을 때
docker-compose config
ex) 구성요소 확인
$ docker-compose config
services:
service_a:
image: nginx
service_b:
image: redis
version: '3.3'
여러 컨테이너 강제정지/삭제(kill/rm)
컨테이너 강제정지
-s SIGINT
프로세스를 강제 종료
$ docker-compose kill -s SIGINT
컨테이너 삭제
$ docker-compose rm
docker-compose rm
Going to remove sample_service_b_1, sample_service_a_1
Are you sure? [yN] y
Removing sample_service_b_1 ... done
Removing sample_service_a_1 ... done
# -f를 붙이면 강제로 삭제할 수 있다.
$ docker-compose rm -f
여러 리소스 일괄 삭제(down)
down
: docker-compose up
으로 생성된 컨테이너들의 이미지를 한꺼번에 모아서 삭제할 때 사용
docker-compose down [옵션]
옵션 | 내용 |
---|---|
--rmi all | 모든 이미지 삭제 |
--rmi local | 커스텀 태그가 없는 이미지 삭제 |
-v, --volumes | Compose 정의 파일의 데이터 볼륨 삭제 |
$ docker-compose down --rmi all
Removing network sample_default
Removing image nginx
Removing image redis
'CI-CD > Docker' 카테고리의 다른 글
11. Docker Application 배포 (0) | 2023.04.19 |
---|---|
9. Dockerfile (0) | 2023.04.19 |
8. Docker compose를 이용하여 Kafka Confluent 설치 (0) | 2023.04.19 |
7. Docker Network (0) | 2023.04.19 |
6. Docker container (0) | 2023.04.19 |