728x90

 

이번에는 Docker-Compose에 대해 정리하려고 합니다.

도커 컴포즈란?


도커 컴포즈는 여러 도커 컨테이너들을 정의하고 동시에 실행할 수 있도록 하는 도구입니다. 이를 통해서 단일 애플리케이션을 구성하는 여러 컨테이너를 정의하고 한 번에 실행할 수 있도록 관리합니다.

 

도커 컴포즈를 왜 사용할까?


도커 컴포즈를 사용하는 이유는 다음과 같습니다.

  • 복잡한 애플리케이션 구성을 위한 컨테이너 관리
  • 컨테이너, 서비스, 백과 프론트간의 의존성 관리
  • 배포 용이성

 

도커 컴포즈 설치


apt-get install docker-compose
# 또는
sudo apt-get install docker-compose

# 네트워크 설치
docker network create nat

설치가 완료되면 잘 설치했는지 확인합니다.

docker-compose -v

 

도커 컴포즈 파일 문법 사용법(docker-compose.yml)


도커 컴포즈 파일은 애플리케이션의 필요한 상태, 컨테이너가 실행 중일 때 어떤 상태여야하는지 기술하는 파일이다. docker container run 명령으로 실행해야할 컨테이너 명령어들을 모여놓은 단순한 형식의 파일(.yml)입니다. 

도커는 docker-compose.yml에 작성된 내용을 통해  container들을 실행합니다. 

YML 또는 YAML 파일을 사용하는 이유 : YAML 문법은 들여쓰기를 통해 간단하게 작성할 수 있으며, JSON형식으로 변환하기 쉬워서 사용합니다.

도커 컴포즈 파일은 다음과 같은 세 개의 최상위 문(statement)으로 구성됩니다.

  • version : 도커 컴포즈 파일 형식의 버전을 가리킵니다.
  • service : 애플리케이션을 구성하는 모든 컨테이너에 대한 정보들을 열거하는 부분입니다.
  • networks : 서비스 컨테이너가 연결된 모든 도커 네트워크를 열거하는 부분입니다.

이에 대해 자세하게 설명해드리겠습니다.

 

version 

version: '3.8' # Compose 파일 버전

Docker Compose 파일의 버전을 지정합니다. 이는 Compose 파일의 형식을 정의하며, 사용할 수 있는 기능과 옵션을 결정합니다.

 

service

도커 컨테이너 생성할 때 사용하는 태그

services:
  container_name:
    image: image_name:latest

image : 컨테이너를 생성할 때 사용하는 Docker hub 또는 로컬 image를 지정합니다.

services:
  container_name:
    build: 
    	context: . #Dockerfile Directory
        dockerfile: Dockerfile

build : 로컬 디렉토리에서 Docker 이미지 빌드하며, 'context'는 Dockrefile의 디렉토리입니다.

services:
  container_name:
    port: 
    	- "80:80"

ports : 호스트와 컨테이너간의 포트 매핑을 지정합니다

services:
  container_name:
    enviorment:
    	a : b

enviroment : 컨테이너에서 사용할 환경 변수를 설정합니다. 변수 a에 b의 값을 설정합니다.

services:
  container_name:
    command: ["python", "-m", "flask", "run"]

command: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.

services:
  container_name:
    depends_on:
      - db

depends_on : 서비스가 시작되기 전에 시작되어야 할 다른 서비스를 지정합니다.

healthcheck: 추후 추가 예정

restart : 추후 추가 예정

labels : 추후 추가 예정

networks : 추후 추가 예정

 

network 

networks:
  network_name:
    external:
      name: nat

external : 외부 네트워크 참조합니다.

 

예시

도커 컴포즈를 사용하면 정리가 잘되어서 시각적으로 잘 확인할 수 있습니다.

docker container run -p 8020:80 --name todo-web --network nat todo-list

위의 명령어를 아래와 같이 작성해서 실행할 수 있습니다.

# docker-compose.yml

version: '3.7'

services:
  
  todo-web:
    image: todo-list
    ports:
      - "8020:80"
    networks:
      - app-net

networks:
  app-net:
    external:
      name: nat

docker-compose.yml 파일을 만들고 명령어를 실행합니다.

docker-compose up

이를 통해 다중 컨테이너 애플리케이션을 손쉽게 정의하고 관리할 수 있습니다. 개발 환경을 환경을 최소화합니다.

 

도커 컴포즈 명령어


docker-compose up
docker-compose up -d

docker-compose up: 포어그라운드에서 모든 로그를 출력하며 실행합니다.
docker-compose up -d: 백그라운드에서 (detach 모드로) 실행합니다.

docker-compose down

docker-compose down:  실행 중인 컨테이너, 네트워크, 볼륨, 이미지 등을 중지하고 제거합니다.

docker-compose stop

docker-compose stop : 실행 중인 컨테이너, 네트워크, 볼륨, 이미지 등을 중지합니다.

docker-compose scale container_name=3

docker-compose scale web=숫자 : 특정 서비스의 컨테이너 수를 조정합니다

 

Reference : https://docs.docker.com/compose/