프로젝트의 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
'Docker' 카테고리의 다른 글
[Docker] Docker Compose MariaDB, MongoDB 도커라이징 (0) | 2024.04.23 |
---|---|
[Docker] Docker Compose V2 (0) | 2024.04.21 |
[Docker] 도커를 사용해서 로컬에 mysql, redis 구성 (0) | 2023.11.11 |