Docker Compose

 

Docker Compose란?

Docker Compose는 여러 개의 Docker 컨테이너를 한 번에 관리할 수 있도록 도와주는 툴이다.

docker-compose.yml 파일을 사용해서 컨테이너 실행, 네트워크 연결, 볼륨 마운트 등의 작업을 자동화할 수 있다.

 

주요 기능

  1. 여러 컨테이너를 한 번에 실행
  2. 환경변수 관리
  3. 네트워크 자동 설정
  4. 볼륨을 통한 데이터 유지
  5. 간단한 명령어로 배포 자동화 가능

 

예제

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