前回Sentryというエラートラッキングツールのplaybookを書きました。 もってけエンジニア!エラートラッキングツール【Sentry】のplaybookを書いたよ
このSentryをDocker化してしまえ!と思い、Dockerで構築してみたのですが、しんどいことに気づいたので、メモっておきます。
※Kubernetes,composeとか使えば楽になるんじゃないかと思います。あくまでもDockerのみでやろうとした時の感想です。
結論 --linkだらけにすると地獄をみる
githubに上げました。MySQLはsentryのmigration済みのデータが入っています。
MySQLの容量が300MBあったので、上げれませんでした^^;なんか方法考えます。。。
https://github.com/maaaato/docker-lab/tree/master/sentry
※一応リンク。
どういう構成でDocker化したか図を載せます。
インターネットからのアクセスはnginxで受け、バックエンドのsentryサーバへproxyする形です。 あとはsentryで必要なMySQL(PostgreSQL)、Redisを用意しています。
これらをコンテナ化しましたが、図を見て頂くとわかると通りにコンテナ同士を通信させる必要があります。
Dockerのコンテナ同士の通信には
docker run -d --link CONTAINER_NAME:ALIASE IMAGE_NAME
といった様に
--link
オプションが必要になります。
図の例で言いますと、nginxはsentryサーバへproxyさせています。この時どのようなconfになっているかと言うと、
upstream sentry {
server sentry-docker:9000;
}
server {
listen 80;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://sentry;
}
}
proxyさせる先をsentry-dockerといった様に書いています。
--linkでCONTAINER_NAME:ALIASEで、ALIASEをsentry-dockerと指定してdocker runさせています。 こうすることでnginxのコンテナ内の/etc/hostsには、
172.17.0.9 2b312db7e6b4
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.8 sentry-docker 1f4c972658c2 sentry
このようにsentryサーバのIPアドレスが書き込まれます。 sentryサーバの--linkも同様で、MySQL、Redisも同じように各コンテナのIPが/etc/hostsに登録されます。
※
docker ps
の結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b312db7e6b4 maaaato/nginx "/bin/sh -c '/usr/sb 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp nginx 1f4c972658c2 maaaato/sentry "sentry --config=/et 5 minutes ago Up 5 minutes 9000/tcp sentry 5473ad46ec96 maaaato/redis "/entrypoint.sh redi 17 minutes ago Up 17 minutes 6379/tcp redis-docker cdb6a0adf437 maaaato/mysql-sentry "/usr/bin/mysqld_saf 18 minutes ago Up 18 minutes 3306/tcp mysql-docker
つまり!!
ここでMySQLのコンテナをstopし、新規にrunしたらどうなるでしょうか? MySQLのコンテナが新規に立ち上がるので、新たにIPが割り振られます。
つまり!MySQLへlinkしているコンテナはIPが変わった事なんてしらないので、あれ?接続できないぞ。。。となってしまいます。南無。 まぁ当たり前か。。。
先ほどの図では、sentryコンテナからMySQLコンテナに接続していました。これを再び接続し直すには、sentryコンテナをrestartして、nginxコンテナもrestartが必要です。 restartでうまくいかない場合は、コンテナの作り直しが発生してしまいます。
まとめ
Dockerでlinkさせまくると一カ所が死んだときに影響範囲が大きくなってしまう可能性があります。 Docker化を進めるにあたり、Docker化にするところしないところをしっかり設計する必要があると感じました。 Kubernetes,composeはまだ試していないのですが、Dockerの管理が楽になるもの?だと思いますので、次は試してみます。
参考サイト
Dockerのネットワークについてはこちらの記事がとても分かりやすいです。 Dockerのネットワークの基礎 Dockerコンテナ間のlink,database.ymlの書き方