0%

DockerのHTTP Routing - Part6: confd はじめに

Part1でリストしたconfdの使用例がCoreOSをfleetctlから操作する - Part2: hello.serviceで参考にしているExperimenting with CoreOS, confd, etcd, fleet, and CloudFormationの後半に出てきました。今回はconfdの使い方を見ていきます。いろいろ考えていくとconfdの仕組みが一番わかりやすそうです。

nginx.serviceのUnit

marceldegraaf/nginxをCoreOSのUnitに登録するserviceファイルです。

nginx.service
[Unit]
Description=nginx

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=/usr/bin/docker pull marceldegraaf/nginx
ExecStart=/usr/bin/docker run --rm --name nginx -p 80:80 -e HOST_IP=${COREOS_PRIVATE_IPV4} marceldegraaf/nginx
ExecStop=/usr/bin/docker kill nginx

[X-Fleet]
X-Conflicts=nginx.service

fleetctlを使いnginx.serviceをUnitに登録します。

$ fleetctl submit nginx.service
$ fleetctl start nginx.service

confd

confdはetcdやConsulのキーを監視します。起動時にTOML形式の設定ファイルを-config-fileで指定します。
キーの変更をトリガーにして、TOMLファイルに指定した処理を実行します。

  • srcに指定したテンプレートから、destに指定したconfファイルを生成する。
  • destにconfファイルを生成後に、reload_cmdに指定したコマンドを実行する。

今回の例では、Nginxの設定ファイルが再作成され、Nginxがreloadされます。

/etc/confd/conf.d/nginx.toml
[template]
keys = [ "app/server" ]
owner = "nginx"
mode = "0644"
src = "nginx.conf.tmpl"
dest = "/etc/nginx/sites-enabled/app.conf"
check_cmd = "/usr/sbin/nginx -t -c /etc/nginx/nginx.conf"
reload_cmd = "/usr/sbin/service nginx reload"

marceldegraaf/nginx

marceldegraaf/nginxのDockerfileです。

Dockerfile
...
# Add boot script
ADD ./boot.sh /opt/boot.sh
RUN chmod +x /opt/boot.sh

# Run the boot script
CMD /opt/boot.sh

コンテナが起動すると、/opt/boot.shを実行して以下の処理を行います。

  • confdの監視登録
  • confdをバックエンドで起動
  • Nginxの起動
/opt/boot.sh
...
# Run confd in the background to watch the upstream servers
confd -interval 10 -node $ETCD -config-file /etc/confd/conf.d/nginx.toml &
echo "[nginx] confd is listening for changes on etcd..."
...

まとめ

DockerクラスタをCoreOSで構築する場合にはconfdを使うと動的なリバースプロキシが便利に作れます。
一方でシングルノードのDockerホストの場合は、Docker Remote APIGET /eventsからpollingかstreamingで通知を受ける方法もあります。

Part1では、後者の方がミニマルで簡単のように思いましたが、どこかで通知を受け、その後のコマンドを実行するプロセスを管理する必要があります。

confdはこの目的に作られているので、TOML形式の設定ファイルで何をしているのか非常にわかりやすくまとまります。