[도커] Docker와 Docker Compose의 차이점

2025. 12. 2. 22:30·공부일기../Docker

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
'공부일기../Docker' 카테고리의 다른 글
  • [Docker] Spring Boot에서 Docker Compose로 MySQL 환경 구성하기
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    ERD
    StringTokenizer
    인프라 기초
    SpringBoot
    리팩토링
    swagger
    TDD
    spring boot
    자바
    ADC 환경
    spring
    항해플러스
    다짐
    React
    스프링부트
    BufferedReader
    Paging
    JPA
    MySQL
    항해99
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[도커] Docker와 Docker Compose의 차이점
상단으로

티스토리툴바