2025. 10. 10. 14:19ㆍ프로그램/PHP 최상급
다중 컨테이너 환경의 필요성: #DockerCompose 이해하기

지난 시간까지 우리는 단일 #PHP애플리케이션 을 위한 #Docker이미지 를 성공적으로 빌드했습니다. 하지만 실제 웹 서비스는 웹 서버(Nginx/Apache), #PHP-FPM, 데이터베이스(MySQL/PostgreSQL), 캐시(Redis/Memcached) 등 최소 3~4개의 개별 서비스가 유기적으로 결합되어 동작하는 다중 컨테이너 환경입니다.
이러한 복잡한 환경을 개별적인 docker run 명령어로 관리하는 것은 비효율적이고 오류 발생 가능성이 높습니다. #DockerCompose 는 이 문제를 해결하기 위해 탄생했습니다.
#DockerCompose 는 YAML 파일 하나를 통해 전체 애플리케이션의 서비스 구성, 네트워크 설정, 볼륨(데이터 저장소)을 한 번에 정의하고, 단 하나의 명령으로 모든 서비스를 동시에 빌드하고 실행할 수 있도록 해주는 도구입니다. 이는 개발 환경 설정의 복잡성을 획기적으로 낮춰줍니다.
Docker Compose 파일 (docker-compose.yml) 기본 구조

#DockerCompose 파일은 일반적으로 docker-compose.yml이라는 이름으로 프로젝트 루트 디렉토리에 위치합니다. 가장 핵심적인 세 가지 요소는 version, services, volumes, networks입니다.
1. services (핵심 서비스 정의)
애플리케이션을 구성하는 각 컨테이너 서비스를 정의합니다
- build: #Dockerfile 이 위치한 경로를 지정하여 이미지를 빌드합니다
- image: 이미 빌드된 #DockerHub 이미지 이름을 사용합니다
- ports: 호스트 머신과 컨테이너 포트를 연결합니다 (호스트포트:컨테이너포트)
- volumes: 영구적인 데이터 저장을 위해 호스트 디렉토리나 명명된 볼륨을 연결합니다
- depends_on: 서비스 간의 종속성을 정의합니다 (예: web은 db가 먼저 시작되어야 함)
2. networks (컨테이너 간 통신 환경)
컨테이너 간 통신을 위한 가상 네트워크를 정의합니다. #DockerCompose 를 사용하면 기본적으로 모든 서비스가 하나의 네트워크에 연결되어 서로 서비스 이름으로 통신할 수 있습니다.
실습: LAMP 스택 (Nginx + PHP + MySQL) 구성하기

이제 #DockerCompose 를 사용하여 가장 기본적인 웹 환경인 Nginx(웹 서버), PHP-FPM(애플리케이션), **MySQL(데이터베이스)**을 결합한 스택을 구성해 보겠습니다.
docker-compose.yml
version: '3.8'
services:
# 1. PHP-FPM 서비스 정의
app:
build:
context: .
dockerfile: Dockerfile # 프로젝트 루트의 Dockerfile 사용
container_name: php-app
restart: always
volumes:
- .:/var/www/html # 현재 디렉토리를 웹 루트와 연결
networks:
- app-network
# 2. Nginx 웹 서버 서비스 정의
web:
image: nginx:stable-alpine
container_name: web-server
restart: always
ports:
- "8080:80" # 호스트의 8080 포트와 컨테이너의 80 포트 연결
volumes:
- .:/var/www/html # PHP 컨테이너와 동일한 코드 볼륨 연결
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # Nginx 설정 파일 연결
depends_on:
- app
networks:
- app-network
# 3. MySQL 데이터베이스 서비스 정의
db:
image: mysql:8.0
container_name: mysql-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: my_app_db
volumes:
- dbdata:/var/lib/mysql # 영구 데이터 저장을 위한 명명된 볼륨 사용
networks:
- app-network
# 볼륨 정의 (데이터베이스 데이터를 영구적으로 저장)
volumes:
dbdata:
# 네트워크 정의 (모든 서비스가 이 네트워크를 통해 통신)
networks:
app-network:
driver: bridge
💡 통신 원리
web 컨테이너(Nginx)는 #PHP애플리케이션 컨테이너를 서비스 이름인 app을 통해 접근합니다 (예: fastcgi_pass app:9000;). 데이터베이스 컨테이너 역시 app 컨테이너에서 서비스 이름인 db를 호스트로 사용하여 접근합니다.
Docker Compose 실행 및 관리 명령어
#DockerCompose 파일 작성이 완료되면, 다음 단 하나의 명령어로 전체 환경을 구축하고 실행할 수 있습니다.
1. 실행 명령어
docker-compose up -d
- up: 서비스에 정의된 모든 컨테이너를 빌드하고 생성합니다
- -d: 컨테이너를 백그라운드(Detached) 모드로 실행합니다
2. 중지 명령어
docker-compose stop
- 실행 중인 컨테이너만 중지시키고, 컨테이너와 볼륨 등의 리소스는 유지합니다
3. 완전히 제거 명령어
docker-compose down
- 실행 중인 컨테이너를 중지시키고, 컨테이너, 네트워크, 볼륨(명령어에 따라)을 모두 제거합니다
4. 로그 확인 명령어
docker-compose logs -f
- 실행 중인 모든 서비스의 로그를 실시간으로 확인합니다 (-f는 follow 옵션)
결론
#DockerCompose 는 복잡한 다중 컨테이너 #PHP애플리케이션 환경을 단순화하는 필수 도구입니다. YAML 파일 하나로 서비스 정의, 네트워킹, 볼륨 관리가 가능해져 개발 환경의 일관성과 이식성이 극대화됩니다. 이제 단일 컨테이너를 넘어 #DockerCompose 를 활용한 실제 서비스 환경 구축 능력을 갖추게 되었습니다.
고정아이피, 월5,500원, VPN, 용도별 클린아이피 제공, 무료테스트
VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN
국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이
vpn.luzensoft.com