Docker Compose란?
Docker Compose는 여러 개의 Docker 컨테이너를 한 번에 관리할 수 있도록 도와주는 툴이다.
docker-compose.yml 파일을 사용해서 컨테이너 실행, 네트워크 연결, 볼륨 마운트 등의 작업을 자동화할 수 있다.
주요 기능
- 여러 컨테이너를 한 번에 실행
- 환경변수 관리
- 네트워크 자동 설정
- 볼륨을 통한 데이터 유지
- 간단한 명령어로 배포 자동화 가능
예제
Nginx + MySQL을 실행하는 기본적인 docker-compose.yml
version: '3' # Docker Compose 버전
services:
nginx: # 웹 서버 서비스
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # 설정 파일 마운트
environment:
- 환경변수
command: 명령어
depends_on:
- mysql # MySQL이 실행된 후 시작됨
mysql: # 데이터베이스 서비스
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: testdb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- mysql_data:/var/lib/mysql # 데이터 저장
volumes:
mysql_data: # MySQL 데이터 유지
명령어 | 설명 |
docker-compose up -d | 백그라운드에서 컨테이너 실행 |
docker-compose down | 컨테이너 중지 및 삭제 |
docker-compose ps | 실행 중인 컨테이너 목록 확인 |
docker-compose logs -f | 컨테이너 실시간 로그 확인 |
docker-compose exec 서비스명 bash | 특정 컨테이너 내부 접속 |
실습
1. Nginx 서버 2개 만들고 Haproxy로 부하분산하게 설정한 docker-compose.yml
docker-compose.yml
version: '3'
services:
haproxy:
image: haproxy:latest
container_name: haproxy
ports:
- "8000:80"
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro # HAProxy 설정 파일
depends_on:
- nginx1
- nginx2
nginx1:
image: nginx:latest
container_name: nginx1
volumes:
- ./nginx1/index.html:/usr/share/nginx/html/index.html:ro # nginx1의 index.html
nginx2:
image: nginx:latest
container_name: nginx2
volumes:
- ./nginx2/index.html:/usr/share/nginx/html/index.html:ro # nginx2의 index.html
haproxy.cfg
global
log stdout format raw local0
maxconn 256
defaults
log global
mode http
timeout connect 5s
timeout client 50s
timeout server 50s
frontend http_front
bind *:80 # HAProxy가 80번 포트에서 요청을 받음
default_backend nginx_back # 요청을 backend 그룹으로 전달
backend nginx_back
balance roundrobin # 라운드로빈 방식으로 분산
server nginx1 nginx1:80 check
server nginx2 nginx2:80 check
volume은 로컬 경로에 맞게 잘 설정하면 된다!
2. Nginx에 프론트 배포하고 backend랑 db랑 연결되게 설정한 docker-compose.yml
docker-compose.yml
version: '3'
services:
front:
image: nginx:latest
container_name: front
ports:
- "8001:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx1/dist:/usr/share/nginx/html/
depends_on:
- backend
backend:
image: openjdk:17-ea-slim-buster
container_name: backend
working_dir: /app
volumes:
- ./backend/myapp.jar:/app/myapp.jar
command: ["java","-jar","/app/myapp.jar"]
environment:
SPRING_DATASOURCE_URL: jdbc:mariadb://mariadb:3306/mydatabase
SPRING_DATASOURCE_USERNAME: myuser
SPRING_DATASOURCE_PASSWORD: mypassword
depends_on:
- mariadb
mariadb:
image: mariadb:latest
container_name: mariadb
restart: always
ports:
- "3307:3306" # 로컬 3307 -> 컨테이너 3306
environment:
MARIADB_ROOT_PASSWORD: mypassword
MARIADB_DATABASE: mydatabase
MARIADB_USER: myuser
MARIADB_PASSWORD: mypassword
volumes:
- mariadb_data:/var/lib/mysql # DB 데이터 유지
volumes:
mariadb_data:
nginx.conf
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://backend:8080; # Spring Boot로 요청 전달
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
spring boot의 application.yml
server:
port: 8080
spring:
application:
name: myapp
datasource:
url: ${SPRING_DATASOURCE_URL}
driver-class-name: org.mariadb.jdbc.Driver
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
jpa:
database-platform: org.hibernate.dialect.MariaDBDialect
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
type: trace
'Docker' 카테고리의 다른 글
Dockerfile 가이드 (0) | 2025.03.11 |
---|---|
Docker services 내부 설정 상세 정리 (0) | 2025.03.10 |
Docker Desktop에서 container 실행해보기 (0) | 2025.03.10 |
Window에서 도커 설치 (0) | 2025.03.10 |
VM에 Docker 설치하기 (0) | 2025.03.10 |