Docker Compose 설정 파일 작성하기

김재혁·2025년 2월 12일

공통 프로젝트

목록 보기
6/12

Docker Compose 설정 파일 작성

0. 전체 코드

services:
  frontend:
    container_name: frontend
    build:
      context: ./frontend
      dockerfile: Dockerfile
    image: rublin322/moonggeul-frontend:latest
    ports:
      - "80:80"
    env_file:
      - .env
    networks:
      - moonggeul-network

  backend:
    container_name: backend
    build:
      context: ./backend
      dockerfile: Dockerfile
    image: rublin322/moonggeul-backend:latest
    env_file:
      - .env
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - moonggeul-network

  mysql:
    container_name: mysql
    image: mysql:8.4
    restart: always
    ports:
      - "3306:3306"
    env_file:
      - .env
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - moonggeul-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    container_name: redis
    image: redis:7.4-alpine
    ports:
      - "6379:6379"
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - moonggeul-network

volumes:
  mysql-data:
    name: mysql-data

networks:
  moonggeul-network:
    name: moonggeul-network
    driver: bridge

1. Docker Compose 개요

docker-compose.yml 파일은 frontend, backend, mysql, redis 총 4개의 서비스로 구성되어 있습니다. 이를 통해 애플리케이션을 손쉽게 컨테이너화하고 실행할 수 있습니다.


2. 서비스 정의

(1) Frontend 서비스

services:
  frontend:
    container_name: frontend
    build:
      context: ./frontend
      dockerfile: Dockerfile
    image: rublin322/moonggeul-frontend:latest
    ports:
      - "80:80"
    env_file:
      - .env
    networks:
      - moonggeul-network
  • 컨테이너 이름: frontend
  • 빌드 설정:
    • context: ./frontend: frontend 디렉토리 내 Dockerfile을 사용하여 이미지를 빌드합니다.
    • dockerfile: Dockerfile: Dockerfile을 지정합니다.
  • 이미지: rublin322/moonggeul-frontend:latest
  • 포트 설정: 80:80 (호스트의 80번 포트를 컨테이너의 80번 포트에 매핑)
  • 환경 변수 파일: .env
  • 네트워크: moonggeul-network

(2) Backend 서비스

  backend:
    container_name: backend
    build:
      context: ./backend
      dockerfile: Dockerfile
    image: rublin322/moonggeul-backend:latest
    env_file:
      - .env
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - moonggeul-network
  • 컨테이너 이름: backend
  • 빌드 설정: ./backend 디렉토리 내 Dockerfile을 사용하여 이미지 빌드
  • 이미지: rublin322/moonggeul-backend:latest
  • 환경 변수 파일: .env
  • 종속성: mysql, redis 서비스가 정상적으로 실행된 후 실행됨
  • 헬스 체크 설정:
    • test: /actuator/health 엔드포인트를 curl로 호출하여 정상 동작 확인
    • interval: 10초마다 헬스 체크 수행
    • timeout: 5초 내 응답 없을 경우 실패 처리
    • retries: 5번 재시도
  • 네트워크: moonggeul-network

(3) MySQL 서비스

  mysql:
    container_name: mysql
    image: mysql:8.4
    restart: always
    ports:
      - "3306:3306"
    env_file:
      - .env
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - moonggeul-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
      interval: 10s
      timeout: 5s
      retries: 5
  • 컨테이너 이름: mysql
  • 이미지: mysql:8.4
  • 자동 재시작: restart: always (컨테이너가 중단되면 자동 재시작)
  • 포트 설정: 3306:3306
  • 환경 변수 파일: .env
  • 볼륨 설정: mysql-data 볼륨을 /var/lib/mysql에 매핑하여 데이터 영속화
  • 네트워크: moonggeul-network
  • 헬스 체크: mysqladmin ping을 사용하여 DB 서버가 정상 작동하는지 확인

(4) Redis 서비스

  redis:
    container_name: redis
    image: redis:7.4-alpine
    ports:
      - "6379:6379"
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - moonggeul-network
  • 컨테이너 이름: redis
  • 이미지: redis:7.4-alpine (경량 Alpine 기반 Redis 이미지 사용)
  • 포트 설정: 6379:6379
  • 환경 변수 파일: .env
  • 헬스 체크: redis-cli ping 명령어를 실행하여 정상 작동 여부 확인
  • 네트워크: moonggeul-network

3. 볼륨 및 네트워크 설정

(1) MySQL 데이터 볼륨 설정

volumes:
  mysql-data:
    name: mysql-data
  • mysql-data라는 볼륨을 생성하여 MySQL 데이터를 영구적으로 저장

(2) 네트워크 설정

networks:
  moonggeul-network:
    name: moonggeul-network
    driver: bridge
  • moonggeul-network라는 브리지 네트워크를 사용하여 서비스 간 통신 가능하도록 설정
profile
志鐵心鏡

0개의 댓글