はじめに
オプションを指定せずにコンテナを作成するとそのコンテナはbridgeに接続されます。
よって、特段手当をせずとも同一ホスト上ではコンテナ間で通信可能です。
参考記事
一方で、コンテナを作成する際に接続先のコンテナが判明している場合はdocker run --link
オプションを使えばもっとシンプルに接続可能です。
2つのコンテナをリンクする
# man docker-run
でlinkオプションを確認します。
--link=[]
Add link to another container in the form of:alias or
justin which case the alias will match the name
要は、接続したいコンテナの情報が起動するコンテナのhostsファイルに記載されます。
例えば以下のCONTAINERID/IMAGE/NAMEのコンテナが起動している状態で
49745c19a711 ubuntu jovial_joliot
コンテナをlinkオプション付きで作成します。testlinkとaliasを指定しました。
# docker run -it --link 49745c19a711:testlink ubuntu
そうすると/etc/hostsが以下のようになっています。
root@1a77e425c2ae:/# cat /etc/hosts 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.4 testlink 49745c19a711 jovial_joliot 172.17.0.5 1a77e425c2ae
IPアドレスを自動的に収集し、49745c19a711のコンテナが自動的にhosts登録されています。
netcatを用いてtestlink宛てに送付すると
# nc testlink 8888 test ^C
49745c19a711のコンテナで確かに受信できました。
# nc -lp 8888 test
ちなみに接続先のコンテナが起動していない状態でlinkオプションを用いると以下のようにエラーとなるのでご注意ください。
# docker run -it --link 49745c19a711 ubuntu
/usr/bin/docker-current: Error response from daemon: Cannot link to a non running container: /jovial_joliot AS /sad_clarke/49745c19a711.
終わりに
いちいち接続先のdockerのIPアドレスを調べたりすることなく自動的にhosts追加できるため、複数コンテナの連携を行う際に有効です。
数あるdocker runのオプションの中でも、--link
オプションはよく出てくるのでこの機会に覚えておくと役立つと思います。
以上、ご参考になれば幸いです。