docker-composeでWordPress + MariaDB + nginx環境を構築する

結構ハマったのでメモ。

このへんを参考にした。

ディレクトリを作る

[code lang=text]
$ mkdir wp
$ cd wp
$ mkdir db-data logs nginx wordpress
[/code]

Nginx設定ファイル

[code lang=text]
$ cat nginx/wordpress.conf
server {
listen 80;
server_name hoge;

root /var/www/html;
index index.php;

access_log /var/log/nginx/hoge.log;
error_log /var/log/nginx/hoge.log;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
[/code]

docker-compose.yml

[code]
version: '2.0'

services:
nginx:
image: nginx
ports:
- '8080:80'
volumes:
- ./nginx:/etc/nginx/conf.d
- ./logs/nginx:/var/log/nginx
- ./wordpress:/var/www/html
links:
- wordpress
restart: always
mysql:
image: mariadb
ports:
- '3306:3306'
volumes:
- ./db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=pass
restart: always
wordpress:
image: wordpress:4.9-php7.1-fpm
ports:
- '9000:9000'
volumes:
- ./wordpress:/var/www/html
environment:
WORDPRESS_DB_NAME: wpdb
WORDPRESS_TABLE_PREFIX: wp_
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: pass
links:
- mysql
depends_on:
- mysql
restart: always
[/code]

実行

[code lang=text]
$ docker-compose up
[/code]

ブラウザからlocalhost:8080にアクセスすればOK。

使い方

ログ、Wordpressの構成ファイル、DBのデータはそれぞれlog, wordpress, db-dataに保存される。dockerコンテナを終わらせてもデータ消えない。環境汚さない。便利!

ローカルからコマンドラインのmysql clientでlocalhostに接続しに行こうとする(※dockerコンテナのポートをローカルにマッピングしている、上記参照)と、unixドメインソケットを読もうとしてエラーになるので下記のようにする。

[code lang=text]
$ mysql --protocol tcp -u root -p
[/code]

ハマりポイント

ハマりポイントというか、これは単純なミスだったのだけど…。

  • 設定しているとおり、DBの内容やログ、wordpressの構成ファイルはマウントされているボリュームに保存される。だからdockerコンテナをストップさせても保存される。あとでdocker-compose.ymlをいじってMariaDBのパスワードを変更してもデータベースのデータを消去しない限りは更新されない。
  • mariadbの公式dockerイメージではMYSQL_ROOT_HOSTでrootがログインできるホスト名を指定できるが、これはデフォルト(無指定)で%が指定される。access_deniedになった場合は多分許可ホストの設定じゃなくてパスワードが間違ってる可能性大。

上記二つのコンボで2時間位ハマってしまった。

まとめ

docker-composeクッソ便利。覚えたらローカルに環境構築したくなくなる。