docker-compose 사용하기 – 2부. mariadb 추가설정 및 wordpress, nginx 설정

지난 번에 작성하던 docker-compose.yml 파일을 가져왔다.

version: '2.1'
services:
  mariadb:
    container_name: mydb
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PW}
    volumes:
      - /Users/aaaa/con_volumes/mariadb/data:/var/lib/mysql
      - /Users/aaaa/con_volumes/mariadb/conf.d:/etc/mysql/conf.d

1부를 보셨던 분이라면 중요한 정보인 DB의 root 비밀번호를 MYSQL_PW라는 환경변수로 추출했던 것을 기억할 것이다.

환경변수로 추출할 부분이 더 있다. 바로 volumes에서 호스트의 경로 설정 부분이다. 컨테이너는 동일한 환경으로 구축해야 하지만, 로컬의 호스트는 사용자마다 다를 수 있다. 각자가 원하는 환경에서 도커를 구동하기 원할 것이다. 그래서 다음과 같이 환경 변수들을 추출하고, 설정파일 .env와 docker-compose.yml을 각각 다음과 같이 변경하였다.

MYSQL_PW=mypassword
MYSQL_DATA_PATH=/Users/aaaa/con_volumes/mariadb/data
MYSQL_CONFIG_PATH=/Users/aaaa/con_volumes/mariadb/conf.d
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를 컨테이너로 띄울 것이다. 필자는 wordpress를 php 7.1으로 구동하는 fpm으로 띄울 것이며 도커 이미지 경량화를 위해 alpine 리눅스 이미지를 사용할 것이다. 관련 사항을 docker-compose.yml에 추가하려 한다. 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_DATA_PATH=/Users/aaaa/con_volumes/wordpress
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: wordpress
    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_DATA_PATH}:/var/www/html

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

이제 워드프레스 설정은 끝났다. 워드프레스 설정에 사용한 도커 이미지는 php-fpm으로 돌아가므로 nginx에서 proxy pass로 접근하게 할 것이다. nginx 컨테이너 설정도 추가로 해 준다.

# 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
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

일단 위와 같은 설정이면 컨테이너 3개가 모두 정상적으로 뜬다. http://localhost에 접속하면 welcome to nginx! 화면을 볼 수 있다.

이제 nginx에 워드프레스 php-fpm에 대한 proxy_pass를 설정해주면 된다.

그리고 컨테이너 간의 통신을 위해서는 networks 옵션을 사용하면 된다. 사실 지금까지 네트워크 옵션을 주지 않았지만, 자동으로 aaaa_default 라는 네트워크가 생성되어 해당 네트워크를 통해 통신하고 있었던 것이다. 필자는 my-net이라는 네트워크 이름을 지정해서 사용해 보도록 하겠다. 먼저 docker network create my-net 명령으로 네트워크를 생성한 후, 아래와 같이 .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=my-net
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:
      - mynet

  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:
      - mynet

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

networks:
  mynet:
    external:
      name: ${MY_NETWORK}

이제 해당 컨테이너들은 my-net이라는 docker network를 공동으로 사용하게 된다. 같은 네트워크를 사용하는 컨테이너끼리는 대상 호스트명을 컨테이너 이름으로 사용할 수 있게 된다. 그리고 기본 엔직엑스 경로가 아닌 워드프레스를 내보낼 것이므로 내부 컨테이너 포트를 8080으로 변경해 주었다. 이제 엔직엑스 설정 파일 vhosts.conf를 살펴보겠다.

server {
    listen 8080;
    server_name localhost;

    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;
    }
}

컨테이너 내부의 서버 포트는 8080으로 설정해 주었다. 그리고 fastcgi_pass는 docker-compose에서 컨테이너 이름으로 설정해 주었던 mywp를 호스트 이름으로 사용하고 있는 것을 볼 수 있다.

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

간단히 도커 이미지를 사용해서 워드프레스를 띄우는 작업을 함께 해 보았다. 참, 도커 이미지의 버전을 지정하지 않으면 최신 버전이 설치될 수 있으므로 동일한 환경 설정을 위해서 필자는 도커 이미지의 버전을 모두 지정해 보았다. 그리고 docker-compose에는 build 옵션을 사용하여 Dockerfile을 빌드할 수도 있다. 필자는 docker-compose를 적용한 후 자질구레한 중복 쉘 스크립트들을 제거할 수 있었고, 서버 재시작 시에도 안심하고 서버를 띄울 수 있게 되었다. 컨테이너를 효율적으로 관리할 수 있는 도구들이 또 있다고 한다. 좀 더 학습해 보아야겠다.

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

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.