Docker Compose 1

2025. 6. 16. 13:55·Infra/Docker

Docker를 사용하다 보면 필연적으로 마주치게 되는 문제가 있습니다. 단일 컨테이너만으로는 실제 서비스를 구성하기 어렵다는 점입니다. 웹 애플리케이션을 운영하려면 프론트엔드 서버, 백엔드 API 서버, 데이터베이스, 캐시 서버 등 여러 컨테이너가 함께 동작해야 합니다. 각각의 컨테이너를 개별적으로 관리하는 것은 복잡하고 비효율적입니다. Docker Compose는 이러한 문제를 해결하여 여러 컨테이너를 하나의 서비스로 정의하고 통합 관리할 수 있게 해주는 도구입니다.

Docker Compose의 핵심 가치

복잡성 제거와 표준화

Docker Compose의 가장 큰 장점은 복잡한 Docker CLI 명령어들을 YAML 파일 하나로 대체할 수 있다는 점입니다. 긴 옵션들과 매개변수들로 가득한 docker run 명령어 대신, 직관적이고 읽기 쉬운 설정 파일로 컨테이너를 정의할 수 있습니다.

예를 들어, 다음과 같은 복잡한 명령어를 매번 입력하는 대신:

docker run -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 \
  -v /Users/seungyeon/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql \
  -d mysql

간단한 YAML 파일로 동일한 작업을 수행할 수 있습니다.

services:
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - /Users/seungyeon/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql
    ports:
      - 3306:3306

서비스 단위의 관리 개념

Docker Compose에서는 각각의 컨테이너를 서비스(service)라는 개념으로 다룹니다. 이는 단순히 컨테이너를 실행하는 것을 넘어서, 전체 시스템을 구성하는 하나의 구성 요소로 바라보는 관점입니다. 이러한 접근 방식은 마이크로서비스 아키텍처와도 자연스럽게 연결됩니다.

Docker Compose 파일 작성하기

기본 구조 이해하기

Docker Compose 파일의 가장 기본적인 형태부터 살펴보겠습니다. compose.yml 파일을 생성하고 다음 내용을 작성해보겠습니다.

services:
  my-web-server:
    container_name: webserver
    image: nginx
    ports: 
      - 80:80

이 파일의 구조를 분석해보면 다음과 같습니다. YAML 파일은 들여쓰기로 계층을 구분하므로 정확한 들여쓰기가 중요합니다. 반드시 탭이 아닌 스페이스를 사용해야 합니다.

services 섹션 하위에 정의된 my-web-server는 서비스 이름입니다. 이는 Docker Compose 내에서 이 컨테이너를 식별하는 고유한 이름으로 사용됩니다.

container_name은 실제 생성될 컨테이너의 이름을 지정하며, CLI에서 --name 옵션과 동일한 역할을 합니다. image는 사용할 Docker 이미지를 명시하고, ports는 포트 매핑을 설정합니다.

Compose 파일 실행과 관리

작성한 compose 파일을 실행하는 것은 매우 간단합니다.

docker compose up -d

-d 옵션을 사용하면 백그라운드에서 실행되어 터미널을 계속 사용할 수 있습니다. 실행 현황은 다음 명령어로 확인할 수 있습니다.

docker compose ps

이 명령어는 compose.yml에 정의된 컨테이너 중 실행 중인 것들만 보여줍니다. 모든 컨테이너를 확인하고 싶다면 -a 옵션을 추가하면 됩니다.

컨테이너 사용이 끝나면 다음 명령어로 정리할 수 있습니다.

docker compose down

이 명령어는 compose로 생성된 모든 컨테이너를 중지하고 삭제합니다.

실전 활용 사례들

Redis 캐시 서버 구성하기

데이터 캐싱을 위한 Redis 서버를 Docker Compose로 구성해보겠습니다.

services:
  my-cache-server:
    image: redis
    ports:
      - 6379:6379

Redis의 기본 포트인 6379를 호스트의 동일한 포트로 매핑했습니다. 컨테이너가 실행되면 Redis 클라이언트로 접속하여 정상 동작을 확인할 수 있습니다.

# 컨테이너 접속
docker exec -it [컨테이너명] bash

# Redis CLI 실행 후 테스트
redis-cli
set mykey "Hello Compose"
get mykey

MySQL 데이터베이스와 볼륨 연동

실제 프로젝트에서는 데이터 영속성이 중요하므로 볼륨과 함께 MySQL을 설정해보겠습니다.

services:
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306

여기서 주목할 점은 environment 섹션입니다. 이는 컨테이너 실행 시 환경변수를 설정하는 기능으로, CLI의 -e 옵션과 동일합니다. volumes 섹션을 통해 현재 디렉토리의 mysql_data 폴더와 컨테이너의 데이터 디렉토리를 연결하여 데이터를 영속적으로 보존할 수 있습니다.

커스텀 애플리케이션 배포하기

Spring Boot 애플리케이션 컨테이너화

실제 개발한 Spring Boot 애플리케이션을 Docker Compose로 배포하는 과정을 살펴보겠습니다. 먼저 Dockerfile을 작성합니다.

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar /app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

애플리케이션을 빌드한 후 compose.yml 파일을 작성합니다.

./gradlew clean build
services:
  my-server:
    build: .
    ports:
      - 8080:8080

여기서 build: .는 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드하라는 의미입니다. 기존에 만들어진 이미지를 사용하는 image 옵션과는 다른 접근 방식입니다.

실행 시에는 --build 옵션을 추가하여 이미지를 새로 빌드하도록 합니다.

docker compose up -d --build

Node.js 기반 애플리케이션들

Nest.js나 Next.js 같은 Node.js 기반 애플리케이션도 유사한 방식으로 배포할 수 있습니다. Nest.js의 경우 다음과 같은 Dockerfile을 사용합니다.

FROM node

WORKDIR /app

COPY . .

RUN npm install

RUN npm run build

EXPOSE 3000

ENTRYPOINT [ "node", "dist/main.js" ]

.dockerignore 파일로 불필요한 파일들을 제외합니다.

node_modules

compose.yml 파일은 다음과 같이 작성합니다.

services:
  my-server:
    build: .
    ports:
      - 3000:3000

Next.js의 경우에는 프로덕션 모드로 실행하기 위해 Dockerfile을 약간 수정합니다.

FROM node:20-alpine

WORKDIR /app

COPY . .

RUN npm install

RUN npm run build

EXPOSE 3000

ENTRYPOINT [ "npm", "run", "start" ]

compose.yml에서는 호스트의 80번 포트로 접근할 수 있도록 매핑을 변경할 수 있습니다.

services:
  my-web-server:
    build: .
    ports:
      - 80:3000

정적 웹사이트 배포

HTML, CSS로 구성된 정적 웹사이트는 Nginx를 사용하여 매우 간단하게 배포할 수 있습니다.

FROM nginx 
COPY ./ /usr/share/nginx/html
services:
  my-web-server:
    build: .
    ports:
      - 80:80

고급 Docker Compose 기능들

로그 통합 관리

여러 서비스의 로그를 한 번에 확인하고 싶을 때는 다음 명령어를 사용할 수 있습니다.

docker compose logs

이 명령어는 compose.yml에 정의된 모든 컨테이너의 로그를 시간순으로 정렬하여 보여줍니다. 특정 서비스의 로그만 확인하고 싶다면 서비스 이름을 추가하면 됩니다.

이미지 관리 최적화

개발 과정에서 이미지를 자주 업데이트해야 할 때는 다음 명령어들이 유용합니다.

# 이미지 다운로드 및 업데이트
docker compose pull

# 강제 재빌드와 함께 실행
docker compose up --build -d

pull 명령어는 compose.yml에 정의된 외부 이미지들을 최신 버전으로 업데이트하고, --build 옵션은 로컬에서 빌드하는 이미지들을 강제로 재빌드합니다.

마무리

Docker Compose는 컨테이너 오케스트레이션을 위한 최적의 도구입니다. 복잡한 CLI 명령어들을 YAML 파일로 추상화하여 관리를 용이하게 하고, 여러 컨테이너를 하나의 서비스 단위로 묶어서 관리할 수 있게 해줍니다.

'Infra > Docker' 카테고리의 다른 글

AWS EC2에 서버 배포  (2) 2025.06.18
Docker Compose 2  (3) 2025.06.17
Dockerfile  (3) 2025.06.13
Docker Volume  (4) 2025.06.09
자주 사용되는 Docker CLI  (6) 2025.06.07
'Infra/Docker' 카테고리의 다른 글
  • AWS EC2에 서버 배포
  • Docker Compose 2
  • Dockerfile
  • Docker Volume
leve68
leve68
leve68 님의 블로그 입니다.
  • leve68
    leve68
    leve68
  • 전체
    오늘
    어제
    • 분류 전체보기
      • BackEnd
        • Spring Framework
        • Database
      • FrontEnd
        • JavaScript
        • Vue
      • Infra
        • Docker
        • CI CD
      • CS
        • Algorithm
      • Project
        • Web
  • 인기 글

  • 태그

    MySQL
    docker
    SSAFY
    springboot
    spring security
    MyBatis
    compose
    DATABASE
    Spring
    sql
  • 링크

    • github
    • portfolio
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
leve68
Docker Compose 1
상단으로

티스토리툴바