概要
ただいま、研究中なので、解明次第、記事を更新したいと思います。またもし、やり方を知っている方がいらっしゃいましたら、コメント欄かtwitterで
補足していただけると幸いです。
みなさんこんにちはcandleです。今回はdockerを使ってwordpressの環境を作りたいと思います。
ただ、一言でmac + docker + wordpressと言っても様々な構造があります。
僕が今回紹介するのはこのような構造になります。
方針としてはbusyboxにwordpressをcopyしてvolumeにし、php-fpmとnginx containerにマウントします。
dockerの基本的な構成は以下のサイトを参考にさせてもらいました。
http://takaya030.hatenablog.com/entry/20160504/1462330190
前提
dockerに詳しい方は別にdocker for macじゃなくても問題ないと思います。
mysqlはmacにインストールしてありますが、それもわかる人は適宜調整してください。
wordpressプロジェクトの作成
公式サイトからwordpressをダウンロードします。
zipを解凍して、フォルダの名前をbob_blogにします。
私はデスクトップ上で作業します。
執筆時のwordpressの最新バージョンは4.7.4です。
cd ~/Desktop ls unzip wordpress-4.7.4-ja.zip rm -f wordpress-4.7.4-ja.zip ls mv wordpress bob_blog cd bob_blog
wordpressプロジェクトが完成しました。
busybox containerの作成
最初にbusyboxのDockerfileを作成します。
このbusyboxのcontainerにbob_blogの全てのファイルを保存します。
touch Dockerfile emacs Dockerfile
以下を記述します。
FROM busybox COPY . /var/www/html/ VOLUME /var/www/html
busybox containerにbob_blogをコピーして、それをvolumeにします。
のちに記述するnginxとphp-fpmのcontainerはこのbusyboxのvolumeをマウントしてファイルを参照します。
nginxのcontainerの作成
次に、nginxのためのDockerファイルとnginxの設定ファイルを作成します。
mkdir nginx touch nginx/Dockerfile nginx/server.conf
nginxのDockerfileを開きます。
emacs nginx/Dockerfile
以下を追加します。
FROM nginx:latest MAINTAINER candle ADD server.conf /etc/nginx/conf.d/server.conf
nginxの設定ファイルをnginx containerに加えるだけの記述です。
nginx/server.confを開きます。
emacs nginx/server.conf
以下を記述します。
server { listen 80 default; server_name _; root /var/www/html; index index.php index.html index.htm; charset utf-8; access_log off; error_log off; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_pass bobblog_php-fpm_1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
php-fpm containerの作成
php-fpmの為のファイルを作成します。
こちらはDockerfileのみ用意します。
mkdir php-fpm touch php-fpm/Dockerfile
php-fpm/Dockerfileを開いて、以下を記述します。
FROM php:7-fpm MAINTAINER candle RUN /usr/local/bin/docker-php-ext-install mysqli
最後のRUN文はphp-fpmでmysqlを扱う為のパッケージをインストールしています。
docker-composeのファイル作成
dockerのビルドや実行をまとめてくれるdocker-composeの為のファイルを作成します。
touch docker-compose.yml
エディタで開いて
以下を書き込みましょう。
busybox: build: . nginx: build: ./nginx ports: - "80:80" links: - php-fpm volumes_from: - busybox php-fpm: build: ./php-fpm volumes_from: - busybox
軽く説明します。
nginxとphp-fpmは busyboxのvolumeをマウントしています。
dockerignoreの作成
最後にbusyboxにコピーしないファイルの定義を書きます。
busyboxにはbob_blogの全ファイルをコピーするのですが、docker系のファイルは不必要です。
そこで.dockerignoreに不必要なファイル名を記述して無視します。
touch .dockerignore
.dockerignoreを開きます。
以下を記述します。
Dockerfile docker-compose.yml .dockerignore .git .gitignore nginx php-fpm
ファイルの記述は以上です。
bob_blogフォルダに追加したものはこんな感じ
bob_blog/
├── .dockerignore
├── docker-compose.yml
├── Dockerfile
├── nginx
│ ├── Dockerfile
│ └── server.conf
└── php-fpm
└── Dockerfile
mysqlの接続設定
それではmysqlの設定をしましょう。
php-fpm containerは今回の構成ではmacに搭載されているmysqlにアクセスするようにします。
wordpressのmysql設定はwp-config.phpに記述します。
この時アドレスを一般的には「localhost」か「127.0.0.1」にします。
しかし、docker containerからホストのローカルIPアドレスにアクセスする時、127.0.0.1とlocalhostは使えません。
対策として、独自のローカルIPアドレスをMacに割り振ります。
詳しいことは前回の記事を参照してください。
以下のコマンドでlo0 IPアドレスを割り振ります。
sudo ifconfig lo0 alias 10.200.10.1/24
できたらifconfigコマンドで確認します。
ifconfig
このlo0のIPアドレスはMac PCを再起動すると解除されます。
もしも、自動的に割り振りたい場合は以下の記事を参照してください。
wp-config-sample.phpをコピーして、wp-config.phpを作成します。
cp wp-config-sample.php wp-config.php
wp-config.phpを開いて、以下の箇所を変更します。
define('DB_NAME', 'bob_blog'); define('DB_USER', 'root'); define('DB_PASSWORD', ''); define('DB_HOST', '10.200.10.1');
ついでにsaltの値も変更しておいてください。
Hostの値が先ほど設定したlo0のIPアドレスになっています。
保存しましょう。
bob_blogのデータベースを先に作成します。
macのmysqlにログインします。
mysql -u root -p
ログインしたら以下のコマンドでデータベースを作ります。
create database bob_blog default charset utf8;
これで良いでしょう。
以下のようなアクセスが可能になります。
dockerを起動する
さて、dockerを起動してみましょう。
bob_blogの中で以下を実行します。
docker-compose up -d
終わったら、ブラウザでいかにアクセスします。
http://127.0.0.1/wp-admin/install.php
以下のような画面がでれば、成功です。
解説します。
macのブラウザで、http://127.0.0.1にアクセスするとnginx containerにアクセスします。
nginxはphpファイルをphp-fpm containerにプロキシします。
php-fpm containerは/var/www/htmlにbusyboxからマウントしたphpファイルを実行し、必要とあらば、mysqlにアクセスします。
もしも、nginxに要求されたファイルが画像やjsの場合はnginxの/var/www/htmlにマウントしたbusyboxのファイルを持ってきて返します。
注意点
このbusyboxはbob_blogのファイルを全て持っていますが、全てのファイルを永続的に保持しているわけではありません。
このdocker-composeの書き方では、起動するたびにmacのbob_blogをcopyしてvolumeを作成します。
wordpressを立ち上げて、メディアファイルをアップロードしても、ファイルはあくまでbusyboxの中に配置されるだけであり、もしまたdockerを再起動するとbob_blogは上書きされてメディアファイルが削除されます。
busyboxを永続化したい場合は、うまくdocker-composeを編集して別にvolumeを作成して、毎度そちらをマウントするような書き方が必要です。
筆者は試していないので、ここでは書きませんが、予期せぬことがないよう注意してください。
筆者はこれを本番環境でやる場合はメディアファイルを別のストレージ、例えばS3に持つことで解決できると考えています。busyboxには最低限プログラムファイルがあるだけでよいと思っています。
おまけ
ためしに、wordpressのサイトを動かしてみましょう。
インストール画面で
「サイトのタイトル」bob_blog
「ユーザー名」bob
「パスワード」好きなパスワード(ローカルだからなんでもよい)
「メールアドレス」bob@example.com
で作ってみます。
「wordpressをインストール」ボタンを押します。するとリダイレクトします。なぜか僕の場合、ここは表示がうまくいかないです。
ホームに戻ると、正しく表示します。
終了する時はvolumeも破棄するようにします。
docker-compose down -v
これで全て止まります。
まとめ
今回のdockerの構築は本番環境も見据えて、少し変な構成にしました。
Macでより実用的な構成はまた別の機会に紹介したいと思います。