新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

Docker + WordPress 試してみた

Docker を試してみた。FreeBSD の jail みたいなものと理解している。というより、技術的なものは一切理解せずに使っている。

Docker のインストール

qiita.com
この辺のを見てインストールした。単に Docker からシェルプロを wget して(記事の中では curl だが)、sudo で実行しただけ。もう、勝手に何かしらインストールされてしまいました。何がインストールされたかはわからずじまいです。

$ wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker $USER

Docker を run させる。

よくわからないけど、まずは hello world を run させました。この時点で、何が起こっているのかわからない!!という状態です。つまり、 Docker (仮想環境というくらいは知っているが、基本的な知識としてはこのキーワードだけ)が何者かわからないうちに hello world 終了

$ docker run hello-world

ubuntu を起動させる

なんか ubuntu も起動させることが出来るらしいぞ、ということで ubuntu も起動。

$ docker run -i -t ubuntu /bin/bash

この時点でどうやら、どっかにイメージを作っているらしいことに気が付く。df でみてみると、確かにマウントしている。つまり、Docker は誰かが作った image を mount して Jail みたいにプロセスに割り当てて起動する技術らしい(今も詳細がわかっていないので、あくまで、らしいってことで)
一旦抜けても後から bash を起動できる

$ docker exec -it ubuntu /bin/bash

目的の WordPress を起動

tutum/wordpress というのを使ってみた。もう簡単。

$ docker run -d -p 8080:80 --name=wordpress tutum/wordpress

これで 8080 を 80 へフォワードする。後で調べると、じつはこのコンテナのなかで Linux + Apache + MySQL + PHP (いわゆる LAMP) が動いていることが分かった。調子に乗って、いくつも wordpress 入りのコンテナを作る。イメージがどこにあるのかしらないが、イメージなら、スナップショットが取れるのでは?と調べると commit というコマンドで取れることが分かった。

$ docker stop wordpress
$ docker commit wordpress wordpress-snap0

tutum/wordpresswordpress の旧バージョンが入っている。しかし、パーミッションの設定が悪く、WordPress 内部からアップデートできない。

$ cd /var/www/html
$ chown -R www-data:www-data .

てなぐあいにしてやると、うまくいく。あと、ついでに sendmail (WordPress が必要とする) がなかったので、apt-get でいれる。apt-get が古かったようなので update もする。

$ apt-get update
$ apt-get install postfix
$ service postfix start
$ service postfix stop

最初 sendmail を入れたら重かったので、postfix に変更。postfix の設定はしていない。(メールの送信だけだから)。service を stop していて大丈夫のはずだが、、、、stop しても ps でみるとデーモンが動いている。もう、目的主義で、その辺は気にしないことにする。

WordPress の設定

ここから混沌の道に入る。WordPress は簡単な言葉を使っているせいで、いままで Linux のサーバを使っていた人はかえってわからない。そして、うまく apache の裏に隠れてくれない(Proxyね)。

  • WordPress アドレス
  • サイトアドレス

この用語がわからない。どうやら、複数のコンテキストを管理できるように、WordPress の一般的な cgi とコンテンツ向けの cgi に分かれているようだ。生成される HTML のソースを見るとそう見える。なので、WordPress アドレスはコンテンツに関連なく共通の cgi のための URL。サイトアドレスはコンテンツのための URL。
結局どちらも、普通に同じ URL を設定し、おおもとの Apache で Proxy で転送。

ProxyPass / http://localhost:8080/

かな?ProxyPassReverse は WordPress が勝手にやってくれるから設定しない。WordPress 側は、もともとは http://192.168.0.XXX:8080 みたいになているはずなので、これを http://www.example.com のように(WordPress アドレスもサイトアドレスも)変更。
そしておまじないの

$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];

を wp-config.php に追加。追加するときは

require_once(ABSPATH . 'wp-settings.php');

より前にする必要があるらしい。WordPress 的には次のコメントの前に書くということになっている。

/* That's all, stop editing! Happy blogging. */

SSL

これはちょっとややこしい。が、結局、次のを wp-config.php に足しこむので OK だった。

define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS']='on';

これを例のコメントの前に設定する。$_SERVER はどうやら apache のサーバの環境変数らしい。PHP の if 文なんかも書けるみたいだから、intra から接続したときは (192.168.0.X からの接続とか) は https を使わずに、、、、みたいな複雑なことも phpapacherewrite engine で可能、、、、らしいぞ。

危ない処理をする前にはイメージを commit すればよい

Docker 便利!!スナップショット取れるから、やり直しが簡単。あと、WordPress 的には wp-config.php

define('WP_SITEURL', 'http://192.168.0.XXX:8080/');
define('WP_HOME', 'http://192.168.0.XXX:8080/'); 

の両方或いは片方。を(例のコメントより前に)書き加えれば DB の設定を使わずに固定で立ち上がるぞ。こまったら、直接たぶん MySQL を書き戻せばいい(やらなかった。Docker で手戻りした。その方が簡単だったので、、、<= いや、今考えるとシェルプロで MySQL を書き戻すようにしたほうがよかった。後々その方が使える)

WordPress おすすめのテーマはこれだ!

標準なら Twenty Ten がお勧めかな。ロゴがはれないのがちょっと残念。インストールするなら Clean Journal が気に入っている。無料版がある。無駄にオシャレになれます。あとプラグインでは bbPress を使うとフォーラムとか作れるみたいだ。

でもって Docker だけど、、、

技術的に全く理解していない Docker。

  1. Dockerfile なるものを github に登録して、
  2. Docker hub の ID を取得して
  3. Docker hub で github の Dockerfile を読み込ませて、
  4. Docker hub でイメージを作成する

と一般に公開できるらしいぞ。Dockerfile をみるといろいろスクリプトがかいてあるので、debootstrap だっけ?で生成した root image に対して、コマンドを実行して DB つくったり、デーモン立ち上げたりをするみたいだ。実際に使っていないからなんともいえない。