지난 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
.envversion: '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
.envversion: '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 문서를 참고했습니다.