본문 바로가기
Docker

[Docker] Docker Compose - 예제 (도커 강의 정리 #6)

by dbs_ 2025. 5. 16.

 

 


 

MySQL, Redis 컨테이너 동시에 띄워보기

Docker Compose

  • 여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴.
  • 컨테이너 여러 개를 동시에 띄우는 경우에 사용.
  • 실행할 때 작성한 복잡한 명령어를 간소화시킬 수 있음.
services:
  my-db:
     image: mysql
     environment:
       MYSQL_ROOT_PASSWORD: 1234
     volumes:
       - ./mysql_data:/var/lib/mysql
     ports:
       - 3306:3306
   my-cache-server:
     image: redis
     ports:
       - 6379:6379
  • 컨테이너 이름 규칙
    • <현재 디렉토리명>_<서비스명>_1
      • 예시 : myproject_my-db_1
  • 컨테이너 이름을 직접 지정하고 싶다면?
    • 아래처럼 container_name 옵션을 사용하면 원하는 이름으로 직접 지정할 수 있다.
services:
  my-db:
    container_name: my-mysql
    ...

 

Spring Boot, MySQL, Redis 컨테이너 동시에 띄워보기

  • 각각의 컨테이너는 자신만의 네트워크망과 IP 주소를 가지고 있다. 호스트 컴퓨터 입장에서 localhost는 호스트 컴퓨터를 가리키지만, Spring Boot 컨테이너 입장에서 localhost는 Spring Boot 컨테이너를 가리킨다.

 

# application.yml

spring:
  datasource:
    url: jdbc:mysql://my-db:3306/mydb # docker-compose.yml 파일에 정의된 서비스 이름
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  data:
    redis:
      host: my-cache-server # docker-compose.yml 파일에 정의된 서비스 이름
      port: 6379
    • 동일한 Docker Compose 네트워크 내에서 한 컨테이너가 다른 컨테이너와 통신하기 위해 '도커 컴포즈 파일에서 서비스명 지정한 걸로 각 컨테이너끼리 통신'
      • Docker Compose는 내부 DNS를 통해 서비스 이름을 컨테이너 IP 주소로 매핑합니다. 따라서 컨테이너들은 localhost 대신 서비스 이름으로 서로를 쉽게 찾아 통신할 수 있다. 각 컨테이너는 각자의 네트워크를 가지고 있기 때문에, localhost가 아니라 Redis가 실행되고 있는 컨테이너로 통신을 해야 한다.

 

  • 그리고 compose.yml 파일은 아래와 같이 설정해준다.
# compose.yml

services:
  my-server: # 서비스명
    build: .
    ports:
      - 8080:8080
    depends_on: # 아래 두 컨테이너가 생성되고 healthy 하다고 판단 될 때, 해당 컨테이너를 생성한다.
      my-db:
        condition: service_healthy
      my-cache-server:
        condition: service_healthy 
        
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: mydb # MySQL 최초 실행 시 mydb라는 데이터베이스를 생성해준다.
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping" ] # MySQL이 healthy 한 지 판단할 수 있는 명령어
      interval: 5s # 5초 간격으로 체크
      retries: 10 # 10번까지 재시도
      
  my-cache-server:
    image: redis
    ports:
      - 6379:6379
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      retries: 10