長らくhttp://momose.org/diaryでメモを書き連ねていたが、それとは別に世間にお見せしてもいいようなblogでも作ろうとWordPressをインストールしてみた。
基本的にmomose.orgのあらゆるサービスはns.momose.orgで行なっているが、WordPressを入れるためだけにいつものサーバーを汚すのもなあ、ということで、ここでは世間で流行りのdockerを使ってcontainerで実装して見た。
ただ、メインサーバーはFreeBSDだが、dockerは奥まったところにあるESXi上で動いているUbuntuの上で動いており、IPv4的には世間から到達できない場所にある。が、幸いにもIPv6的にはcontainerに対してもGlobalアドレスをつけることができたので、とりあえずはIPv6による提供、ということにしたいと思う。
ここではとりあえずdockerでどうインストールしたかのメモだけ。
Linuxの用意
これはもうすでに用意してある。かねてより何かに使おうと思ってインストールしておいたUbuntuを今回は使う。
とりあえずパッケージ等を最新にしておく。
必要に応じてホストをリブート。
$ sudo apt update $ sudo apt upgrade
dockerをインストール&&セットアップ
dockerをインストール。dockerとdocker-ioを入れなければいけない感じ?
$ sudo apt install docker docker-io
ここで素直にsystemd(systemctl)でdockerdを立ち上げるとIPv6がenableされないので、IPv6がenableされるように設定する必要がある
systemdでdaemonを立ち上げる時の各種設定は/lib/systemd/system以下にあり、dockerの場合はそのディレクトリのdockerd.service。ただし、設定を変えるときはこのファイルを弄るのではなく/etc/systemd/system以下に同名のファイルを作る。起動時はこちらが優先される。これは差分だけおけばいいような気もするが、数回の試行ではうまくいかなかったので、結局 /lib/systemd/system/docker.service を丸ごとコピーして必要な部分を変更することにした。本当は差分だけでいいのかもしれない。diffはこんな感じ
$ locate docker.service | xargs diff -c *** /etc/systemd/system/docker.service 2019-01-29 17:56:57.559635761 +0900 --- /lib/systemd/system/docker.service 2018-09-27 11:39:50.000000000 +0900 *************** *** 10,18 **** # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ! ExecStart= ! #ExecStart=/usr/bin/dockerd --ipv6 --fixed-cidr-v6="2001:2c0:cc17:c301::/64" --default-gateway-v6="2001:2c0:cc17:c301::1" -H fd:// ! ExecStart=/usr/bin/dockerd --ipv6 --fixed-cidr-v6="2001:2c0:cc17:c301::/64" -H fd:// ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 # Having non-zero Limit*s causes performance problems due to accounting overhead --- 10,16 ---- # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ! ExecStart=/usr/bin/dockerd -H fd:// ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 # Having non-zero Limit*s causes performance problems due to accounting overhead
要するに、立ち上げ時のパラメータとして –ipv6 –fixed-cidr-v6= を入れるのが肝要。もののwebには–default-gateway-v6=がいる、と書いてあるのもあるが、これで<network address>::1を指定するとdocker側でもdocker0インタフェースに同じアドレスをつけようとするのか、’Address is already used’と言われてしまうので、::1である限りは不要のようだ。
このとき、dockerのホストであるUbuntuがルータになって、dockerコンテナが別サブネットにあることになる。なので、あとはこのUbuntuでIPv6パケットフォワーディングができるようにし、自宅IPv6ルータからこのサブネットへのルーティングを設定すれば良い。
ちなみに公式ドキュメントによれば、コンテナ用インタフェースであるdocker0をL2ブリッジにするという方法もあるようだ。
後は通常通り、docker serviceを立ち上げるだけ。
$ sudo systemctl start docker.service
WordPressコンテナのインストール?デプロイ?
既にdockerリポジトリにはWordPress及びWordPressに必要なmysqlのコンテナがあるので、それを使う。こういうのはdocker composerというのを使うのが通例だそうだが、今回は愚直にそれぞれのイメージをpullして、それぞれに立ち上げることにする。
$ sudo docker pull wordpress $ sudo docker pull mysql:5.7.21
mysqlのコンテナをpullするときに上記のようなバージョンを指定しないと最新版(Ver8系列?)をpullしてしまうので、バージョン指定は必要。
WordPressはDBたるmysqlに依存しているので、Mysql→WordPressの順で起動。ここでコンテナ名を指定するときにバージョンを指定しないと、最新版をとってこようとするので、ここでもバージョン番号を明記する。
$ sudo docker run --name wp-mysql5 -e MYSQL_ROOT_PASSWORD=<password> -d mysql:5.7.21 $ sudo docker run --name momose-wordpress --link wp-mysql5:mysql -d -p 8080:80 wordpress
起動後、docker ps -aとかすれば各コンテナが上がっているのがわかる。STATUSがUPになっていればOK。
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3592eb4aceb4 wordpress "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp momose-worpress 450c9adde11d mysql:5.7.21 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp wp-mysql5
mysqlコンテナはすでに永続化対応されているようで、これ以上の対応は必要ない。ただ同じイメージで別のインスタンスを立ち上げると永続化に使っているディレクトリを共有してしまいそうな気はするので、複数mysqlコンテナを立ち上げる時はそこは気にする必要があるかもしれない。
ネットワーク設定
このWordPressコンテナにはIPv6アドレスが付いているので、このアドレスを直接、あるいはDNSに登録してやれば、IPv6ならばグローバルからアクセスできる。IPv6アドレスの確認は確認はdockerホストからdocker inspectコマンドでいける。
$ sudo docker inspect 3592 | grep IP
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"GlobalIPv6Address": "2001:2c0:cc17:c301:0:242:ac11:3",
"GlobalIPv6PrefixLen": 64,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "2001:2c0:cc17:c301::1",
"IPAMConfig": null,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "2001:2c0:cc17:c301::1",
"GlobalIPv6Address": "2001:2c0:cc17:c301:0:242:ac11:3",
"GlobalIPv6PrefixLen": 64,
結果を見るとわかるように、IPv6アドレスのホストID部はEUI64ではなく、このコンテナに割り振られたIPv4アドレスが埋め込まれている。このアドレスの永続性は保証されていないと思われるので本来ならば何か別の手法でWordPressのURLをコンテナに対して適宜ルーティングしてくれる仕組みを入れるべきだが、とりあえずこれは将来の課題ということにする。
IPv4からの接続
何しろ奥まったところにあるのでIPv6によるグローバルリーチャビリティがあればあとはいいや、というつもりでいたが、ちょっと簡単な仕組みでIPv4からの接続性も確保してみる。
今ここについているmiscmemo.momose.orgというホスト名はIPv6ではWordPressコンテナのアドレスに、IPv4はmomose.orgに向いている。IPv6の時は直接WordPressにアクセスできるが、IPv4の時はmomose.orgのVirtualHostで受けて、プライベートのIPv4アドレスがついているWordPressコンテナにreverse proxyするようにしている。
しかし実はこのような仕組みは世間のwebサービスとしてはごく一般的なもので、特筆するようなものでもない。違いは世間のはipv4だろうがipv6だろうが一箇所で受け止めてreverse proxyするのだが、ここではv6だけは何としても直に通そうとしている点。こんなことするとTLS化した時に参照する証明書が分散してしまって何もいいことはないのだが、まあ今回はそこはそれということで。
当初はreverse proxyする先はdockerホストの8080ポートあてだったが、何故だかいつ頃からか8080にアクセスしてもWordPressコンテナにポートフォワードしてくれなくなった(iptablesをdisableしてあるからか?)ので、今は直接WordPressコンテナに繋ぐようにしている。
通常dockerdを立ち上げるとコンテナ収容ネットワークとdockerホストの外部ネットワーク間はNATしているのだが、今回はこのNATを切り、IPv6同様自宅ルータにコンテナ収容ネットワーク宛ルートを作る。併せてうちの場合はルータがFreeBSDなので、ipnat.rulesに172.17.0.0/16もNATする旨の設定も付け足す必要がある。dockerdでNATをやめるのに一番簡単な方法なのは、iptablesを無効にするだけ(–iptables=Falseをdockerdの起動オプションに追加)。
ExecStart=/usr/bin/dockerd --iptables=False --ipv6 --fixed-cidr-v6="2001:2c0:cc17:c301::/64" -H fd://
しかし、’–fixed-cidr-v6’なんていうオプションがIPv6でCIDRとか言いますかねぇ、みたいな気分が、なんともいえぬイマイチ感を惹起させる。
終わりに
そんなこんなでWordPressで一発目の記事を書いてみた。本家日記と違ってこちらは一般的に書いてgoogle先生にも見えるようにして、世間の集合知に貢献しようかと思ったが、あまりそんな感じに書けなかったので、やはり世間からは隔絶しておくことにする。
それに飽きたらさっさと閉じそうな気もするし。
「momose.orgブログ開設! (とその顛末)」への1件のフィードバック