목차
Docker Compose
•
여러 컨테이너를 모아서 관리하기 위한 툴(의존 관계에 있는 컨테이너들을 모아서 관리)
•
웹 애플리케이션을 제품 환경에서 운용할 때는 애플리케이션 서버, 로그 서버, 프록시 서버 등과 같이 여러 개의 컨테이너들을 연계하여 작동시킴
◦
여러 개의 도커 컨테이너가 협력하면서 작동
docker-compose.yml 파일
•
Compose 구성관리 파일
•
웹 애플리케이션의 의존 관계(데이터베이스, 큐, 캐시, 애플리케이션 등)을 모아서 설정
•
설정을 바탕으로 docker-compose명령을 실행하면 여러 개의 컨테이너를 모아서 시작하거나 정지
•
컨테이너의 구성정보를 YAML 파일로 관리하므로 CI나 CD에 있어서 환경 구축에 그대로 이용 가능
compose 파일 작성 및docker-compose 명령어
1. docker-compose.yml 파일 작성
hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ cat docker-compose.yml
# 버전 정의
version: '3.3'
services:
# 웹 서버
# Dockerfile 빌드후 80포트를 공개하여 컨테이너 시작
# Redis 서비스에 의존
webserver:
build: .
ports:
- "80:80"
depends_on:
- redis
# DB 서버
# 도커 허브에 공개되어 있는 공식 이미지로 컨테이너 시작
redis:
image: redis:4.0
hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ ls
Dockerfile app.py docker-compose.yml requirements.txt static templates
Bash
복사
•
확장자는 .yaml으로도 작성 가능
•
다른 파일명 지정 시 -f 옵션을 사용하여 정의 파일명을 지정
•
버전 지정하지 않으면 기본으로 1.0으로 동작
지정자
•
services : 서비스 이름 지정
◦
image : 이미지 지정
◦
build : 이미지 빌드
▪
context : Dockerfile 경로 지정
▪
dockerfile : Dopckerfile 이름
▪
args : 이미지 빌드 인수
◦
ports : 포트 지정
◦
networks : 네트워크 지정
•
networks : 네트워크 정의
•
volumes : 데이터 볼륨 정의
•
command : 컨테이너에서 작동하는 명령(베이스 이미지에서 지정 시 그 명령을 덮어씀)
•
entrypoint : 컨테이너에서 작동하는 명령(베이스 이미지에서 지정 시 그 명령을 덮어씀)
•
links : 컨테이너 간 연결(서비스 또는 서비스:엘리어스명 지정 가능)
•
ports : 컨테이너가 공개하는 포트 지정(컨테이너 포트 번호만 지정 시 호스트 머신의 포트는 랜덤한 값으로 설정)
•
expose : 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트 공개
•
depens_on : 서비스 의존관계 정의
•
environment : 환경변수 지정
•
env_file : 환경변수 파일 지정
◦
애플리케이션 안에서 사용하는 API 키와 같은 비밀정보의 관리는 컨테이너 오케스트레이션 툴의 기능을 사용하는 것이 좋음
•
container_name : 컨테이너 이름 지정
•
labels : 컨테이너에 라벨 지정
•
volumes : 마운트할 볼륨 지정(호스트 디렉터리 경로:컨테이너 디릭터리 경로 또는 컨테이너 디렉터리 경로 지정)
◦
ro 지정 시 읽기전용으로 마운트
◦
다른 컨테이너로부터 모든 볼륨을 마운트 할 때는 컨테이너명 지정
•
volumes_from
services:
webserver:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
Bash
복사
◦
depends_on은 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해질때까지 기다리고 제어를 하지 않음
◦
의존 관계에 있는 데이터베이스 서비스의 준비가 끝날때까지 기다리는 것은 아니기 때문에 애플리케이션 측에서 이에 대한 대책을 세워야 함
2. 컨테이너 시작(docker-compose up)
hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose up
Bash
복사
•
docker compose에서는 각각의 컨테이너를 작동시키기 위한 이미지의 다운로드나 빌드를 하나의 명령으로 모두 실행
•
정지 시 Ctrl+C
-d | 백그라운드에서 실행 |
--build | 컨테이너 시작 시 도커파일 빌드 |
--scale [서비스명=수] | 컨테이너 생성 개수 지정 |
3. 컨테이너 확인(docker-compose ps)
hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------
chap07_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
chap07_webserver_1 python /opt/imageview/app.py Up 0.0.0.0:80->80/tcp
Bash
복사
•
가동중인 컨테이너 상태 확인 시 다른 터미널에서 명령 실행하여 확인
4. 컨테이너 로그 확인(docker-compose log)
5. 컨테이너 시작/정지/정지(docker-compose start/stop/restart)
hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose stop
Stopping chap07_webserver_1 ... done
Stopping chap07_redis_1 ... done
Bash
복사
•
docker-compose stop [컨테이너명]으로 해당 컨테이너만 정지도 가능
6. 리소스 삭제(docker-compose down)
hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose down
Removing chap07_webserver_1 ... done
Removing chap07_redis_1 ... done
Removing network chap07_default
Bash
복사
7. 컨테이너에서 명령 실행(run)
•
docker compose로 시작한 컨테이너에서 명령 실행
•
docker-compose run [서비스명] [명령]
◦
docker-compose run server_a /bin/bash
8. 서비스 구성 확인(config)
9. 서비스 공개용 포트 확인(port)
•
docker-compose port [옵션] [서비스명] [프라이빗 포트 번호]
10. 여러 컨테이너 강제 정지/삭지(kill/rm)
•
kill 명령어는 다른 시그널과 함께 사용 가능