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

結構ハマったのでメモ。

このへんを参考にした。

ディレクトリを作る

$ mkdir wp
$ cd wp
$ mkdir db-data logs nginx wordpress

Nginx設定ファイル

$ 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;
    }
}

docker-compose.yml

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

実行

$ docker-compose up

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

使い方

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

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

$ mysql --protocol tcp -u root -p

ハマりポイント

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

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

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

まとめ

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