joppot

コピペで絶対動く。説明を妥協しない

PC

docker for macでbusyboxを使ったwordpressの環境を構築する

投稿日:2017年5月10日 更新日:

Pocket

概要

記事を書いたあと気付いたのですが、busyboxにファイルはアップロードできるのですが、プラグインがインストールできませんでした。
ただいま、研究中なので、解明次第、記事を更新したいと思います。またもし、やり方を知っている方がいらっしゃいましたら、コメント欄か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をダウンロードします。

https://ja.wordpress.org

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でより実用的な構成はまた別の機会に紹介したいと思います。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-PC
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

docker for macでnginx + php-fpm + php7 + ホストmysqlでwordpressの環境を構築する

概要 みなさんこんにちはcandleです。 今回はdockerを使ってwordpressの環境を作りたいと思います。 ただ、一言でmac + docker + wordpressと言っても様々な構造が …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ