G: 안녕하세요! 복잡한 개발 환경 설정 때문에 머리 아팠던 경험, 다들 있으시죠? 🤯 특히 여러 개의 컨테이너가 얽혀 있는 애플리케이션을 다룰 때는 더욱 그렇습니다. 하지만 걱정 마세요! 오늘 이 가이드를 통해 Docker Compose라는 강력한 도구를 사용하여 이러한 복잡성을 한 방에 해결하는 방법을 알려드릴게요.
이 글은 도커 컴포즈를 처음 접하는 분들을 위해 가장 기본적인 개념부터 실제 예시를 통한 docker-compose.yml
파일 작성까지, 모든 과정을 단계별(Step-by-Step)로 자세히 설명합니다. 이 가이드를 마치고 나면 어떤 멀티 컨테이너 애플리케이션이라도 손쉽게 배포하고 관리할 수 있게 될 거예요! 🚀
목차 📚
- Docker Compose, 왜 필요할까요?
- Docker Compose 핵심 개념 이해하기
docker-compose.yml
파일 작성 시작하기: Nginx 단일 서비스 예시- 여러 서비스 연결하기: WordPress (웹 애플리케이션) 예시
- 자주 사용하는 추가 설정 옵션 살펴보기
- 필수 Docker Compose 명령어
- 마무리하며: 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가 포함되어 있습니다)이 설치되어 있어야 합니다.
- 설치 방법: Docker Desktop 공식 웹사이트에서 다운로드하여 설치할 수 있습니다.
- 기본적인 터미널 사용법.
단계 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: db
는db
서비스의 이름을 사용하여 통신하겠다는 의미입니다.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에 마운트
- Named Volumes (이름 지정 볼륨): Docker가 관리하는 영구 저장소. 주로 데이터베이스처럼 중요한 데이터를 보존할 때 사용합니다.
-
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! 🐳💖