IT기술/도커 (docker)

Docker Compose 정의 파일 완벽 가이드: 아파치와 워드프레스 컨테이너 실행 예제

후스파 2025. 7. 18. 07:34
반응형

도커 컴포즈(Docker Compose)는 여러 컨테이너를 정의하고 관리할 수 있는 도구입니다. 이 포스트에서는 도커 컴포즈 정의 파일을 작성하는 방법과 아파치 및 워드프레스를 컨테이너로 실행하는 예제를 살펴보겠습니다.


도커 컴포즈 정의 파일 구성

도커 컴포즈는 YAML 형식으로 작성된 정의 파일을 사용하여 컨테이너를 실행합니다. 이 정의 파일은 반드시 필요하며, 일반적으로 docker-compose.yml라는 이름으로 저장됩니다. 파일의 확장자는 .yml입니다.

기본 구조

도커 컴포즈 정의 파일의 기본 구조는 다음과 같습니다:

version: "3.8"

services:
  서비스명:
    image: 이미지명
    ports:
      - 호스트포트:컨테이너포트
    restart: 항상/재시작 정책

아파치 컨테이너 생성

아파치 웹 서버를 실행하는 도커 컴포즈 정의 파일의 예시는 다음과 같습니다:

version: "3.8"

services:
  apaex111:
    image: httpd
    ports:
      - 8080:80
    restart: always
    volumes:
      - ./html:/usr/local/apache2/htdocs
    environment:
      - APACHE_LOG_LEVEL=warn

위의 예시에서 apaex111이라는 서비스는 httpd 이미지를 사용하며, 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다. 컨테이너가 종료되면 항상 재시작됩니다.

도커 명령어 예시

위의 도커 컴포즈 파일을 사용하는 대신, 다음과 같은 명령어로 아파치 컨테이너를 실행할 수 있습니다:

docker run --name apaex111 -d -p 8080:80 httpd

워드프레스 컨테이너 생성

워드프레스를 실행하기 위한 도커 컴포즈 정의 파일 예시는 다음과 같습니다:

version: "3.8"

services:
  wordpressex001:
    depends_on:
      - mysqlex001
    image: wordpress
    networks:
      - wordpressnet001
    volumes:
      - wordpressvol001:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=mysqlex001
      - WORDPRESS_DB_NAME=wordpressdb001
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpresspasswd

이 예시에서 wordpressex001 서비스는 mysqlex001 서비스에 의존하며, wordpress 이미지를 사용합니다. 또한, wordpressnet001이라는 네트워크에 연결되고, wordpressvol001이라는 볼륨을 /var/www/html에 마운트합니다.

도커 명령어 예시

워드프레스를 도커 명령어로 실행하려면 다음과 같이 입력합니다:

docker run --name wordpressex001 -dit --net=wordpressnet001 -p 8085:80 \
-e WORDPRESS_DB_HOST=mysqlex001 \
-e WORDPRESS_DB_NAME=wordpressdb001 \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=wordpresspasswd wordpress

도커 컴포즈 정의 파일 작성 방법

도커 컴포즈 정의 파일은 YAML 포맷을 따르며, 다음과 같은 규칙을 준수해야 합니다:

YAML 작성 규칙

  • 주요 항목 기입: version, services, networks, volumes을 차례로 기입합니다
  • 들여쓰기 규칙: 탭 대신 공백을 사용하여 들여쓰기를 합니다. 각 단계마다 공백의 수를 배수로 늘려야 합니다
  • 주석 사용: # 기호를 사용하여 주석을 추가할 수 있습니다
  • 문자열 감싸기: 문자열은 홑따옴표(') 또는 쌍따옴표(")로 감싸야 합니다

도커 컴포즈 주요 항목

항목 설명 예시
services 컨테이너를 정의합니다 web:, database:
networks 네트워크를 정의합니다 frontend:, backend:
volumes 볼륨을 정의합니다 db_data:, web_data:

도커 컴포즈 services 기본 항목

항목 설명 예시
image 사용할 이미지를 지정합니다 nginx:latest
networks 접속할 네트워크를 지정합니다 - frontend
volumes 스토리지 마운트를 지정합니다 - ./data:/app/data
ports 포트 설정을 지정합니다 - "8080:80"
environment 환경변수를 설정합니다 NODE_ENV=production
depends_on 다른 서비스에 대한 의존관계를 정의합니다 - database
restart 컨테이너 종료 시 재시작 여부를 설정합니다 always

도커 컴포즈 실행 후 수정

도커 컴포즈로 실행된 컨테이너는 도커 엔진에서 수정이 가능합니다. 하지만 엔진에서 수정하더라도 도커 컴포즈 정의 파일에는 반영되지 않으니 유의해야 합니다.

실행 중인 컨테이너 수정 방법

# 컨테이너 내부 접근
docker exec -it wordpress_wordpressex001_1 /bin/bash

# 설정 파일 수정
docker exec -it wordpress_wordpressex001_1 vi /var/www/html/wp-config.php

# 컨테이너 재시작
docker-compose restart wordpressex001

전체 예시

아래는 MySQL과 워드프레스를 포함한 전체 도커 컴포즈 정의 파일입니다:

version: "3.8"

services:
  mysqlex001:
    image: mysql:8.4
    networks:
      - wordpressnet001
    volumes:
      - mysqlvol001:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=rootpasswd
      - MYSQL_DATABASE=wordpressdb001
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpresspasswd
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --default-authentication-plugin=mysql_native_password

  wordpressex001:
    depends_on:
      - mysqlex001
    image: wordpress
    networks:
      - wordpressnet001
    volumes:
      - wordpressvol001:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=mysqlex001
      - WORDPRESS_DB_NAME=wordpressdb001
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpresspasswd
      - WORDPRESS_TABLE_PREFIX=wp_

networks:
  wordpressnet001:
    driver: bridge

volumes:
  mysqlvol001:
  wordpressvol001:

이 정의 파일을 사용하여 MySQL과 워드프레스 컨테이너를 동시에 실행할 수 있습니다.

실행 및 관리 명령어

# 서비스 시작
docker-compose up -d

# 서비스 상태 확인
docker-compose ps

# 로그 확인
docker-compose logs -f

# 서비스 중지 및 제거
docker-compose down

# 볼륨까지 함께 제거
docker-compose down -v

고급 설정 예시

version: "3.8"

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
    depends_on:
      - wordpressex001
    networks:
      - wordpressnet001

  wordpressex001:
    depends_on:
      - mysqlex001
      - redis
    image: wordpress:php8.2-apache
    networks:
      - wordpressnet001
    volumes:
      - wordpressvol001:/var/www/html
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    restart: unless-stopped
    environment:
      - WORDPRESS_DB_HOST=mysqlex001
      - WORDPRESS_DB_NAME=wordpressdb001
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpresspasswd
      - WORDPRESS_CONFIG_EXTRA=|
        define('WP_REDIS_HOST', 'redis');
        define('WP_REDIS_PORT', 6379);

  mysqlex001:
    image: mysql:8.4
    networks:
      - wordpressnet001
    volumes:
      - mysqlvol001:/var/lib/mysql
      - ./mysql.cnf:/etc/mysql/conf.d/custom.cnf:ro
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=rootpasswd
      - MYSQL_DATABASE=wordpressdb001
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpresspasswd

  redis:
    image: redis:7-alpine
    networks:
      - wordpressnet001
    volumes:
      - redisvol001:/data
    restart: unless-stopped
    command: redis-server --appendonly yes

networks:
  wordpressnet001:
    driver: bridge

volumes:
  mysqlvol001:
  wordpressvol001:
  redisvol001:

이러한 설정을 통해 Nginx 리버스 프록시, Redis 캐시, 그리고 커스텀 설정이 포함된 완전한 워드프레스 환경을 구축할 수 있습니다.

반응형