Cloud/Docker

[Docker] Docker Compose

Yoonsoo Park 2024. 11. 27. 11:23

*해당 포스팅은 다음과 같은 환경에서 진행하였으니, 참고 바랍니다.

  • Docker Community Edition 
  • Ubunto Linux 22.04 (OS에 따라 설치 방법은 다소 상이하나, 사용법은 동일함)
  • VMware  Workstation pro ( x86_64, CPU  x 2, RAM 2GB, HDD 120GB)

 

1. Docker Compose란?

 이전 포스팅을 보고 오신 분들이라면, 도커 컨테이너를 하나 만들 때마다, docker run~를 치는 과정을 거쳤을 것이다. 만약 웹 서버 10대, WAS 20대, DB 서버 10대 이런 식으로 여러 개의 컨테이너를 생성해야 하는 경우, 모든 컨테이너를 일일이 명령어를 쳐서 실행시킬 수도 있지만, 다소 번거롭다고 느낄 것이다. 이러한 과정을 더 쉽게 해주는 것이 도커 컴포즈(docker compose)다. 

 

 도커 컴포즈(docker compose)는 단일 호스트에서 다중 컨테이너로 이뤄진 애플리케이션(서비스)을 정의하고, 관리하는 도구이다. 단순히 말해, 지금까지 일일이 해왔던 컨테이너의 생성, 중지, 삭제 등의 관리를 일괄적으로 도커 컴포즈를 통해 할 수 있는 것이다. 다음 정리를 통해 도커 컴포즈의 특징을 알아보자.

 

도커 컴포즈의 특징

1) 단일 호스트(서버) 내에서 여러 서비스를 정의한다

 

2) docker-compose.yml에서 scale을 설정하거나, 명령어를 통해 복제가 가능하지만, auto-scailing은 불가한 정적 스케일링을 수행한다

 

3) YAML 파일(docker-compose.yml)을 통해 여러 서비스와 그 설정(네트워크, 볼륨 등)을 선언적으로 관리한다

 

4) 클러스터 관리, 자동 복구와 같은 오케스트레이션 기능은 없다(쿠버네티스, 스웜 등을 통해 보완 가능)

 

도커 컴포즈 설치 방법

1) 도커 컴포즈 다운로드

apt를 사용해서 다운 받는 것도 가능하나, 다른 버전을 사용하기 위해, GitHub에서 바이너리를 가져와 직접 설치한다. 

curl -L "http://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#명령어 파일을 /usr/local/bin 에 복사해 docker-compose 명령어로 실행할 수 있게 한다

 

2) 도커 컴포즈 실행 파일 권한 설정

chmod u+x /usr/local/bin/docker-compose

 

3) 정상 작동 및 버전 확인

docker-compose --version

 

 

 

2. Docker Compose를 사용한 컨테이너 운영

 위와 같이 도커 컴포즈가 정상적으로 설치됐다면, 이제 도커 컴포즈 설정 파일(docker-compose.yml)과 docker-compose 명령어를 이용해 컨테이너를 통합 운영할 수 있다. 먼저 아래 설명을 참고하여 docker-compose.yml 파일을 작성하는 방법부터 알아보자.

version: "3"  # docker compose 파일의 버전을 명시한다. version 3 로 지정 
services:  # 서비스 정의 시작 
  web_svr:  # 서비스 이름 지정 
    image: ubuntu:22.04  # 서비스 하위에 생성될 컨테이너들의 베이스 이미지 지정 
    ports:  # 컨테이너가 공개할 포트와 바인딩할 호스트의 포트 지정 
      - "80:80"  # 호스트의 80번 포트를 컨테이너의 80번 포트를 바인딩 함. 
    networks:  # 서비스 하위에 생성될 컨테이너들이 연결될 도커 네트워크 지정 
      - frontend_net  # frontend_net (도커 네트워크)에 서비스를 연결함. 
    depends_on:  # 서비스의 의존 관계 정의 
    - dbms  # web_svr 서비스가 dbms 서비스에 의존. dbms가 먼저 실행되고  web_svr이 나중에 실행된다
    
  dbms:  # 서비스 이름 지정 
    image: mysql:latest  # 서비스 하위에 생성될 컨테이너들의 베이스 이미지 지정 
    expose:  # 컨테이너가 공개할 포트 지정.(호스트 바인딩 X) 
      - "3306"  # 3306 포트를 도커 컨테이너들에게 공개함.(expose) 
    networks:  # 서비스 하위에 생성될 컨테이너들이 연결될 도커 네트워크 지정 
      - backend_net  # backend_net (도커 네트워크)에 서비스를 연결함.
  
 ##추가적인 명령어들##
 1) 컨테이너 이름 설정
 container_name: [컨테이너 이름]
 => 컨테이너 이름을 설정하면 이름이 중복되어 scailing이 되지 않는다
 
 2) 환경 변수 설정
 environment:
   MYSQL_ROOT_PASSWORD: 1234
   ..
   
 3) 호스트와 컨테이너 볼륨 연결
 volumes:
   - [호스트 디렉토리 경로]:[컨테이너 디렉로리 경로]

 

 다음으로는 docker-compose 명령어 사용법을 알아보자. 명령어 연습을 위해 아래와 같이 간단하게 docker-compose.yml 파일을 하나 만들어두고 실습을 진행하자. 

mkdir -p /compose/project1 

cd /compose/project1 docker-compose.yml 

#docker-compose.yml 파일 내용

version: "3" 
services: 
  nginx-server: 
    image: nginx:latest 
    ports: 
      - "8101-8200:80"
#명령어 사용법#
docker-compose <하위명령> [옵션] [서비스명] 

[서비스명] : docker-compose.yml에서 지정한 service 항목을 지정

 

docker-compose 하위 명령어

더보기
서브 명령
내용
up
docker-compose.yml 기반 전체 컨테이너 생성 & 시작
ps
컨테이너 목록 표시
logs
docker-compose 로그 출력
run
전체/특정 컨테이너 실행
start
전체/특정 컨테이너 시작
stop
전체/특정 컨테이너 정지
restart
전체/특정 컨테이너 재시작
pause
전체/특정 컨테이너 일시정지
unpause
전체/특정 컨테이너 일시정지해제
port
공개 포트주소 표시
config
구성 확인
kill
실행중인 컨테이너 강제 중지
rm
전체/특정 컨테이너 삭제
down
리소스 삭제

1) docker-compose 로 컨테이너 구동하기

docker-compose up -d --scale nginx-server=10

# nginx-server 서비스를 수행하는 컨테이너를 10개 생성하고, 백그라운드에서 구동되게 하라

 

2) 전체 컨테이너 확인 

docker-compose ps

 

3) docker-compose로 관리하는 컨테이너들의 로그 확인

docker-compose logs

 

4) 여러 컨테이너 시작/정지/재시작, 일시중지/해제

docker-compose <start|stop|restart|pause|unpause> 
# 아무것도 지정하지 않으면 모든 서비스에 적용된다. 

docker-compose <start|stop|restart|pause|unpause> <서비스명>
# 서비스명으로 지정하면 서비스에 등록된 모든 컨테이너에 적용된다.

 

5) 정지된 컨테이너 삭제

docker-compose rm [옵션] [서비스]

# -v / --volume : compose 정의 파일에 기재된 데이터 볼륨도 삭제함
# -s / --stop : 실행 중인 컨테이너를 먼저 정지한 후 삭제.

 

**volume이란?

 다음 docker-compose.yml 파일을 보면 shared_data라는 볼륨을 설정하고, shared_data에 web 서비스의 /usr/share/nginx/html 이라는 디렉터리를 연동해 주는 것을 볼 수 있다. 

version: '3.8'
services:
  web:
    image: nginx
    volumes:
      - shared_data:/usr/share/nginx/html
  app:
    image: python
    volumes:
      - shared_data:/app/data
volumes:
  shared_data:

 volume은 도커가 관리하는 독립적인 스토리지로, 위의 코드와 같이 volume과 컨테이너의 디렉토리를 연동해 주면 컨테이너가 삭제됐을 때, 데이터가 유실되는 것을 방지할 수 있다. 

 

6) docker-compose.yml에 정의된 모든 서비스와 네트워크를 중지 및 삭제

**옵션을 주어 명시된 볼륨과 이미지도 삭제 가능하다(기본값은 아님)

docker-compose [옵션] down 

# -v / --volume : compose 정의 파일에 기재된 데이터 볼륨도 삭제함.
#  --rmi all : 모든 이미지들도 삭제함.

 

7) 실행 중인 컨테이너 강제 종료

docker-compose kill [옵션] [서비스] 
# -s :  종료할 때 사용할 신호 지정. 기본값은 SIGKILL 입니다.

docker-compose kill 
# 모든 서비스 강제 종료

 

8) docker-compose.yml 파일 위치 지정 옵션

docker-compose를 사용하다보면 docker-compose.yml 파일이 저장된 디렉터리에 위치한 상태에서만 docker-compose.yml 파일로 정의된 서비스를 관리할 수 있다는 점을 알 수 있다. 이때 -f 옵션을 사용하여 docker-compose.yml 파일의 경로를 지정하고, 다른 위치에 있는 docker-compose.yml 파일로 정의된 서비스를 관리할 수 있다. 

docker-compose -f /compose/project1/docker-compose.yml [명령어] 
#/compose/project1/docker-compose.yml 파일에 등록된 서비스의 컨테이너들을 관리할 수 있다

 

 

 

힘들지만 오늘도 해낸 나를 위한 한 마디,

"고통보다 사람을 더 쉽게 무너뜨리는건, 어쩌면 귀찮다는 생각인지도 모른다", 하정우

 

"정말 절실히 체감한 것은 삶의 루틴이 무너지면, 분명히 그 틈을 무기력함과 귀찮음이 파고든다는 것이다,

때로는 잠시 쉴 수도 있지만, 그것이 나태함의 단초가 되면 안 될 것이고, 이 또한 계획의 일환이어야 한다"