Server

[SSL対応]Docker(docker-compose)でWordPressを起動する – Docker設定編 –

Dockerでフル(ドメイン、SSL対応)のWordPress環境を構築

この記事は前回からの続きとなります。
前回では、サーバーに「Docker」と「docker-compose」を使用出来る状態までにしました。
今回は実際に「docker-compose」のyamlを記述してコンテナを作成します。

この記事の対象者

前回も記載しましたが、Dockerについての詳細な説明はしておりません。
なので、以下の内容はある程度知識として持っておくと理解出来ると思います。

  • Linuxサーバーを自分で用意できる
  • ドメイン(ホスト)を取得できる
  • サーバーに「SSH」でアクセス出来る
  • Docker(docker-compose)の簡単な知識がある
  • サーバーは「IntelCPU」を想定して、CPUが「Arm」の場合は別の設定となります

「docker-compose.yml」の設定

「Docker」のコンテナイメージを管理する「docker-compose.yml」を作成します。
「docker-compose.yml」とは、Dockerのコンテナの設定を記述して、コマンドを実行すると記述した内容のコンテナが一気に作成されるようになります。
これの利点はどのサーバーでも同じものが作成されるようになるため、使い回しが出来てサーバー構築の工数が短縮されます。
ただしサーバーのCPUが異なる場合は動作しない事もあるため、そのCPU専用の設定記述が存在します。
今回は「IntelCPU」を想定した設定で解説します。
まずは「docker-compose.yml」を作成して以下の内容を記述します。

version: "3.8"

services:
  # NginxProxy 以下がバーチャルホストを管理するコンテナとなります。
  nginx-proxy:
    image: jwilder/nginx-proxy:latest
    container_name: nginx-proxy
    privileged: true
    ports:
      - "80:80"
      - "443:443"
    environment:
      - DEFAULT_HOST=example.com  # デフォルトでアクセスするホスト名を記述します
    volumes:
      - proxy:/etc/nginx/vhost.d
      - proxy:/usr/share/nginx/html
      - ./nginx-proxy/conf.d/custom_proxy_settings.conf:/etc/nginx/conf.d/custom_proxy_settings.conf  # nginxの設定ファイルをマウントします。
      - ./nginx-proxy/logs:/var/log/nginx  # Dockerのapacheの設定ファイルをマウントします。
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
    restart: always
    networks:
      - app-net
      - default
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: ""

  # SSL証明書を管理するコンテナとなります。(Let's Encrypt)
  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt
    restart: always
    depends_on:
      - nginx-proxy
    volumes:
      - proxy:/etc/nginx/vhost.d
      - proxy:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
    environment:
      - NGINX_PROXY_CONTAINER=nginx-proxy
    networks:
      - app-net
      - default

  # WordPressのコンテナとなります。
  wordpress:
    build: 
      context: ./Php
      dockerfile: Dockerfile
    container_name: wordpress
    depends_on:
      - wordpressdb
    restart: always
    expose:
      - 80
      - 443
    environment:
      WORDPRESS_DB_HOST: wordpressdb
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: password # データベースのパスワードを設定します。
      WORDPRESS_DB_NAME: wordpress
      VIRTUAL_HOST: example.com  # このWordPressにアクセスするホスト名を設定します。
      VIRTUAL_PORT: 80
      LETSENCRYPT_HOST: example.com  # このWordPressにアクセスするホスト名を設定します。
      LETSENCRYPT_EMAIL: info@example.com
    volumes:
      - ./wordpress/html:/var/www/html  # ここにWordPressのソースコードのフォルダのマウントとなります。
      - ./wordpress/log:/var/log/apache2  # Dockerのapacheの設定ファイルをマウントします。
      - ./Php/php.ini:/usr/local/etc/php/php.ini # PHPの設定ファイルをマウントします。
    networks:
      - app-net
      - default

  # WordPressで使用するデータベースのコンテナ
  wordpressdb:
    image: mariadb
    restart: always
    volumes:
      - ./wp_mariadb/db_data:/docker-entrypoint-initdb.d
      - ./wp_mariadb/data:/var/lib/mysql
      - ./wp_mariadb/logs:/var/log/mysql
      - ./wp_mariadb/conf.d/my.cnf:/etc/mysql/conf.d/my.cnf
    expose:
      - 3306
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: password # データベースのパスワードを設定します。
      MYSQL_ROOT_PASSWORD: root_password # データベースのRootパスワードを設定します。
      TZ: Asia/Tokyo
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - app-net
      - default

  # phpMyAdminのコンテナ
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - wordpressdb
    restart: always
    expose:
      - 88
    ports:
      - 88:80
    volumes:
      - ./wp_phpmyadmin/sessions:/sessions
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: wordpressdb
      PMA_USER: root
      PMA_PASSWORD: root_password # データベースのRootパスワードを設定します。
    networks:
      - app-net
      - default

# 共有ネットワーク
networks:
  app-net:
    driver: bridge
# マウントボリューム
volumes:
  db_data:
  proxy:

上記について解説します。
nginx-proxy」では、バーチャルホストの管理を行います。
ここで「example.com」にアクセスした場合に「wordpress」のコンテナにアクセスするようになります。
letsencrypt」では、SSL証明書を管理し、WordPressのサイトが「https」でアクセスできるようになります。
wordpress」は、そのままWordPressのイメージとなります。
接続するデータベースの設定やアクセスするドメインやSSLのドメインを設定します。 Dockerイメージを作成すると「wordpress/html」にWordPressのソースファイル一式が作成されます。
wordpressdb」はWordPressで使用するデータベースのコンテナとなります。
接続するデータベースのパスワードとRootのパスワードを設定しておいてください。
phpmyadmin」は、「phpMyAdmin」というツールのコンテナとなります。
これを使用する場合はサーバーのポートの「88」を開けておく必要があります。
また以下のファイルをそれぞれ作成しておきます。

「Dockerfile」の設定

FROM wordpress:6.1.1-php8.2-apache

# Run apt command
RUN apt-get update \
    && apt-get install -y \
            g++ \
            libicu-dev \
            libpq-dev \
            libzip-dev \
            unzip \
            zip \
            zlib1g-dev \
            libonig-dev \
            vim

# CP php.ini
RUN cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini

CMD ["apache2-foreground"]

wordpress:6.1.1-php8.2-apache」のイメージファイル名は、こちらを元に最新の情報を確認してください。

「custom_proxy_settings.conf」の設定

client_max_body_size 10g;
proxy_request_buffering off;

proxy_buffers 8 32K;
proxy_buffer_size 32k;
proxy_busy_buffers_size 64k;

設定としてはファイルのアップロードのサイズを変更して、セッションを保持して画面遷移する場合にヘッダーのサイズが大きい場合にエラーが表示される事があるため、サイズを変更して対処しております。

「php.ini」の設定

php.ini」はデフォルトのものから必要に応じて変更したファイルを用意します。
ファイルの内容が長いため、ここからダウンロードしてください。
※上記の「php.ini」はアップロードできるファイルサイズを変更してるものとなります。

ファイル構成

上記作成設定したファイルは以下のファイル構成にします。

docker-compose.yml
nginx-proxy/
 conf.d/
  custom_proxy_settings.conf
Php/
  Dockerfile
  php.ini

サーバーへアップロード

上記で用意したファイル一式をサーバーにアップロードします。
WinSCPやFileZiila等のアップロードツールでサーバーに接続して、適当な場所にフォルダを作成します。
例えば「/home/{ログインユーザー}/docker」などとします。
そこに上記のファイル一式をアップロードします。

「Docker」の起動

SSHでサーバーに接続して、上記作成したフォルダに移動します。

$ cd /home/{ログインユーザー}/docker

以下のコマンドを入力することでDockerイメージが作成して起動します。

$ docker-compose up -d

これでブラウザでドメインにアクセスするとWordPressの初期化画面が表示されたら成功となります。
エラーが発生した場合はエラー内容を確認して対応をしてください。

サーバーのログ

このDockerには「wordpress/log」と「nginx-proxy/logs」にそれぞれのログを出力するようにしております。
これによりサーバーのエラー時にログで確認する事ができます。
保守などで使用してください。