docker-compose WordPress 세팅 – 2부. wordpress, nginx 설정

지난 1부에서는 docker-compose WordPress 세팅을 위한 mariadb 설정에 대해 다루었습니다. 2부에서는 wordpress와 nginx 설정을 통해서 워드프레스를 구동해 보도록 하겠습니다.

docker-compose WordPress 설정

여기에서는 WordPress를 컨테이너로 띄울 것입니다. WordPress를 php 7.1으로 구동하는 fpm으로 띄울 것이며 도커 이미지 경량화를 위한 alpine 리눅스 이미지를 사용할 것입니다. 관련 사항을 docker-compose.yml에 추가하겠습니다. 1부에서 mariadb의 환경변수를 추출했던 것처럼 .env에 환경 변수는 별도로 설정합니다.

# MYSQL
MYSQL_PW=mypassword
MYSQL_DATA_PATH=/Users/aaaa/con_volumes/mariadb/data
MYSQL_CONFIG_PATH=/Users/aaaa/con_volumes/mariadb/conf.d

# WORDPRESS
WP_DB_USER=root
WP_DB_PASSWORD=mypassword
WP_DB_NAME=my_wp_db
WP_WWW_PATH=/Users/aaaa/con_volumes/wordpress
.env
version: '2.1'
services:
  mariadb:
    container_name: mydb
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PW}
    volumes:
      - ${MYSQL_DATA_PATH}:/var/lib/mysql
      - ${MYSQL_CONFIG_PATH}:/etc/mysql/conf.d
  wordpress:
    container_name: mywp
    image: wordpress:4.8.3-php7.1-fpm-alpine
    restart: always
    environment:
      - WORDPRESS_DB_HOST=mydb
      - WORDPRESS_DB_USER=${WP_DB_USER}
      - WORDPRESS_DB_PASSWORD=${WP_DB_PASSWORD}
      - WORDPRESS_DB_NAME=${WP_DB_NAME}
      - WORDPRESS_TABLE_PREFIX=wp_
    volumes:
      - ${WP_WWW_PATH}:/var/www/html
YAML

본 포스팅에서는 편의상 WP_DB_USER를 root로 설정했습니다. 실제 상황에서는 maria db에서 적절한 권한을 가진 사용자를 만들고 적어주면 됩니다.

docker-compose Nginx 설정

이제 워드프레스 설정은 끝났습니다. Nginx 설정을 시작해 보겠습니다. 워드프레스 설정에 사용한 도커 이미지는 php-fpm으로 돌아가므로 nginx에서 proxy pass로 접근하게 할 것입니다. nginx 컨테이너를 추가로 설정해 줍니다.

version: '2.1'
services:
  mariadb:
    container_name: mydb
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PW}
    volumes:
      - ${MYSQL_DATA_PATH}:/var/lib/mysql
      - ${MYSQL_CONFIG_PATH}:/etc/mysql/conf.d
  wordpress:
    container_name: mywp
    image: wordpress:4.8.3-php7.1-fpm-alpine
    restart: always
    environment:
      - WORDPRESS_DB_HOST=mydb
      - WORDPRESS_DB_USER=${WP_DB_USER}
      - WORDPRESS_DB_PASSWORD=${WP_DB_PASSWORD}
      - WORDPRESS_DB_NAME=${WP_DB_NAME}
      - WORDPRESS_TABLE_PREFIX=wp_
    volumes:
      - ${WP_WWW_PATH}:/var/www/html
  nginx:
    container_name: mynginx
    image: nginx:1.12.2-alpine
    restart: always
    ports:
      - 80:80
    volumes:
      - ${WP_WWW_PATH}:/var/www/html
YAML

일단 위와 같은 설정이면 mydb, mywp, mynginx 총 3개의 컨테이너가 모두 정상적으로 뜹니다. http://localhost로 접속하면 welcome to nginx! 화면을 볼 수 있습니다.

그리고 컨테이너 간의 통신을 위해서는 networks 옵션을 사용하면 됩니다. 사실 지금까지 네트워크 옵션을 주지 않았지만, 자동으로 aaaa_default 와 같은 네트워크가 생성되어 해당 네트워크를 통해 통신하고 있었던 것입니다.

여기에서는 mynet이라는 이름을 네트워크 이름으로 사용해 보겠습니다. 아래와 같이 .env와 compose 파일을 각각 설정해 줍니다.

# MYSQL
MYSQL_PW=mypassword
MYSQL_DATA_PATH=/Users/aaaa/con_volumes/mariadb/data
MYSQL_CONFIG_PATH=/Users/aaaa/con_volumes/mariadb/conf.d

# WORDPRESS
WP_DB_USER=root
WP_DB_PASSWORD=mypassword
WP_DB_NAME=my_wp_db
WP_WWW_PATH=/Users/aaaa/con_volumes/wordpress

# NGINX
NGINX_VHOSTS=/Users/aaaa/con_volumes/nginx/vhosts.conf

# NETWORK
MY_NETWORK=mynet
.env
version: '2.1'

services:
  mariadb:
    container_name: mydb
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PW}
    volumes:
      - ${MYSQL_DATA_PATH}:/var/lib/mysql
      - ${MYSQL_CONFIG_PATH}:/etc/mysql/conf.d
    networks:
      - ${MY_NETWORK}

  wordpress:
    container_name: mywp
    image: wordpress:4.8.3-php7.1-fpm-alpine
    restart: always
    environment:
      - WORDPRESS_DB_HOST=mydb
      - WORDPRESS_DB_USER=${WP_DB_USER}
      - WORDPRESS_DB_PASSWORD=${WP_DB_PASSWORD}
      - WORDPRESS_DB_NAME=${WP_DB_NAME}
      - WORDPRESS_TABLE_PREFIX=wp_
    volumes:
      - ${WP_WWW_PATH}:/var/www/html
    networks:
      - ${MY_NETWORK}

  nginx:
    container_name: mynginx
    image: nginx:1.12.2-alpine
    restart: always
    ports:
      - 80:80
    volumes:
      - ${NGINX_VHOSTS}:/etc/nginx/conf.d/vhosts.conf
      - ${WP_WWW_PATH}:/var/www/html
    networks:
      - ${MY_NETWORK}

networks:
  mynet:
    name: ${MY_NETWORK}
YAML

이제 해당 컨테이너들은 mynet이라는 docker network를 공동으로 사용하게 됩니다. 같은 네트워크를 사용하는 컨테이너끼리는 대상 호스트명을 컨테이너 이름으로 사용할 수 있게 됩니다. docker –link 옵션 대신 docker network 사용(도커 컨테이너 연결) 문서에서 관련 사항을 참고하시면 됩니다.

이제 엔직엑스 설정 파일 vhosts.conf를 살펴보겠습니다. nginx에 워드프레스 php-fpm에 대한 fastcgi_pass를 설정해줄 차례입니다. php 파일은 fastcgi_pass로 처리하지만, 나머지 이미지나 리소스들은 nginx에서 처리해야 하므로 라인 5와 같이 root 경로 설정이 필요합니다.

server {
    listen 80;
    server_name mywp.example.com;

    root /var/www/html;
    index index.php;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass mywp:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}
Nginx

그리고 라인 14에서 fastcgi_pass 값으로 docker-compose에서 컨테이너 이름으로 설정해 주었던 mywp를 호스트 이름으로 사용하고 있는 것을 볼 수 있습니다.

모든 설정이 다 되었다면, docker-compose로 컨테이너를 띄웁니다. 이제 웹 브라우저를 실행하고 mywp.example.com에 접속해 보면, 워드프레스 설정 화면을 만나볼 수 있습니다.

하지만 이 상태로 상용 서비스를 하면 안되겠죠? 보안 이슈가 있습니다. SSL을 사용해서 Nginx를 구동해야 하는데, 이 부분에 대해서는 Docker Nginx Let’s Encrypt 인증서 발급 및 자동갱신에서 자세히 다루어놨으니 필요한 분들은 참고하시기 바랍니다.

정리

간단히 도커 이미지를 사용해서 워드프레스를 띄우는 작업을 해 보았습니다. 참, 도커 이미지의 버전을 지정하지 않으면 최신 버전이 설치될 수 있으므로 동일한 환경 설정을 위해서 도커 이미지의 버전을 모두 지정했습니다. 하지만 제가 문서를 업데이트 하면서 알게된 사실은 최신 도커에서는 이제 version이 deprecated 됐다는 거, 기억하시죠?

그리고 docker-compose에는 build 옵션을 사용하여 Dockerfile을 빌드할 수도 있습니다. 저는 docker-compose를 적용한 후 자질구레한 중복 쉘 스크립트들을 제거할 수 있었고, 서버 재시작 시에도 안심하고 서버를 띄울 수 있게 되었습니다.

아직도 docker run으로 컨테이너를 띄우고 계신 분이 있다면, docker-compose 적용을 시도해 볼 것을 권합니다. 이것으로 2부로 docker-compose 활용에 대한 포스팅을 마칩니다.

관련자료

docker-compose spec 문서를 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment