エンジニアリング部システムソリューション課のひよっこエンジニアKと申します。今回の記事では、WPの開発環境をWPイメージを使わずphp7.2-apacheイメージなどで作ったときに必要となってくるモジュールや設定をご紹介します。
Docker環境基本設定など
そもそもなんでWPイメージを使わなかったの?
デプロイ先のルート直下にwordpressを展開したい場合は、dockerの公式WPイメージを使えば問題ありません。今回はルート直下ではなく、下層ディレクトリでwordpressを展開する必要があったため、php7.2-apacheイメージで環境を作ってみました。
今回使ったymlファイルのご紹介
今回使ったymlファイルは以下の通りです。今回はwebコンテナの他に、dbコンテナやphpMyAdmin(pma)コンテナ、smtpコンテナを用意し、proxyでドメインを振り分けています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
version: "3" volumes: db_data: services: web: build: ./web/ container_name: wp_web volumes: - ./root/:/var/www/html/ environment: VIRTUAL_HOST: wp.local CERT_NAME: wp.local HTTPS_METHOD: noredirect links: - db - smtp - proxy proxy: image: jwilder/nginx-proxy container_name: wp_proxy ports: - "80:80" - "443:443" volumes: - "/var/run/docker.sock:/tmp/docker.sock:ro" - "./proxy/keys/:/etc/nginx/certs" db: image: mysql:5.7 container_name: wp_db command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake volumes: - db_data:/var/lib/mysql - ./db/init:/docker-entrypoint-initdb.d/ environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: sample pma: image: phpmyadmin/phpmyadmin:latest container_name: wp_pma environment: PMA_HOST: db VIRTUAL_HOST: pma.wp.local HTTPS_METHOD: noredirect links: - db smtp: image: schickling/mailcatcher container_name: wp_smtp ports: - "1025:1025" environment: VIRTUAL_HOST: mail.wp.local HTTPS_METHOD: noredirect VIRTUAL_PORT: 1080 |
pmaコンテナを用意しておくとデータベースの確認が楽に済むのでおすすめです。smtpコンテナに関しては、wpでフォームの実装を考えていない場合は特に必要ありません。
Docker環境追加設定・モジュールなど
それではここからwebコンテナ用のDockerfileを見ながらDocker環境の追加設定やモジュールなどを見ていきましょう。
Dockerfile中身
Dockerfile全貌はこんな感じです。今回は最初に記述したとおりphp7.2-apacheイメージを使用しています。途中途中で表れる追加設定部分について、以下で詳しく説明していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
FROM php:7.2-apache RUN apt-get update && apt-get -y install git RUN apt-get -q -y install default-mysql-client RUN docker-php-ext-install pdo_mysql mysqli # 追加設定その1 RUN a2enmod rewrite # 追加設定その1ここまで # 追加設定その2 RUN apt-get -y install libxml2-dev RUN docker-php-ext-install \ mbstring \ json \ simplexml \ dom \ fileinfo \ hash \ xml \ iconv RUN apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ mailutils \ memcached \ msmtp \ msmtp-mta \ openssl \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd exif # 追加設定その2ここまで # 番外編設定 COPY ./msmtprc /etc/msmtprc RUN chown www-data:www-data /etc/msmtprc RUN chmod 600 /etc/msmtprc COPY ./php.ini /usr/local/etc/php # 番外編設定ここまで RUN apt-get -y install vim RUN apt-get -y install \ curl \ gnupg RUN curl -sL https://deb.nodesource.com/setup_11.x | bash - RUN apt-get install -y nodejs RUN npm install npm@latest -g RUN apt-get install -y zlib1g-dev \ && docker-php-ext-install zip RUN apt-get install -y unzip EXPOSE 80 COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /composer ENV PATH $PATH:/composer/vendor/bin |
追加設定その1:mod_rewriteの有効設定
Dockerfileの中に、以下の記述があります。
RUN a2enmod rewrite
これはmod_rewriteを有効にする設定です。これを有効にしておかないと、WPをインストールして、中でパーマリンクの設定を変えたとしても、変更が適用されません!意外と忘れがちですが、必ず記述しておきましょう。
追加設定その2: phpモジュールのインストール
Dockerfileの中で複数のモジュールをインストールしている箇所があると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
RUN docker-php-ext-install \ mbstring \ json \ simplexml \ dom \ fileinfo \ hash \ xml \ iconv RUN apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ mailutils \ memcached \ msmtp \ msmtp-mta \ openssl \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd exif |
実はWP用の環境には必要なモジュールが複数あります。例えばgdなどがないと、画像をアップロードしてもサイズごとの切り出しを行ってくれません(デフォルトで用意されているmediumなどのサイズですら切り出しされない)。
必要なモジュールはWordPress公式リファレンスにまとまっているので、できるだけすべてのモジュールをインストールするように記述しましょう。実は今回私が記述したDockerfileではすべてのモジュールはインストールできていないのですが、どのモジュール不足がなんの不具合を起こすかわからない場合は、基本的にすべてのモジュールをインストールしたほうが良さそうです。
(番外編)smtpコンテナを使えるようにするための設定
WPにフォームの導入をしたいとき、ただsmtpコンテナを作って足しただけではsmtpは使えるようになりません。Dockerfileへの追加記述、php.iniの追加、msmtprcファイルの追加が必要です。以下で詳しく説明します。
Dockerfileへの追加記述
1 2 3 4 5 6 7 8 9 |
# MSMTPとvimをインストール RUN apt-get install -y msmtp msmtp-mta vim # MSMTPの設定ファイルを読ませる COPY ./msmtprc /etc/msmtprc # パーミッション設定 RUN chown www-data:www-data /etc/msmtprc RUN chmod 600 /etc/msmtprc # php.iniを読み込ませる COPY ./php.ini /usr/local/etc/php |
msmtp-mtaに関してはsendmailコマンドを使うときにパスを通すような役割をしてくれるため、別の場所で設定すれば特にインストールする必要はありません。
php.iniの追加
webディレクトリに以下のphp.iniを記述します。上記のDockerfileの追加記述の最後で読み込ませているphp.iniです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
log_errors = On error_log = /dev/stderr error_reporting = E_ALL [mail function] ; For Win32 only. ; http://php.net/smtp SMTP = localhost ; http://php.net/smtp-port smtp_port = 1025 ; For Win32 only. ; http://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path ;sendmail_path = /usr/sbin/sendmail -t -i sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc -t" |
先程msmtp-mtaをインストールしなかった場合は、以下の記述を追加する必要があります。
sendmail_path = /usr/sbin/msmtp -t -i
以下の記述がphp.iniに含まれている場合は、コメントアウト(または消去)してから上記の記述を追加するようにしてください。
sendmail_path = /usr/sbin/sendmail -t -i
msmtprcファイルの追加
webディレクトリに以下のmsmtprcファイルも追加します。これもDockerfileでコンテナに読み込ませています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Set default values for all following accounts. defaults auth off tls off tls_trust_file /etc/ssl/certs/ca-certificates.crt syslog on aliases /etc/aliases # MailCatcher account mailcatcher # MailCatcherのコンテナ名 host mailcatcher port 1025 from username@example.com user username password password # Set a default account account default : mailcatcher |
TLS認証チェックをONにしておくと
sendmail: TLS certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown. sendmail: could not send mail (account default from /etc/msmtprc)
というエラーが出るらしいのでOFFにしてあります。今回構築しているのはローカルの開発環境のため、TLS(SSL)の証明書が信頼できなくても特に問題はありません。そもそもSSLがローカル環境においてはあまり必要ありません。
これでコンテナをビルドし直せばOKです。
参考サイト:
Dockerの公式WordPressイメージを使い、下層ディレクトリにある既存のWordPressを動かす – Docker入門
PHP+msmtpとMailCatcherをDockerで動かす
DockerでWordPress開発環境/MSMTPでGmail経由メール送信
dockerのphp-fpmにGDとExifをインストールする
Dockerで立ち上げたwebサーバでmod_rewriteしたかった話