[Docker] docker compose boilerplate

끝으로 ㅣ 2024. 4. 21. 21:20

프로젝트의 docker compose 환경을 쉽고 빠르게 구성하기 위해 보일러플레이트를 작성했다.

 

docker-compose.yml

docker compose 3.9 버전을 사용하고, 예시로 사용자 FE/BE, 관리자 FE/BE, DB 서비스를 구성했다

docker hub의 image를 사용하는 방법, Dockerfile을 통해 build하는 방법, 컨테이너 환경변수, 볼륨, 네트워크 설정이 포함되어 있다

version: '3.9'
 
services:
# Application Services
  # 경로에 Dockerfile이 존재하는 경우 image를 build하여 컨테이너 실행
  client-FE:
    container_name: client-fe
    build: ./react-app
    ports:
      - 3000:3000
    networks:
      my-network
 
  # DockerHub에서 node image를 받아 react 프로젝트로 컨테이너 실행
  admin-FE:
    container_name: admin-fe
    image: node
    ports:
      - 3000:3000
    working_dir: /app
    command: npm start
    networks:
      my-network
 
  # DockerHub에서 jdk image를 받아 환경변수로 지정한 경로의 jar 파일로 컨테이너 실행
  client-BE:
    container_name: client-be
    image: openjdk:17
    ports:
      - 8080:8080
    # jar파일의 경로 환경변수 설정
    environment:
      SPRING_BOOT_JAR_PATH: /app/spring-boot-client.jar
    volumes:
      - {jar파일 path}:/app
    command: ["java", "-jar", "${SPRING_BOOT_JAR_PATH}"]
    networks:
      my-network
     
  admin-BE:
    container_name: admin-be
    # 프로젝트 폴더 내의 Dockerfile로 build하여 컨테이너 실행
    build:
      context: {Dockerfile path}
      dockerfile: {Dockerfile 파일명}
    ports:
      - 8080:8080
    volumes:
      - application_logs:/app/logs
    networks:
      my-network
     
 
# DB Services
mysql:
  container_name: mysql
  build:
    context: mariadb/
    args:
      MYSQLDB_VERSION: ${MYSQLDB_VERSION}
  volumes:
    - db_data:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: test
  # 컨테이너 다운 시 항상 재실행
  restart: always
  ports:
    - 3306:3306
  networks:
      my-network
 
maria:
  container_name: mariadb
  build:
    context: mariadb/
    args:
      MARIADB_VERSION: ${MARIADB_VERSION}
  volumes:
    - db_data:/var/lib/mysql
  environment:
    MARIADB_ROOT_PASSWORD: password
    MARIADB_DATABASE: test
  restart: always
  ports:
    - 3306:3306
  networks:
      my-network
  
mongo:
  container_name: mongo
  build:
    context: mongodb/
    args:
      MONGODB_VERSION: ${MONGODB_VERSION}
  volumes:
    - db_data:/data/db
  environment:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: password
    MONGO_INITDB_DATABASE: test
  restart: always
  ports:
    - 27017:27017
  networks:
      my-network
 
volumes:
  # NAS 볼륨 설정 (NFS를 사용하려면 호스트머신에 NFS 클라이언트가 설치되어 있어야하며, 도커 호스트가 NFS 서버에 접근할 수 있도록 보안 구성이 미리 되어있어야 함)
  db_data:
    driver: nfs
    driver_opts:
      # nfs version
      nfsvers: 4
      # nfs 서버 address
      addr: nfs-server-example.com
      # 공유 디렉토리 경로
      mountpoint: /path/to/nfs/share
      # NFS 블록 크기 설정
      rsize: 8192
      wsize: 8192
 
  # 로컬 볼륨 설정 (볼륨 경로 직접 설정)
  application_logs:
    driver: local
    driver_opts:
      # 로컬 볼륨 드라이버에 전달할 추가 옵션 설정
      o: bind
      # 로컬 볼륨의 유형을 설정, 일반적으로 nfs 같은 네트워크 파일 시스템에서 사용
      type: none
      # 로컬 볼륨이 마운트되는 로컬 시스템의 경로 (경로를 자동 생성해주진 않으므로, 호스트머신에서 경로가 존재하는지 확인하고 수동으로 생성해야함)
      device: /path/to/my_volume
 
  # 로컬 볼륨 설정 (도커 엔진에서 도커 호스트 머신의 파일 시스템에 따라 디스크 공간을 할당해서 볼륨 생성)
  # 각각의 서비스마다 별도의 볼륨을 사용하여 의존성을 줄이고 독립적으로 관리 가능
  static_files:
 
networks:
  # 기본 bridge 드라이버 네트워크
  my-network:
 
  # 기존 네트워크 사용
  my-external-network:
    external: true

 

depends_on

docker compose에 있는 컨테이너들의 실행순서를 설정할 때 사용

services:
  app:
    ..
    depends_on:
      mysql
  mysql:
    ..

위와 같이 설정 시 mysql 컨테이너가 실행된 후 app 컨테이너가 실행된다.

 

services:
  app:
    ...
    depends_on:
      mysql:
        condition: service_healthy
 
  mysql:
    healthcheck:
      # mysql 컨테이너가 생성되면서 데이터베이스 생성하는데 시간이 걸리기 때문에 헬스체크
        # mysql 초기 실행시 새로운 user를 생성해서 생성되었는지 healthcheck
      test:
        [
          "CMD",
          "mysqladmin",
          "ping",
          "-h",
          "localhost",
          "-u",
          "username",
          "-p$$MYSQL_PASSWORD"
        ]
        # healthcheck 간격
      interval: 30s
        # healthcheck 타임아웃
      timeout: 10s
        # healthcheck 타임아웃 횟수
      retries: 10
        ...

최초 실행 시 DB 초기 설정을 기다릴 때 healthcheck를 사용하면 더 정확하게 실행 순서를 설정할 수 있다.

CMD 뒤로 수행할 명령어를 정의할 수 있다.

 

참고

https://docs.docker.com/compose/compose-file/05-services/#healthcheck

 

Services top-level elements

Explore all the attributes the services top-level element can have.

docs.docker.com

https://docs.docker.com/compose/startup-order/

 

Control startup and shutdown order in Compose

How to control service startup and shutdown order in Docker Compose

docs.docker.com