Docker-Composeでちょいと複雑なサービスをLink使わずに立ち上げる。
はじめに
現在自前のVPS環境にて以下の様な環境を作っています.
外からはircクライアントから直でzncに接続、もしくはsshトンネル使った上でshoutで接続。
その上でzncは非公開のbitlbeeにアクセスしているという感じです。
んで、この環境を最近Dockerに移行したのですが、以外にめんどくさいのがコンテナ間通信。
Dockerの基本は-linkを使って環境変数をベースに設定を書き換えるという形になるのですが、複数コンテナを立ち上げてクラスタするわけでもないのにいちいちShell書くのもなぁ…と思っていたところ、この投稿を見て、「お、これなら簡単やん」ということでdocker-compose.ymlを作ってみました。
基本構造
コンテナ間の構造はこんな感じ
net_ircというコンテナをこの投稿を参考にbusyboxで作成。
その他をnet: "container:ner_irc"と指定されたコンテナのネットワークに相乗りさせて、コンテナ間はポート指定で通信するというものです。
現在のdocker-composeはnet指定にサービス名を使えない
(現在pr:#686で議論はされている模様)ので、net_ircについては直接dockerから作成して、そののちにdocker-compose upするという方式を取ることで実現しました。
実際のコード
docker-compose stop
docker stop net_irc
docker rm net_irc
docker run --name net_irc -d -t -p 16667:16667 -p 127.0.0.1:9000:9000 busybox
docker-compose up -d
znc:
image: jimeh/znc
expose:
- "16667"
volumes:
- $HOME/.znc:/znc-data
net: "container:net_irc"
bitlbee:
image: aostanin/bitlbee
expose:
- "6667"
volumes:
- $HOME/.bitlbee:/data
net: "container:net_irc"
shout:
image: cha2maru/shout
expose:
- "9000"
volumes:
- $HOME/.shout:/root/.shout
net: "container:net_irc"
command: shout
やってみて
dockerはpオプションで解放する際にIP制限をしないとufwを超えてポートが解放されてしまうので、個人用のサービスを立ち上げる時にはまずどのポートをどのIPに解放するのかを専用のコンテナで設定して、そのうえでnet: "container:name"でネットワークを共有するというのは確認の上でもいいのかなと思いました。
docker-composeのバージョンアップが来て、net: containerの指定にservice名が使えるようになったらよりシンプルにできるので、バージョンアップを楽しみに待ちたいと思います。