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
이 docker-compose.yml 파일은 frontend, backend, mysql, redis 총 4개의 서비스로 구성되어 있습니다. 이를 통해 애플리케이션을 손쉽게 컨테이너화하고 실행할 수 있습니다.
services:
frontend:
container_name: frontend
build:
context: ./frontend
dockerfile: Dockerfile
image: rublin322/moonggeul-frontend:latest
ports:
- "80:80"
env_file:
- .env
networks:
- moonggeul-network
frontendcontext: ./frontend: frontend 디렉토리 내 Dockerfile을 사용하여 이미지를 빌드합니다.dockerfile: Dockerfile: Dockerfile을 지정합니다.rublin322/moonggeul-frontend:latest80:80 (호스트의 80번 포트를 컨테이너의 80번 포트에 매핑).envmoonggeul-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
backend./backend 디렉토리 내 Dockerfile을 사용하여 이미지 빌드rublin322/moonggeul-backend:latest.envmysql, redis 서비스가 정상적으로 실행된 후 실행됨test: /actuator/health 엔드포인트를 curl로 호출하여 정상 동작 확인interval: 10초마다 헬스 체크 수행timeout: 5초 내 응답 없을 경우 실패 처리retries: 5번 재시도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
mysqlmysql:8.4restart: always (컨테이너가 중단되면 자동 재시작)3306:3306.envmysql-data 볼륨을 /var/lib/mysql에 매핑하여 데이터 영속화moonggeul-networkmysqladmin ping을 사용하여 DB 서버가 정상 작동하는지 확인 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
redisredis:7.4-alpine (경량 Alpine 기반 Redis 이미지 사용)6379:6379.envredis-cli ping 명령어를 실행하여 정상 작동 여부 확인moonggeul-networkvolumes:
mysql-data:
name: mysql-data
mysql-data라는 볼륨을 생성하여 MySQL 데이터를 영구적으로 저장networks:
moonggeul-network:
name: moonggeul-network
driver: bridge
moonggeul-network라는 브리지 네트워크를 사용하여 서비스 간 통신 가능하도록 설정