📚 PHP 최상급 - 3주차: 컨테이너 기술 (Docker) 활용- 03 Docker Compose를 이용한 다중 컨테이너 애플리케이션

2025. 10. 10. 14:19프로그램/PHP 최상급

다중 컨테이너 환경의 필요성: #DockerCompose 이해하기

📚 PHP 최상급 - 3주차: 컨테이너 기술 (Docker) 활용- 03 Docker Compose를 이용한 다중 컨테이너 애플리케이션


지난 시간까지 우리는 단일 #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

YAML
 
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. 실행 명령어

Bash
 
docker-compose up -d
  • up: 서비스에 정의된 모든 컨테이너를 빌드하고 생성합니다
  • -d: 컨테이너를 백그라운드(Detached) 모드로 실행합니다

2. 중지 명령어

Bash
 
docker-compose stop
  • 실행 중인 컨테이너만 중지시키고, 컨테이너와 볼륨 등의 리소스는 유지합니다

3. 완전히 제거 명령어

Bash
 
docker-compose down
  • 실행 중인 컨테이너를 중지시키고, 컨테이너, 네트워크, 볼륨(명령어에 따라)을 모두 제거합니다

4. 로그 확인 명령어

Bash
 
docker-compose logs -f
  • 실행 중인 모든 서비스의 로그를 실시간으로 확인합니다 (-f는 follow 옵션)

결론


#DockerCompose 는 복잡한 다중 컨테이너 #PHP애플리케이션 환경을 단순화하는 필수 도구입니다. YAML 파일 하나로 서비스 정의, 네트워킹, 볼륨 관리가 가능해져 개발 환경의 일관성과 이식성이 극대화됩니다. 이제 단일 컨테이너를 넘어 #DockerCompose 를 활용한 실제 서비스 환경 구축 능력을 갖추게 되었습니다.

 

고정아이피, 월5,500원, VPN, 용도별 클린아이피 제공, 무료테스트

https://vpn.luzensoft.com

 

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