화. 8월 12th, 2025

G: 안녕하세요! 복잡한 개발 환경 설정 때문에 머리 아팠던 경험, 다들 있으시죠? 🤯 특히 여러 개의 컨테이너가 얽혀 있는 애플리케이션을 다룰 때는 더욱 그렇습니다. 하지만 걱정 마세요! 오늘 이 가이드를 통해 Docker Compose라는 강력한 도구를 사용하여 이러한 복잡성을 한 방에 해결하는 방법을 알려드릴게요.

이 글은 도커 컴포즈를 처음 접하는 분들을 위해 가장 기본적인 개념부터 실제 예시를 통한 docker-compose.yml 파일 작성까지, 모든 과정을 단계별(Step-by-Step)로 자세히 설명합니다. 이 가이드를 마치고 나면 어떤 멀티 컨테이너 애플리케이션이라도 손쉽게 배포하고 관리할 수 있게 될 거예요! 🚀


목차 📚

  1. Docker Compose, 왜 필요할까요?
  2. Docker Compose 핵심 개념 이해하기
  3. docker-compose.yml 파일 작성 시작하기: Nginx 단일 서비스 예시
  4. 여러 서비스 연결하기: WordPress (웹 애플리케이션) 예시
  5. 자주 사용하는 추가 설정 옵션 살펴보기
  6. 필수 Docker Compose 명령어
  7. 마무리하며: Docker Compose로 개발 생산성 높이기

1. Docker Compose, 왜 필요할까요? 🤔

도커(Docker)는 애플리케이션을 격리된 환경인 컨테이너에 담아 배포하는 데 혁명적인 변화를 가져왔습니다. 하지만 실제 서비스는 데이터베이스, 캐시 서버, 웹 서버, 백엔드 등 여러 개의 컨테이너가 유기적으로 연결되어 동작하는 경우가 대부분이죠.

문제점: 만약 우리가 웹 애플리케이션을 만든다고 가정해볼까요? 보통 다음과 같은 컨테이너들이 필요합니다.

  • 웹 서버 (Nginx 또는 Apache)
  • 애플리케이션 서버 (Node.js, Python Flask, PHP-FPM 등)
  • 데이터베이스 (MySQL, PostgreSQL 등)
  • 캐시 서버 (Redis, Memcached 등)

이 컨테이너들을 일일이 수동으로 실행하고, 서로 통신하도록 네트워크를 설정하고, 데이터를 영구적으로 저장할 볼륨을 연결하는 것은 상당히 번거롭고 실수하기 쉽습니다. 🤔

해결책: Docker Compose! 💡 Docker Compose는 이러한 복잡한 멀티 컨테이너 Docker 애플리케이션을 정의하고 실행하는 도구입니다. YAML 파일을 사용하여 애플리케이션의 모든 서비스를 한 번에 구성하고, 이 파일 하나로 모든 컨테이너를 한 번에 시작하거나 중지할 수 있죠. 마치 오케스트라의 지휘자가 되어 모든 악기를 한 번에 통솔하는 것과 같습니다! 🎼

Docker Compose의 주요 장점:

  • 간편한 환경 설정: 복잡한 명령어 없이 .yml 파일 하나로 모든 컨테이너 환경을 정의합니다.
  • 재현성: 개발, 테스트, 운영 환경을 동일하게 유지하여 “내 컴퓨터에서는 되는데…” 같은 문제를 줄여줍니다.
  • 빠른 개발 시작: 팀원 모두가 동일한 개발 환경을 빠르게 구축할 수 있습니다.
  • 단일 명령어 관리: docker compose up 명령어 하나로 전체 애플리케이션을 실행할 수 있습니다.

2. Docker Compose 핵심 개념 이해하기 🧠

docker-compose.yml 파일을 작성하기 전에 몇 가지 핵심 개념을 알아두면 좋습니다.

  • version:
    • docker-compose.yml 파일의 버전입니다. 현재 가장 널리 사용되는 버전은 3.x대입니다. 버전에 따라 사용할 수 있는 기능이나 문법이 조금씩 다를 수 있습니다.
  • services:
    • 가장 중요한 섹션입니다. 애플리케이션을 구성하는 각각의 컨테이너를 정의합니다. 각 서비스는 독립적인 컨테이너로 실행됩니다.
    • 예: web, db, app
  • image:
    • 해당 서비스가 사용할 Docker 이미지 이름을 지정합니다. Docker Hub에서 가져오거나 로컬에 빌드된 이미지를 사용할 수 있습니다.
    • 예: nginx:latest, mysql:8.0
  • build:
    • image 대신 특정 Dockerfile을 사용하여 이미지를 직접 빌드하도록 지정할 때 사용합니다.
    • 예: build: . (현재 디렉토리의 Dockerfile 사용)
  • ports:
    • 컨테이너의 포트와 호스트 머신(로컬 컴퓨터)의 포트를 연결합니다. 호스트포트:컨테이너포트 형식으로 작성합니다.
    • 예: "80:80" (호스트의 80번 포트를 컨테이너의 80번 포트에 연결)
  • volumes:
    • 컨테이너의 데이터를 영구적으로 저장하거나, 호스트 머신의 파일을 컨테이너 내부에 마운트할 때 사용합니다.
    • 바인드 마운트: 호스트경로:컨테이너경로 (예: ./app:/var/www/html)
    • 볼륨 마운트: 볼륨이름:컨테이너경로 (데이터 영속성을 위해 Docker가 관리하는 볼륨 사용)
  • environment:
    • 컨테이너 내부에 전달할 환경 변수를 정의합니다. 데이터베이스 비밀번호나 API 키 등을 설정할 때 유용합니다.
    • 예: MYSQL_ROOT_PASSWORD: mysecretpassword
  • networks:
    • 서비스들이 서로 통신할 수 있도록 네트워크를 정의하고 연결합니다. 기본적으로 bridge 네트워크가 생성되지만, 명시적으로 정의하는 것이 좋습니다.
  • depends_on:
    • 특정 서비스가 다른 서비스보다 먼저 시작되어야 함을 명시합니다. 예를 들어, 웹 서버는 데이터베이스보다 먼저 시작되면 안 되겠죠? (⚠️ 주의: depends_on은 시작 순서만 보장하며, 서비스가 ‘준비되었음’을 보장하지는 않습니다. 애플리케이션 코드 레벨에서 준비 상태를 확인하는 것이 더 견고합니다.)

3. docker-compose.yml 파일 작성 시작하기: Nginx 단일 서비스 예시 🌐

가장 간단한 예시부터 시작해봅시다. Nginx 웹 서버 하나를 Docker Compose로 띄워볼 거예요.

준비물:

  • Docker Desktop (Docker Engine과 Docker Compose가 포함되어 있습니다)이 설치되어 있어야 합니다.
  • 기본적인 터미널 사용법.

단계 1: 새 디렉토리 생성 및 이동 먼저, 작업을 위한 새 디렉토리를 만들고 그 안으로 이동합니다.

mkdir my-nginx-app
cd my-nginx-app

단계 2: docker-compose.yml 파일 생성 my-nginx-app 디렉토리 안에 docker-compose.yml 파일을 생성합니다. (파일명은 반드시 docker-compose.yml 또는 compose.yaml이어야 합니다.)

touch docker-compose.yml

단계 3: docker-compose.yml 파일 내용 작성 docker-compose.yml 파일을 열고 다음 내용을 작성합니다.

# docker-compose.yml
version: '3.8' # Docker Compose 파일 형식 버전 지정

services: # 컨테이너 서비스들을 정의하는 섹션
  web: # 'web'이라는 서비스 이름 (원하는 이름으로 지정 가능)
    image: nginx:latest # 사용할 도커 이미지 지정 (Nginx 최신 버전)
    ports: # 포트 매핑 (호스트 포트:컨테이너 포트)
      - "80:80" # 호스트의 80번 포트를 컨테이너의 80번 포트에 연결
    container_name: my-nginx-web # 컨테이너 이름 지정 (선택 사항)
    restart: always # 컨테이너가 항상 재시작되도록 설정 (오류 발생 시에도)

코드 설명:

  • version: '3.8': Docker Compose 파일의 버전을 3.8로 설정합니다.
  • services:: 우리가 실행할 서비스들을 정의하는 부분입니다.
  • web:: 이 서비스의 이름은 web입니다. 이 이름을 사용하여 컨테이너를 참조할 수 있습니다.
  • image: nginx:latest: 이 서비스는 nginx 이미지의 최신 버전을 사용합니다.
  • ports: - "80:80": 호스트 컴퓨터의 80번 포트로 들어오는 요청을 web 컨테이너의 80번 포트로 전달합니다. 이제 웹 브라우저에서 localhost (또는 127.0.0.1)로 접속하면 Nginx 웹 페이지를 볼 수 있습니다.
  • container_name: my-nginx-web: 생성될 컨테이너의 이름을 my-nginx-web으로 명시적으로 지정합니다.
  • restart: always: 컨테이너가 어떤 이유로든 종료되면 항상 다시 시작하도록 설정합니다. (예: 시스템 재부팅, 컨테이너 내부 오류)

단계 4: Docker Compose 애플리케이션 실행 docker-compose.yml 파일이 있는 디렉토리에서 다음 명령어를 실행합니다.

docker compose up -d
  • docker compose up: docker-compose.yml 파일에 정의된 서비스들을 시작합니다.
  • -d (detached mode): 컨테이너들을 백그라운드에서 실행하고 터미널을 다시 사용할 수 있게 합니다. 이 옵션이 없으면 컨테이너 로그가 터미널에 계속 출력됩니다.

확인: 웹 브라우저를 열고 http://localhost 또는 http://127.0.0.1로 접속해보세요. “Welcome to nginx!” 페이지가 보인다면 성공입니다! 🎉

단계 5: Docker Compose 애플리케이션 중지 및 삭제 서비스를 중지하고 컨테이너를 제거하려면 다음 명령어를 사용합니다.

docker compose down
  • docker compose down: docker-compose.yml 파일에 정의된 모든 서비스의 컨테이너를 중지하고 제거합니다. 기본적으로 네트워크도 제거합니다. (볼륨은 제거하지 않습니다. 볼륨까지 제거하려면 docker compose down --volumes를 사용하세요.)

4. 여러 서비스 연결하기: WordPress (웹 애플리케이션) 예시 🌐💾

이제 좀 더 복잡한 예시를 다뤄봅시다. 데이터베이스와 연동되는 대표적인 웹 애플리케이션인 WordPress를 Docker Compose로 배포해볼 거예요. WordPress는 웹 서버(Nginx), PHP-FPM(WordPress 엔진), 데이터베이스(MySQL)의 세 가지 주요 구성 요소가 필요합니다.

구성 요소:

  • Nginx: 웹 서버 역할 (정적 파일 서빙, PHP-FPM으로 요청 전달)
  • PHP-FPM: WordPress 코드를 실행하는 PHP 프로세스 매니저
  • MySQL: WordPress 데이터베이스 저장

단계 1: 새 디렉토리 생성 및 이동

mkdir my-wordpress-app
cd my-wordpress-app

단계 2: Nginx 설정 파일 준비 Nginx가 PHP-FPM과 WordPress 파일을 올바르게 서빙하도록 설정 파일이 필요합니다. my-wordpress-app 디렉토리 안에 nginx라는 새 디렉토리를 만들고 그 안에 nginx.conf 파일을 생성합니다.

mkdir nginx
touch nginx/nginx.conf

nginx/nginx.conf 파일 내용:

# nginx/nginx.conf
events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    server {
        listen 80;
        server_name localhost;
        root /var/www/html;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            # php-fpm 서비스 이름을 사용하여 통신
            fastcgi_pass php-fpm:9000; # <--- PHP-FPM 컨테이너의 서비스 이름 (php-fpm)과 포트 (9000)
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
}

핵심: fastcgi_pass php-fpm:9000; 이 부분은 Nginx가 php-fpm이라는 이름의 서비스(컨테이너)의 9000번 포트로 PHP 요청을 전달하라는 의미입니다. Docker Compose의 기본 네트워크 덕분에 서비스 이름으로 서로 통신할 수 있습니다.

단계 3: docker-compose.yml 파일 작성 my-wordpress-app 디렉토리 안에 docker-compose.yml 파일을 생성하고 다음 내용을 작성합니다.

# docker-compose.yml
version: '3.8'

services:
  # 1. MySQL 데이터베이스 서비스
  db:
    image: mysql:8.0 # MySQL 8.0 이미지 사용
    container_name: wordpress_db # 컨테이너 이름 지정
    environment: # 환경 변수 설정
      MYSQL_ROOT_PASSWORD: your_strong_password # ⚠️ 보안을 위해 실제 서비스에서는 안전한 비밀번호 사용하거나 .env 파일로 관리하세요!
      MYSQL_DATABASE: wordpress # 워드프레스에서 사용할 데이터베이스 이름
      MYSQL_USER: wordpressuser # 워드프레스에서 사용할 사용자 이름
      MYSQL_PASSWORD: wordpresspassword # 워드프레스에서 사용할 사용자 비밀번호
    volumes: # 데이터 영속성을 위한 볼륨 마운트
      - db_data:/var/lib/mysql # 'db_data' 볼륨에 MySQL 데이터 저장
    networks: # 이 서비스가 속할 네트워크 지정
      - wordpress_network # 아래에서 정의할 네트워크에 연결

  # 2. PHP-FPM 서비스 (워드프레스 코어)
  php-fpm:
    build: # 이미지를 직접 빌드 (워드프레스 파일을 포함하기 위해)
      context: . # 현재 디렉토리에서 Dockerfile을 찾음
      dockerfile: Dockerfile.php-fpm # 사용할 Dockerfile 이름 지정
    container_name: wordpress_php_fpm
    volumes: # 워드프레스 파일 및 PHP 설정 파일 마운트
      - ./wordpress:/var/www/html # 호스트의 ./wordpress 디렉토리를 컨테이너의 /var/www/html에 마운트
    environment: # 환경 변수 설정
      # 워드프레스가 DB에 연결할 정보 (db 서비스 이름 사용)
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpressuser
      WORDPRESS_DB_PASSWORD: wordpresspassword
      WORDPRESS_DB_NAME: wordpress
    depends_on: # db 서비스가 먼저 시작되어야 함을 명시
      - db
    networks:
      - wordpress_network

  # 3. Nginx 웹 서버 서비스
  nginx:
    image: nginx:latest # Nginx 최신 이미지 사용
    container_name: wordpress_nginx
    ports: # 포트 매핑
      - "80:80" # 호스트의 80번 포트를 컨테이너의 80번 포트에 연결
    volumes: # Nginx 설정 파일과 워드프레스 파일 마운트
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # Nginx 설정 파일 마운트 (읽기 전용)
      - ./wordpress:/var/www/html:ro # 워드프레스 파일 마운트 (읽기 전용)
    depends_on: # php-fpm 서비스가 먼저 시작되어야 함을 명시
      - php-fpm
    networks:
      - wordpress_network

# 4. 볼륨 정의 (데이터 영속성)
volumes:
  db_data: # MySQL 데이터 저장용 볼륨

# 5. 네트워크 정의 (서비스 간 통신)
networks:
  wordpress_network: # 'wordpress_network'라는 이름의 브릿지 네트워크 생성
    driver: bridge # 브릿지 드라이버 사용 (기본값)

코드 설명:

  • db 서비스:

    • image: mysql:8.0: MySQL 8.0 버전을 사용합니다.
    • environment: MySQL 접속에 필요한 환경 변수(MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD)를 설정합니다. 이 값들은 WordPress가 데이터베이스에 접속할 때 사용됩니다.
    • volumes: - db_data:/var/lib/mysql: db_data라는 이름의 볼륨을 생성하여 MySQL의 데이터 디렉토리(var/lib/mysql)에 마운트합니다. 이렇게 하면 컨테이너가 삭제되어도 데이터는 유지됩니다.
    • networks: - wordpress_network: wordpress_network라는 이름의 커스텀 네트워크에 연결하여 다른 서비스들과 통신할 수 있도록 합니다.
  • php-fpm 서비스:

    • build: . / dockerfile: Dockerfile.php-fpm: 직접 Dockerfile.php-fpm을 사용하여 이미지를 빌드합니다. (아래에서 이 Dockerfile을 생성할 것입니다.)
    • volumes: - ./wordpress:/var/www/html: 호스트의 wordpress 디렉토리를 컨테이너의 /var/www/html에 마운트합니다. 여기에 워드프레스 파일이 들어갈 것입니다.
    • environment: 워드프레스가 데이터베이스에 연결하는 데 필요한 환경 변수(WORDPRESS_DB_HOST, WORDPRESS_DB_USER 등)를 설정합니다. 여기서 WORDPRESS_DB_HOST: dbdb 서비스의 이름을 사용하여 통신하겠다는 의미입니다.
    • depends_on: - db: php-fpm 서비스는 db 서비스가 시작된 후에 시작되도록 설정합니다.
  • nginx 서비스:

    • image: nginx:latest: Nginx 이미지를 사용합니다.
    • ports: - "80:80": 호스트의 80번 포트를 Nginx 컨테이너의 80번 포트에 연결합니다.
    • volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro- ./wordpress:/var/www/html:ro: 위에서 만든 Nginx 설정 파일과 워드프레스 파일들을 각각 해당 경로에 마운트합니다. :ro는 읽기 전용(read-only)을 의미합니다.
    • depends_on: - php-fpm: nginx 서비스는 php-fpm 서비스가 시작된 후에 시작되도록 설정합니다.
  • volumes 섹션:

    • db_data:: db 서비스에서 사용할 db_data 볼륨을 선언합니다. Docker가 이 볼륨을 관리하며 데이터 영속성을 제공합니다.
  • networks 섹션:

    • wordpress_network:: wordpress_network라는 이름의 커스텀 브릿지 네트워크를 정의합니다. 이 네트워크에 연결된 서비스들은 서로 서비스 이름을 통해 통신할 수 있습니다.

단계 4: PHP-FPM을 위한 Dockerfile 준비 my-wordpress-app 디렉토리 안에 Dockerfile.php-fpm 파일을 생성하고 다음 내용을 작성합니다.

# Dockerfile.php-fpm
FROM php:8.1-fpm-alpine # PHP-FPM Alpine 리눅스 기반 이미지 사용 (경량화)

# 필요한 PHP 확장 설치
RUN apk add --no-cache \
    mysql-client \
    php-mysqli \
    php-dom \
    php-xml \
    php-mbstring \
    php-gd \
    php-curl \
    php-json \
    php-zip \
    php-fileinfo

# 워드프레스 최신 버전 다운로드 및 압축 해제
RUN curl -o /tmp/wordpress.tar.gz -SL https://wordpress.org/latest.tar.gz \
    && tar -xzf /tmp/wordpress.tar.gz -C /var/www/html --strip-components=1 \
    && rm /tmp/wordpress.tar.gz

WORKDIR /var/www/html

# 실행 권한 설정 (Docker Compose 볼륨 마운트 시 필요)
RUN chown -R www-data:www-data /var/www/html
RUN find /var/www/html -type d -exec chmod 755 {} +
RUN find /var/www/html -type f -exec chmod 644 {} +

EXPOSE 9000 # PHP-FPM 기본 포트
CMD ["php-fpm"]

Dockerfile 설명:

  • FROM php:8.1-fpm-alpine: PHP 8.1 FPM 버전의 Alpine 리눅스 이미지를 기반으로 합니다.
  • RUN apk add ...: 워드프레스 실행에 필요한 PHP 확장들을 설치합니다.
  • RUN curl ...: 워드프레스 최신 버전을 다운로드하여 /var/www/html 디렉토리에 압축을 해제합니다. 이렇게 하면 컨테이너를 실행할 때 워드프레스 파일이 자동으로 준비됩니다.
  • WORKDIR /var/www/html: 작업 디렉토리를 /var/www/html로 설정합니다.
  • RUN chown ...: 워드프레스 파일의 소유권과 권한을 www-data 사용자로 변경합니다. (웹 서버가 해당 파일을 읽고 쓸 수 있도록)
  • EXPOSE 9000: 9000번 포트를 외부에 노출합니다. Nginx가 이 포트로 PHP 요청을 전달합니다.

단계 5: Docker Compose 애플리케이션 실행 docker-compose.yml 파일이 있는 my-wordpress-app 디렉토리에서 다음 명령어를 실행합니다.

docker compose up -d

이 명령어는 MySQL 이미지 다운로드, PHP-FPM 이미지 빌드 및 워드프레스 다운로드, Nginx 이미지 다운로드 후 모든 컨테이너를 실행하는 과정을 자동으로 처리합니다. 시간이 다소 소요될 수 있습니다. ⏳

확인: 웹 브라우저를 열고 http://localhost로 접속해보세요. 워드프레스 설치 화면이 나타난다면 성공입니다! 🎉 화면 지시에 따라 설치를 진행하면 됩니다. (데이터베이스 정보는 docker-compose.yml 파일에 설정한 wordpress, wordpressuser, wordpresspassword, db를 사용하세요.)

단계 6: Docker Compose 애플리케이션 중지 및 삭제

docker compose down

데이터베이스 볼륨까지 완전히 삭제하려면:

docker compose down --volumes

5. 자주 사용하는 추가 설정 옵션 살펴보기 🛠️

docker-compose.yml 파일에는 더 많은 유용한 설정들이 있습니다. 몇 가지 중요한 옵션들을 알아봅시다.

  • build (심화):

    • context: Dockerfile이 있는 경로를 지정합니다. 기본값은 . (현재 디렉토리)입니다.
    • dockerfile: 사용할 Dockerfile의 이름을 지정합니다. 기본값은 Dockerfile입니다.
    • args: 빌드 시점에 Dockerfile 내부로 전달할 인수를 지정합니다.
      services:
        my_app:
          build:
            context: .
            dockerfile: Dockerfile
            args:
              NODE_VERSION: "16" # Dockerfile에서 ARG NODE_VERSION으로 받을 수 있음
  • environment (환경 변수):

    • 단순히 키-값 형태로 지정할 수 있습니다.
    • .env 파일을 사용하여 환경 변수를 관리할 수 있습니다. docker-compose.yml 파일과 같은 디렉토리에 .env 파일을 만들고 변수를 정의하면, docker-compose.yml에서 ${VAR_NAME} 형식으로 사용할 수 있습니다. 이는 특히 민감한 정보(비밀번호 등)를 관리할 때 매우 중요합니다! 🔒
      # .env 파일 예시
      DB_USER=myuser
      DB_PASSWORD=mysecret
      # docker-compose.yml (DB_USER와 DB_PASSWORD는 .env 파일에서 가져옴)
      services:
        db:
          image: postgres
          environment:
            POSTGRES_USER: ${DB_USER}
            POSTGRES_PASSWORD: ${DB_PASSWORD}
  • volumes (심화):

    • Named Volumes (이름 지정 볼륨): Docker가 관리하는 영구 저장소. 주로 데이터베이스처럼 중요한 데이터를 보존할 때 사용합니다.
      services:
        db:
          volumes:
            - my_db_data:/var/lib/mysql
      volumes:
        my_db_data: # 최상위 레벨에 볼륨 정의
    • Bind Mounts (바인드 마운트): 호스트 파일 시스템의 특정 경로를 컨테이너에 직접 마운트합니다. 개발 중 소스 코드 변경 사항을 즉시 반영할 때 유용합니다.
      services:
        app:
          volumes:
            - ./my_source_code:/app # 호스트의 ./my_source_code를 컨테이너의 /app에 마운트
  • networks (심화):

    • 기본 bridge 외에 다른 네트워크 드라이버도 사용할 수 있습니다.
    • 여러 Compose 프로젝트 간에 컨테이너를 연결하거나, 복잡한 인프라를 구축할 때 유용합니다.
  • restart (재시작 정책):

    • no: 기본값, 컨테이너 종료 시 재시작 안 함.
    • on-failure: 비정상 종료(exit code != 0) 시에만 재시작.
    • always: 컨테이너가 종료되면 항상 재시작.
    • unless-stopped: 컨테이너를 수동으로 중지하기 전까지 항상 재시작.

6. 필수 Docker Compose 명령어 🛠️

docker-compose.yml 파일을 작성했다면, 다음 명령어들을 사용하여 애플리케이션을 관리할 수 있습니다. (참고: Docker Compose V2부터는 docker-compose 대신 docker compose 명령어를 사용합니다.)

  • docker compose up:

    • docker-compose.yml 파일에 정의된 모든 서비스를 시작합니다. 이미지가 없으면 다운로드하거나 빌드합니다.
    • -d: 백그라운드에서 실행 (detached mode).
    • --build: 이미지 변경 사항이 없더라도 강제로 이미지를 다시 빌드합니다.
    docker compose up -d
  • docker compose down:

    • 실행 중인 모든 서비스를 중지하고 컨테이너, 네트워크를 제거합니다.
    • --volumes 또는 -v: 서비스와 연결된 볼륨까지 함께 제거합니다. (데이터가 삭제되니 주의!)
    • --rmi all: 서비스 이미지도 함께 제거합니다.
    docker compose down
    docker compose down --volumes
  • docker compose ps:

    • 현재 프로젝트의 실행 중인 서비스들의 상태를 보여줍니다.
    docker compose ps
  • docker compose logs [서비스_이름]:

    • 서비스의 컨테이너 로그를 출력합니다.
    • -f 또는 --follow: 실시간으로 로그를 계속 출력합니다.
    docker compose logs -f nginx
    docker compose logs db
  • docker compose exec [서비스_이름] [명령어]:

    • 실행 중인 특정 서비스 컨테이너 내부에서 명령어를 실행합니다. 디버깅이나 설정 변경 시 유용합니다.
    docker compose exec db bash # db 컨테이너 내부로 bash 셸 접속
    docker compose exec php-fpm ls -l /var/www/html # php-fpm 컨테이너의 특정 경로 파일 목록 확인
  • docker compose build [서비스_이름]:

    • build 지시자가 있는 서비스의 이미지를 다시 빌드합니다.
    docker compose build php-fpm
  • docker compose restart [서비스_이름]:

    • 특정 서비스 또는 모든 서비스를 재시작합니다.
    docker compose restart
    docker compose restart web

7. 마무리하며: Docker Compose로 개발 생산성 높이기 ✨

축하합니다! 🎉 이제 Docker Compose의 기본적인 개념과 실제 멀티 컨테이너 애플리케이션을 배포하는 방법을 모두 익히셨습니다. Docker Compose는 개발 환경을 간소화하고, 팀원 간의 협업을 용이하게 하며, CI/CD 파이프라인 구축에도 큰 도움을 주는 강력한 도구입니다.

기억할 점:

  • docker-compose.yml 파일은 여러분의 애플리케이션 아키텍처를 정의하는 청사진입니다.
  • 환경 변수(environment)와 볼륨(volumes)을 잘 활용하여 유연하고 영속적인 환경을 구축하세요.
  • 다양한 명령어들을 익혀두면 문제 해결과 관리에 큰 도움이 됩니다.

이제 이 가이드에서 배운 지식을 바탕으로 여러분만의 멋진 멀티 컨테이너 애플리케이션을 Docker Compose로 구축해보세요! 궁금한 점이나 더 심화된 내용은 언제든 구글 검색이나 공식 문서를 참고하시면 됩니다. 📚

Happy Dockering! 🐳💖

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다