LoginSignup
32
32

More than 5 years have passed since last update.

調子にのってDocker化しまくったらしんどかった話

Last updated at Posted at 2015-06-30

Docker
前回Sentryというエラートラッキングツールのplaybookを書きました。
もってけエンジニア!エラートラッキングツール【Sentry】のplaybookを書いたよ

このSentryをDocker化してしまえ!と思い、Dockerで構築してみたのですが、しんどいことに気づいたので、メモっておきます。

※Kubernetes,composeとか使えば楽になるんじゃないかと思います。あくまでもDockerのみでやろうとした時の感想です。

結論 --linkだらけにすると地獄をみる


githubに上げました。MySQLはsentryのmigration済みのデータが入っています。
MySQLの容量が300MBあったので、上げれませんでした^^;なんか方法考えます。。。

※一応リンク。

どういう構成でDocker化したか図を載せます。
docker sentry

インターネットからのアクセスは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の書き方
32
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
32