従来環境ではApache2+MySQLでしたが、dockerへの移植時はwebの情報を参考にnginx+php+fpm+mariadbとしました。DockerHubからwordpress+fpmとmariaDBの公式イメージを使用して構築しました。
version: '3.1'
services:
db:
image: mariadb:latest
container_name: mariadb_wp
volumes:
- mariaDb:/var/lib/mysql
- ./db_backup:/backup
restart: always
command: --innodb-read-only-compressed=OFF
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wpdata
MYSQL_USER: user
MYSQL_PASSWORD: password
TZ: Asia/Tokyo
php-fpm:
image: wordpress:5.8-fpm
container_name: php_wp
volumes:
- ./blog:/var/www/html
- ./conf/upload.ini:/usr/local/etc/php/conf.d/upload.ini
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: webdata
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: user
TZ: Asia/Tokyo
nginx:
image: nginx
container_name: nginx_wp
depends_on:
- php-fpm
environment:
- VIRTUAL_HOST=blog.marochanet.org
- TZ=Asia/Tokyo
volumes:
- ./blog:/var/www/html
- ./conf/default.conf:/etc/nginx/conf.d/default.conf
- ./conf/nginx.conf:/etc/nginx/nginx.conf
expose:
- '443'
restart: always
volumes:
mariaDb:
networks:
default:
external:
name: shared
最後のsharedネットワークへの参加とnginxホストの環境変数VIRTUAL_HOSTでリバースプロキシで構成する仮想ホスト名でアクセス出来るようになっています。この場合ここではport公開せずにexposeを使用します。
mariaDBはwordpressだけではなくその他django、rainloop、nextcloudでも使用するが、とりあえずこのcomposeプロジェクトで立ち上げておく(他のcomposeからもDBホストmariadb_wpでアクセス出来る)。
nginxホストの設定:nginx.conf と default.confはサンプルのまま
$ cat /conf/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$uri - $is_args - args :::'
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
$ cat /conf/default.conf
server {
index index.php;
charset utf-8;
server_name localhost;
root /var/www/html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location ~* /wp-config.php {
deny all;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~* .(html|css|js|jpe?g|png|gif|svg|mpg|flv|swf)$ {
expires max;
access_log off;
}
}
このままアクセスすると、言語およびadminのパスワード設定など初期設定が始まる。今回は既存サイトの移植が目的だが、まずはこのまま初期化して素のwordpressがアクセス出来るようにします。そののちwp-contentsを既存サイトのものと置き換えます。この段階では一度ポートを閉じるなどしてアクセス出来ないようにしておく必要があるかも知れません。
$ sudo rm -rf wp-contents
$ sudo cp -rf [old position]/wp-contents .
$ sudo chown -R www-data.www-data wp-contents
次にデータベースのコピーですが。まずは既存サイトのデータベースをバックアップします。たとえば同じホストのmysqlからバックアップするとして
$ mysql-dump --lock-all-tables -u root -p --databases wpdata > wpdata.sql
Passwrd:
今回はmysqlからmariadbへの移植も兼ねているので、そのままではエラーになるため、キーワードを入替えておく必要がある。
今回の場合ではunicodeの表現方式で
utf8mb4_0900_ai_ci => utf8mb4_unicode_ci
に変換しておく必要があった。
変換の後、コンテナのデータベースにリストアします。メンテナンス用にdbサービスにマウントしているdb_backupにコピーしてから
$ docker-compose exec db /bin/bash
db$ mariadb -u root -p
mariadb> drop database wpdata
mariadb> quit
db$ mariadb -u root -p < /backup/wpdata.sql
すでに作成済のデータベースwpdataを一旦削除してから改めてバックアップデータをリストア
これにて無事移植が完了しました。
ここまで簡単な流れにまとまったけど、これでも結構失敗を繰り返したり、、あーでもないこーでもないと試した結果だったりします。その紆余曲折をまとめられれば良いのだが、やってるときは悩みながら突っ走ってしまうので、過程があまり残らないことが間々あるw