【WordPress/Docker】開発環境を構築
前提
Dockerの環境構築が終わっていること。
コンテナ名やパスワード等は適宣、置き換えてください。
環境
- Windows 10 Pro
- Docker v4.12.0
- WordPress v6.1
- PHP v7.4
- apache
- MySQL v8.0.18
ディレクトリ構造
wordpress-blog
├─docker
│  ├─mysql
│  │  ├─costom.cnf
│  │  ├─Dockerfile
│  └─wordpress
│     ├─Dockerfile
│  └─.env
│  └─docker-compose.yml
└─web
準備
version: "3.8"
services:
  wordpress_web:
    build:
      context: ../
      dockerfile: ./docker/wordpress/Dockerfile
    image: wordpress_web
    container_name: wordpress_web
    ports:
      - "8080:80"
      - "443:443"
    volumes:
      - ../web:/var/www/html
    links:
      - wordpress_db
  wordpress_db:
    build:
      context: ../
      dockerfile: ./docker/mysql/Dockerfile
    image: wordpress_db
    container_name: wordpress_db
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: useruser
      MYSQL_PASSWORD: passpass
    ports:
      - "3306:3306"
    volumes:
      - ../docker/mysql/custom.cnf:/etc/mysql/conf.d/custom.cnf
      - wordpress_db_data:/var/lib/mysql
volumes:
  wordpress_db_data:
COMPOSE_PROJECT_NAME=wordpress
# syntax=docker/dockerfile:1
FROM php:7.4-apache
RUN apt-get update
RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libzip-dev zip libicu-dev
RUN docker-php-ext-install pdo pdo_mysql mysqli iconv gd
# syntax=docker/dockerfile:1
FROM mysql:8.0.18
# When your application needs to interact with UTF-8.
ENV LANG C.UTF-8
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
max_allowed_packet=32M
[client]
default-character-set=utf8mb4
WordPressのインストール
wordpress ダウンロードページ

ダウンロードしたWordPressのzipファイルを解凍し、「Web」ディレクトリにコピーしておく。
コピー後のディレクトリ構造は以下のようになっています。
wordpress-blog
├─docker
│  ├─mysql
│  │  ├─costom.cnf
│  │  ├─Dockerfile
│  └─wordpress
│     ├─Dockerfile
└─web
    ├─wp-admin
    ├─wp-content
    ├─wp-include
省略
Docker 立ち上げ
powershellなどで、wordpress-blog/dockerのディレクトリにcdコマンドで移動し、下記コマンドを実行。
docker compose up --build
Dockerのビルドが終わったら、
にブラウザにアクセスすると、WordPressのセットアップの画面になります。

docker-compose.ymlで設定したものを入れましょう。

情報に間違いなければ次の画面へ進みますので、インストールを実行します。

WordPressのログイン画面の設定になります。
好きなものでいいですが、ログインに必要になりますので、忘れずにメモしておきましょう。

先程、設定したログイン情報でログインすると無事にWordPressの管理画面になりました。

よく使うコマンド
| コマンド | 内容 | 
|---|---|
| docker-compose up | コンテナを作成して、起動します。オプションで-dをつけることでバックグラウンドで実行することができます。 | 
| docker-compose start | サービスを開始します。これは既にコンテナがある状態でなければなりません。 | 
| docker-compose stop | サービスを停止します。 | 
| docker-compose build | サービス(wordpress_web,wordpress_db)のビルドを実行します。 | 
| docker ps | コンテナの一覧を表示します. | 
| docker exec -it コンテナ名 sh | コンテナへ入る。 | 
| docker ps でコンテナ名 | (Namesのとこ)調べることができる。 | 
| mysql -u root -p | mysqlにrootで接続。 | 
※パスワードは、docker-compose.ymlの「MYSQL_ROOT_PASSWORD: rootpass」のところ。
プラグインをインストールする時にFTP情報を求められる場合の対処法
Dockerで構築した後、プラグインなどをインストールしようとすると、FTPの情報を求められることがあります。

対処法
wp-config.php のファイルに、
define('FS_METHOD','direct');
を追記します。(私は一番下に追記しました)
画面を更新して、再度チャレンジしてみると無事プラグインをインストールできました。
すでにあるWordPressの環境を作りたいなら「All-in-One WP Migration」のプラグインがおすすめ
※SiteGurdのプラグインをインストールしている場合は、無効化しておいた方がいいです。
コピー元のWordPressに「All-in-One WP Migration」のプラグインをインストールし、データをエクスポート。開発環境のWordPressにも、「All-in-One WP Migration」を使ってデータをインポートする。

作業は、プラグインをインストールして、有効化していれば、管理画面の左ツールバーに出ています。
「サイトの最大アップロードサイズを超過しています: 2 MB」 が出たときの対処法

web/.htaccess のファイルを編集します。
end wordpressの下に追記しました。
# END WordPress
php_value memory_limit 30G
php_value post_max_size 20G
php_value upload_max_filesize 10G
画面を更新し、再度アップロードを試していると無事に成功しました。
SiteGurdのプラグインでエラーが出てログインできなくなった場合の対処法
SiteGurdでエラーが出てログインできません。

データベースから無効化するのは、大変そうなので、
wp-content/plugins/sitegurd
のディレクトリ名を適当に変更してあげます。
ログイン画面を更新すると無事にログインすることができました。
パーマリンクを変更すると、404エラーでページが表示されないときの対処法
固定ページを自分で決めたURLにしたく、パーマリンクの設定を変えました。

すると、うまくページが表示されなくなってしまいました。。。
.htaccess
apache2.conf
の順で確認していきます。
.htaccessを見てみると、
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
こちらはきちんと設定が反映されています。(ここに何も記載されていなかったら権限が原因?)
条件が 「RewriteEngine On」の時に~となっているので、こちらがOFFになっているなどの原因がありそうです。
apache.confのAllowOverrideを変更
Dockerのコンテナの中に入りコマンドを入力していきます。
私の環境のコンテナ名はwordpress_webでした。
docker exec -it wordpress_web sh
rewriteのモジュールがちゃんとあるか確認。
ls -l /usr/lib/apache2/modules/mod_rewrite.so
-rw-r--r-- 1 root root 67624 Apr  3 22:22 
/usr/lib/apache2/modules/mod_rewrite.so
apache2.confの編集。ファイルの場所は、/etc/apache2/apache2.conf
変更前
<Directory /var/www/>                              
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted                               
</Directory>
変更後
<Directory /var/www/>                                                               
    Options Indexes FollowSymLinks 
    AllowOverride All             
    Require all granted                     
</Directory>
apacheの再起動
service apache2 restart
ここまで設定しても、まだエラーが解消されません。
調べてみると、httpdのファイルを編集する記事が多くでてくるのですが、私の環境だとhttpdファイルが見当たりません。
どうやら、Devian系かRedHat系で変わるようです。
/etc/debian_versionとあるので、私の環境はDevian系でした。
コマンドでモジュールを有効化します。
# a2enmod を実行
a2enmod
>>Your choices are: access_compat actions alias allowmethods asis auth_basic auth_digest auth_form authn_anon authn_core authn_dbd authn_dbm authn_file authn_socache authnz_fcgi 
authnz_ldap authz_core authz_dbd authz_dbm authz_groupfile authz_host authz_owner authz_user autoindex brotli buffer cache cache_disk cache_socache cern_meta cgi cgid charset_lite data dav dav_fs dav_lock dbd deflate dialup dir dump_io echo env expires ext_filter file_cache filter headers heartbeat heartmonitor http2 ident imagemap include info lbmethod_bybusyness lbmethod_byrequests lbmethod_bytraffic lbmethod_heartbeat ldap log_debug log_forensic lua macro md mime mime_magic mpm_event mpm_prefork mpm_worker negotiation php7 proxy proxy_ajp proxy_balancer proxy_connect proxy_express proxy_fcgi proxy_fdpass proxy_ftp proxy_hcheck proxy_html proxy_http proxy_http2 proxy_scgi proxy_uwsgi proxy_wstunnel ratelimit reflector remoteip reqtimeout request rewrite sed session session_cookie session_crypto session_dbd setenvif slotmem_plain slotmem_shm socache_dbm socache_memcache socache_redis socache_shmcb speling ssl status substitute suexec unique_id userdir usertrack vhost_alias xml2enc
Which module(s) do you want to enable (wildcards ok)?
a2enmodコマンドを打つと、色々出てきました。
どれを有効化したいんだい?っと聞いてきているので、rewriteを入力します。
apache2を再起動します。
service apache2 restart
少しタイムラグありましたが、無事にパーマリンクの設定ができました。
参考
図解! Dockerのツボとコツがゼッタイにわかる本
Docker&仮想サーバー完全入門 Webクリエイター&エンジニアの作業がはかどる開発環境構築ガイド


Discussion