1. Docker: 단일 컨테이너
Docker는 컨테이너를 생성하고 실행하는 기본 엔진이다. 하나의 컨테이너를 띄우고 관리하는 데 사용한다.
# MySQL 컨테이너 실행
docker run -d \
--name mysql-container \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=portmis \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# Spring Boot 애플리케이션 컨테이너 실행
docker run -d \
--name spring-app \
-p 8080:8080 \
--link mysql-container:mysql \
-e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/portmis \
myapp:1.0
컨테이너마다 명령어를 별도로 실행해야 하고, 네트워크 연결이나 환경변수를 일일이 지정해야 한다. 컨테이너가 많아지면 관리가 복잡해진다.
1-1. Docker 이미지 빌드
Dockerfile로 이미지를 만든다.
FROM openjdk:8-jdk-alpine
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
# 이미지 빌드
docker build -t myapp:1.0 .
# 빌드된 이미지 확인
docker images
1-2. Docker 네트워크를 직접 설정
컨테이너 간 통신을 위해 네트워크를 수동으로 생성하고 연결해야 한다.
# 네트워크 생성
docker network create app-network
# MySQL을 네트워크에 연결하여 실행
docker run -d \
--name mysql-container \
--network app-network \
-e MYSQL_ROOT_PASSWORD=rootpass \
mysql:8.0
# Spring Boot 앱도 같은 네트워크에 연결
docker run -d \
--name spring-app \
--network app-network \
-p 8080:8080 \
myapp:1.0
2. Docker Compose: 여러 컨테이너를 한 번에 관리
Docker Compose는 YAML 파일 하나로 여러 컨테이너를 정의하고, 한 명령어로 전체를 실행한다.
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql-container
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: portmis
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
app:
build: .
container_name: spring-app
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/portmis
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: rootpass
depends_on:
- mysql
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
# 모든 서비스 시작
docker-compose up -d
# 특정 서비스만 재시작
docker-compose restart app
# 로그 확인
docker-compose logs -f app
# 모든 서비스 중지 및 삭제
docker-compose down
# 볼륨까지 삭제
docker-compose down -v
2-1. depends_on으로 실행 순서를 제어
depends_on을 사용하면 컨테이너 시작 순서를 지정할 수 있다. 단, 컨테이너가 완전히 준비될 때까지 기다리지는 않는다.
services:
app:
build: .
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
redis:
image: redis:7-alpine
MySQL이 완전히 준비될 때까지 기다리려면 헬스체크를 추가한다.
services:
mysql:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
app:
build: .
depends_on:
mysql:
condition: service_healthy
2-2. 환경별 설정 파일을 분리
개발, 스테이징, 운영 환경별로 다른 설정을 사용할 수 있다.
# docker-compose.yml (기본)
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
# docker-compose.prod.yml (운영 환경 오버라이드)
version: '3.8'
services:
app:
environment:
SPRING_PROFILES_ACTIVE: prod
restart: always
# 운영 환경 실행
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
2-3. 환경변수를 .env 파일로 관리
민감한 정보는 .env 파일로 분리한다.
# .env
MYSQL_ROOT_PASSWORD=secure_password
MYSQL_DATABASE=portmis
APP_PORT=8080
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
app:
build: .
ports:
- "${APP_PORT}:8080"
.env 파일은 .gitignore에 추가하여 버전 관리에서 제외한다.
3. 실제 사용
Docker를 사용하는 경우
- 단일 컨테이너만 필요할 때
- 운영 환경에서 Kubernetes 같은 오케스트레이션 도구를 사용할 때
- CI/CD 파이프라인에서 이미지를 빌드하고 배포할 때
Docker Compose를 사용하는 경우
- 로컬 개발 환경 구성
- 여러 서비스가 연동되는 애플리케이션 개발
- 팀원들과 동일한 개발 환경 공유
- 통합 테스트 환경 구축
Spring Legacy와 MyBatis로 마이그레이션 작업 중이라면, Docker Compose로 개발 환경을 구성하면 Oracle/MySQL DB와 애플리케이션을 함께 관리할 수 있어 편리하다.
'공부일기.. > Docker' 카테고리의 다른 글
| [Docker] Spring Boot에서 Docker Compose로 MySQL 환경 구성하기 (0) | 2025.09.15 |
|---|