Docker Compose를 사용한 멀티 컨테이너 관리

Docker Compose를 사용한 멀티 컨테이너 관리

Docker Compose멀티 컨테이너한번에 관리할 수 있는 도구입니다. docker-compose.yml 파일을 작성하여 Nginx, MongoDB 그리고 백엔드 서버로 된 멀티 컨테이너 애플리케이션을 설정하는 방법 및 명령어를 알아보겠습니다.

Docker Compose 파일 구조

Docker Composeyml 또는 yaml 파일로 작성합니다. docker-compose.yml 파일은 다음과 같은 구조로 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
version: "3"
services:
# nginx SET
nginx:
image: arm64v8/nginx
restart: unless-stopped
volumes:
- ./data/nginx:/etc/nginx/conf.d
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
ports:
- 80:80
- 443:443
depends_on:
- server
command: '/bin/sh -c ''while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g "daemon off;"'''

# Certbot SET
certbot:
image: certbot/certbot:arm64v8-nightly
restart: unless-stopped
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

# MONGODB SET
mongodb:
image: mongo:4.4.18
restart: always
ports:
- 19328:27017
volumes:
- ./data/mongodb/data:/data/db

# BACKEND SERVER SET
server:
image: xxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/server:latest
restart: always
volumes:
- ./server:/server
- /server/node_modules
links:
- "mongodb:server"
depends_on:
- mongodb
env_file:
- .env

서비스 설명

  1. Nginx
  • image: Nginx는 arm64v8/nginx 이미지를 사용합니다.
  • restart: unless-stopped 옵션을 사용하여 컨테이너가 종료되면 다시 시작합니다.
  • volumes: 호스트의 ./data/nginx 디렉토리를 컨테이너의 /etc/nginx/conf.d 디렉토리로 연결합니다.
  • ports: 호스트의 80, 443 포트를 컨테이너의 80, 443 포트로 연결합니다.
  • depends_on: server 컨테이너가 실행된 후에 nginx 컨테이너가 실행됩니다.
  • command: Nginx를 주기적으로 리로드하고, 포그라운드에서 실행합니다.
  1. Certbot
  • image: Certbot는 certbot/certbot:arm64v8-nightly 이미지를 사용합니다.
  • restart: unless-stopped 옵션을 사용하여 컨테이너가 종료되면 다시 시작합니다.
  • volumes: 호스트의 ./data/certbot 디렉토리를 컨테이너의 /etc/letsencrypt, /var/www/certbot 디렉토리로 연결합니다.
  • entrypoint: 인증서를 갱신하는 Certbot 명령을 실행합니다.
  1. MongoDB
  • image: MongoDB는 mongo:4.4.18 이미지를 사용합니다.
  • restart: always 옵션을 사용하여 컨테이너가 종료되면 다시 시작합니다.
  • ports: 호스트의 19328 포트를 컨테이너의 27017 포트로 연결합니다.
  • volumes: 호스트의 ./data/mongodb/data 디렉토리를 컨테이너의 /data/db 디렉토리로 연결합니다.
  1. Backend Server
  • image: 백엔드 서버는 xxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/server:latest 이미지를 사용합니다. (ECR 이미지)
  • restart: always 옵션을 사용하여 컨테이너가 종료되면 다시 시작합니다.
  • volumes: 호스트의 ./server, /server/node_modules 디렉토리를 컨테이너의 /server, /server/node_modules 디렉토리로 연결합니다.
  • links: mongodb 컨테이너를 server 컨테이너에 연결합니다.
  • depends_on: mongodb 컨테이너가 실행된 후에 server 컨테이너가 실행됩니다.
  • env_file: .env 파일을 읽어 환경 변수를 설정합니다.

설정 파일 작성 요령

  • 버전 정의: version: “3”은 Docker Compose 파일의 버전을 나타냅니다. 여기서는 버전 3을 사용합니다.
  • 서비스 정의: 각 서비스는 독립적으로 정의되며, 이미지, 빌드경로, 포트, 볼륨, 환경변수 등을 설정할 수 있습니다.
  • 의존성 관리: depends_on을 사용하여 서비스 간의 의존성을 설정할 수 있습니다. depends_on으로 설정된 서비스를 먼저 실행한 후 다음 서비스를 실행합니다.
  • 환경 변수 설정: env_file을 사용하여 .env 파일을 읽어 환경 변수를 설정할 수 있습니다.
  • 링크 설정: links를 사용하여 컨테이너 간의 연결을 설정합니다. links로 설정된 서비스를 다른 서비스에 연결합니다.
  • 컨테이너 재시작 정책
    • restart를 사용하여 컨테이너의 재시작 정책을 설정할 수 있습니다. no, always, on-failure, unless-stopped 등의 옵션을 사용할 수 있습니다.
  • 컨테이너 실행 명령
    • command를 사용하여 컨테이너 실행 명령을 설정할 수 있습니다.
  • 로그 출력: logging 옵션을 사용하여 로그 출력을 설정할 수 있습니다.
    • driver, options 등의 옵션을 사용하여 로그 드라이버와 로그 옵션을 설정할 수 있습니다.

Docker Compose 명령어

  • 이미지 다운로드: docker-compose pull 명령으로 이미지를 다운로드합니다.
  • 빌드 및 실행: docker-compose up -d 명령으로 docker-compose.yml 파일을 실행합니다. -d 옵션을 사용하여 백그라운드에서 실행합니다. 파일이 있는 디렉토리에서 실행합니다.
  • 로그 확인: docker-compose logs -f 명령으로 실행 중인 컨테이너의 로그를 확인합니다. -f 옵션을 사용하여 실시간 로그를 확인합니다.
    • 서비스별 로그 확인: docker-compose logs -f [service_name] 명령으로 특정 서비스의 로그를 확인합니다.
  • 상태 확인: docker-compose ps 명령으로 실행 중인 컨테이너의 상태를 확인합니다.
  • 중지: docker-compose down 명령으로 실행 중인 컨테이너를 중지합니다. 파일이 있는 디렉토리에서 실행합니다.

Docker Compose 컨테이너 업데이트 스크립트 (dockerUpdate.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash

ECR_REGISTRY="xxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com"

function aws_login() {
echo "### aws login..."
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin "${ECR_REGISTRY}"
}

function docker_pull() {
echo "### docker-compose pull..."
docker-compose pull
}

function docker_up() {
echo "### docker-compose up -d..."
docker-compose up -d
}

function docker_remove_all_unused() {
echo "### docker system prune -a..."
yes | docker system prune -a
}

function main() {
aws_login
docker_pull
docker_up
docker_remove_all_unused
}

main "$@"
  • aws_login: AWS ECR에 로그인합니다.
  • docker_pull: docker-compose pull 명령으로 이미지를 다운로드합니다.
  • docker_up: docker-compose up -d 명령으로 docker-compose.yml 파일을 실행합니다.
  • docker_remove_all_unused: docker system prune -a 명령으로 사용하지 않는 이미지, 컨테이너, 네트워크, 볼륨을 삭제합니다.
  • main: 메인 함수로 스크립트를 실행합니다.

정리

Docker Compose를 사용하면 멀티 컨테이너한번에 관리할 수 있습니다. docker-compose.yml 파일을 작성하여 Nginx, MongoDB 그리고 백엔드 서버로 된 멀티 컨테이너 애플리케이션을 설정하는 방법과 명령어를 알아보았습니다. 또한 dockerUpdate.sh 스크립트를 사용하여 모델 업데이트를 자동화할 수 있습니다. 대략적인 yml 구조 및 명령어를 참고하여 Docker Compose를 활용하여 멀티 컨테이너 애플리케이션을 관리해보세요.

공유하기