[Docker] 도커 컴포즈(Docker Compose)란? 왜 사용하는가?

📌 도커 컴포즈란?

여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있는 하나의 애플리케이션을 만드는 것이다.

 

도커 컴포즈 설치
# 도커 컴포즈 V2 버전 설치
sudo curl -sSL "https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 실행 권한 설정
chmod +x /usr/local/bin/docker-compose

# 버전 확인
docker-compose --version

 

 

Docker Compose를 사용하기 위해선 다음과 같은 단계가 필요하다.

  1. Docker Compose 파일 작성: YAML 형식으로 작성된 Docker Compose 파일을 사용해 서비스와 관련 설정들을 정의.
  2. Docker Compose 실행: docker-compose up 명령어를 사용하여 Docker Compose 파일에 정의된 서비스들을 시작.
  3. 실행 및 관리: 실행된 서비스를 확인하고 관리하기 위해 docker-compose ps, docker-compose logs, docker-compose exec 등의 명령어를 사용한다.
  4. 중지 및 정리: 작업을 완료한 후 docker-compose down 명령어를 사용하여 Docker Compose 파일에 정의된 서비스들을 중지하고 관련 컨테이너들을 삭제.
 

[Docker] 도커 명령어 총모음집 (image, container, compose)

📌 Docker 실행 sudo systemctl status docker # 1 sudo /etc/init.d/docker start # 2 Docker Image 관련 명령어 이미지 빌드 Dockerfile을 이용해서 이미지 생성 (제일 많이 쓰는 이미지 생성 방법) ➡ docker build -t {이미지

hstory0208.tistory.com


왜 컴포즈를 사용해야하나?

왜 그냥 docker만 사용하면 안돼?? 라고 생각할 수 있다.

이 목차에서 작성한 코드와 이 다음 목차에서 설명하는 docker-compose.yml 파일을 비교해서 보면 왜 컴포즈를 사용하는지 이해할 수 있을 것이다.

 

docker로 Spring Boot와 MySQL을 사용하는 경우를 보자.

 

1. 먼저 MySQL 컨테이너를 실행한다.

docker run --name mysql-db \
           -p 3306:3306 \
           -e MYSQL_ROOT_PASSWORD=mysecretpassword \
           -e MYSQL_DATABASE=mydb \
           -d mysql:8.0

 

2. Spring Boot 컨테이너를 실행한다. (--link 옵션으로 이전에 생성한 MySQL과 연결)

docker run --name springboot-web \
           -p 8080:8080 \
           --link mysql-db:db \
           -e SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb \
           -e SPRING_DATASOURCE_USERNAME=root \
           -e SPRING_DATASOURCE_PASSWORD=mysecretpassword \
           -d springbootapp:latest

 

각각의 컨테이너를 따로 실행해야 해서 굉장히 번거롭다.

 

이번에는 도커 컴포즈 파일을 사용하면 어떻게 되는지 보자.


컴포즈 파일 작성

컴포즈 파일명은   docker-compose.yml 

 

이번에는 docker compose로 Spring Boot와 MySQL을 사용한 경우를 보자

version: '3'

services:
  web:
    build: .
    image: "springbootapp:latest"
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: mysecretpassword

  db:
    image: "mysql:8.0"
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysecretpassword
      MYSQL_DATABASE: mydb
각 항목 별 설명
  • version: '3' : Docker Compose 파일의 버전. (현재 사용하는 버전은 3이라는 뜻)
  • services: Docker Compose에서 관리할 서비스들의 목록을 정의한다.
    • web: 첫 번째 서비스로, 자바 웹 애플리케이션을 포함한 Spring Boot 이미지를 사용했다.
      • build: 이미지를 빌드할 디렉터리를 지정. (여기서는 . 으로 해당 파일이 존재하는 디렉터리를 사용했다.)
      • image: 빌드한 이미지의 이름을 지정.
      • ports: 호스트와 컨테이너 간의 포트를 맵핑. (여기서는 호스트의 포트 8080과 컨테이너의 포트 8080을 연결했다.)
      • depends_on: 이 서비스가 시작되기 전에 필요한 의존 서비스를 지정. (여기서는 MySQL 데이터베이스가 필요하므로 depends_on에 'db'를 명시했다..)
      • environment: 필요한 환경 변수를 지정. (Spring Boot의 데이터소스 정보를 설정했다.)
  • db: 두 번째 서비스로, MySQL 데이터베이스 이미지를 사용했다.
    • image: MySQL 이미지를 사용하며, 버전은 '8.0'을 사용했다.
    • ports: 호스트와 컨테이너 간의 포트를 맵핑. (여기서는 호스트의 포트 3306와 컨테이너의 포트 3306를 연결했다.)
    • environment: 필요한 환경 변수를 지정. ( MySQL 데이터베이스의 사용자 정보와 데이터베이스 이름을 설정했다.)

이 설정 파일을 사용하여 docker-compose up 명령을 실행하면, Spring Boot 웹 애플리케이션과 MySQL 데이터베이스가 연결된 멀티-컨테이너 환경이 구동된다.

 

docker로 컨테이너 각각을 실행한것보다 훨씬 간편한 것을 볼 수 있다.