Docker Compose YAML 최적화 전략 - 실무에서 바로 쓰는 Docker 설정 파일 작성법
Docker Compose는 복잡한 다중 컨테이너 애플리케이션을 간편하게 정의하고 관리할 수 있는 도구입니다. 하지만 실무에서 이를 최적화하여 성능과 보안을 모두 만족시키려면 체계적인 접근이 필요합니다. 이 가이드에서는 실제 프로덕션 환경에서 바로 적용할 수 있는 Docker Compose YAML 최적화 전략을 제시합니다.
중복 설정 제거를 통한 코드 효율성 극대화
가장 먼저 다뤄야 할 최적화는 중복 설정의 제거입니다. 여러 서비스에서 반복되는 네트워크, 환경 변수, 배포 설정을 공통 설정으로 분리하면 관리 효율성이 크게 향상됩니다1.
공통 설정 파일 활용
# common-config.yml
services:
network-deploy-service:
networks:
- eazybank
microservice-base-config:
extends:
service: network-deploy-service
deploy:
resources:
limits:
memory: 700m
environment:
SPRING_RABBITMQ_HOST: "rabbit"
microservice-configserver-config:
extends:
service: microservice-base-config
environment:
SPRING_PROFILES_ACTIVE: default
SPRING_CONFIG_IMPORT: configserver:http://configserver:8071/
이후 메인 docker-compose.yml에서는 extends를 활용하여 중복을 제거할 수 있습니다1:
textconfig-server:
image: eazybytes/configserver:S6
container_name: configserver-ms
ports:
- "8071:8071"
extends:
file: common-config.yml
service: microservice-base-config
이미지 경량화를 통한 성능 최적화
경량 베이스 이미지 선택
Alpine Linux 기반 이미지를 사용하면 크기를 현저히 줄일 수 있습니다. 예를 들어 Node.js의 경우 기본 이미지 대신 Alpine 버전을 사용하면 1.15GB에서 340MB로 약 3분의 1 수준까지 축소됩니다2.
services:
web:
build:
context: .
dockerfile: Dockerfile
image: node:16-alpine3.14 # Alpine 이미지 사용
멀티스테이지 빌드 구현
빌드용 이미지와 런타임용 이미지를 분리하여 최종 이미지 크기를 최소화합니다3:
# Dockerfile에서 멀티스테이지 빌드 활용
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:1.23.3-alpine as production
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
환경별 설정 관리 체계 구축
환경변수 파일을 통한 보안 강화
민감한 정보를 코드에 직접 노출하지 않고 환경변수 파일로 관리합니다4:
- .env.dev (개발 환경)
- .env.staging (스테이징 환경)
- .env.prod (프로덕션 환경)
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
env_file:
- .env.${ENVIRONMENT}
명령어 실행 시 환경을 지정할 수 있습니다5:
# 개발 환경
docker compose --env-file .env.dev up -d
# 프로덕션 환경
docker compose --env-file .env.prod up -d
비밀정보 관리를 위한 Secrets 활용
Docker Swarm 환경에서는 Secrets를 활용하여 비밀번호를 안전하게 관리합니다6:
secrets:
mysql_password:
file: ./mysql_password.txt
services:
mysql:
image: mysql:8.0
secrets:
- mysql_password
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_password
성능 최적화를 위한 리소스 관리
메모리 및 CPU 제한 설정
각 서비스별로 적절한 리소스 제한을 설정하여 시스템 안정성을 확보합니다7:
services:
postgres:
image: postgres:latest
deploy:
resources:
limits:
memory: 2g
cpus: 2
reservations:
memory: 1g
cpus: 1
볼륨 성능 최적화
데이터 영속성과 성능을 동시에 확보하기 위한 볼륨 설정입니다8:
services:
mysql:
image: mysql:8.0
volumes:
- mysql-data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf:ro
cap_add:
- SYS_NICE # mbind 에러 방지
volumes:
mysql-data:
driver: local
driver_opts:
type: none
o: bind
device: /opt/mysql-data
네트워크 및 보안 설정
내부 네트워크 보안 강화
외부 노출을 최소화하고 서비스 간 통신은 내부 네트워크로 제한합니다9:
services:
web:
ports:
- "80:80" # 외부 노출 포트만 명시
api:
expose:
- "8080" # 내부 네트워크에만 노출
depends_on:
- database
database:
# 포트를 외부에 노출하지 않음
networks:
- internal
networks:
internal:
driver: bridge
internal: true # 외부 접근 차단
헬스체크 구현
서비스 가용성을 모니터링하기 위한 헬스체크를 설정합니다1:
services:
rabbitmq:
image: "rabbitmq:management"
healthcheck:
test: ["CMD-SHELL", "rabbitmq-diagnostics -q ping"]
interval: 10s
timeout: 5s
retries: 10
start_period: 10s
프로덕션 환경을 위한 추가 최적화
재시작 정책 및 로깅 설정
services:
web:
restart: unless-stopped # 컨테이너 자동 재시작
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
다중 Compose 파일 활용
환경별로 다른 설정을 적용하기 위해 여러 Compose 파일을 조합합니다10:
# 기본 + 프로덕션 설정 조합
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
모니터링 및 디버깅
로그 집중화
services:
app:
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "app.logs"
성능 모니터링
# 실시간 성능 모니터링
docker stats
# 볼륨 사용량 확인
docker volume inspect my-volume
Docker Compose YAML 최적화는 단순히 설정을 줄이는 것이 아니라, 성능·보안·유지보수성을 종합적으로 고려한 체계적 접근이 필요합니다. 공통 설정 분리, 이미지 경량화, 환경별 설정 관리, 보안 강화 등의 전략을 통해 실무에서 안정적이고 효율적인 컨테이너 환경을 구축할 수 있습니다.