docker network: コンテナ間通信

dictav
m0blog
Published in
6 min readNov 4, 2018

コンテナ間ではIPアドレスが分かっていれば特に制限なく接続することができます。IP アドレスは docker inspect コマンドで調べることができます。

$ docker inspect \
--format "{{.NetworkSettings.Networks.bridge.IPAddres}}" webserver
172.17.0.2

また、jq コマンドを使っても良いと思います。

$ docker inspect webserver \
| jq '.[] | .NetworkSettings.Networks.bridge.IPAddress'
"172.17.0.2"

IPアドレスがわかったら別のコンテナから接続してみます。

$ docker run --tty --interactive --name client dictav/net sh
# curl http://172.17.0.2/
<!DOCTYPE html>
<html>
<head>
<title>WELCOME to nginx!</title>
...
</body>
</html>

これは Docker がコンテナ間の通信を可能とするためにネットワークを構築しているためです。何も指定しない場合は bridge というネットワークが使われます。

$ docker network ls
NETWORK ID NAME DRIVER SCOPE
cfceb294b339 bridge bridge local
cd5ae84039b1 host host local
232dcd5d7ad2 none null local
$ docker network inspect bridge \
| jq '.[] | {Name: .Name, Containers: .Containers}'
{
"Name": "bridge",
"Containers": {
"3d31c15ccf6...": {
"Name": "client",
"EndpointID": "57772ea66...",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"48fd23f70f1...": {
"Name": "webserver",
"EndpointID": "7436a4ec...",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
}
}

User-defined network

デフォルトのbridge ネットワークを使う以外にも独自のネットワークを定義することができます。独自のネットワークを定義するとコンテナ名での通信が可能となるため、複数コンテナを使ってアプリケーションを構築する場合などに便利です。

$ docker network create --driver bridge mynet
$ docker network inspect mynet | jq '.[] \
| {Name: .Name, Containers: .Containers}'
{
"Name": "mynet",
"Containers": {}
}

定義したネットワークにコンテナを接続するには docker network connect コマンドにネットワーク名とコンテナ名を渡します。

$ docker network connect mynet webserver
$ docker network connect mynet client
$ docker network inspect mynet \
| jq '.[] | {Name: .Name, Containers: .Containers}'
{
"Name": "mynet",
"Containers": {
"152786468e...": {
"Name": "client",
"EndpointID": "1dab7ae...",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"48fd23f70f...": {
"Name": "webserver",
"EndpointID": "b50c73eb...",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
}
}

mynet ネットワークにコンテナを確認できます。この状態であればコンテナ名で通信することができます。client コンテナから接続を確認します。

# curl http://webserver/
<!DOCTYPE html>
<html>
<head>
<title>WELCOME to nginx!</title>
...
</body>
</html>

net オプションを使えば docker run 時にネットワークに接続することも可能です。この場合、docker network connect コマンドは不要です。

$ docker run --tty --interactive --net mynet dictav/net sh
# curl http://webserver/
<!DOCTYPE html>
<html>
<head>
<title>WELCOME to nginx!</title>
...
</body>
</html>

このように、コンテナ名で通信できるのは便利なので、サーバーを立てる際にはネットワークを定義して利用することをオススメします。

[DEPRECATED] link オプション

docker run には link というオプションがあり、これを使うとデフォルトのネットワークであってもコンテナ名で通信することが可能です。しかし、link オプションは DEPRECATED となりました。ネットワークを作成するか直接IPアドレスを指定して通信してください。

おまけ

Dockerでは他にも複数ホスト上のコンテナ間で通信するように設定するより複雑なネットワーク環境を構築することが可能です。詳しくは Networking Overview | Docker Documentation をご覧ください。

--

--

dictav
m0blog
Editor for

Go/Objective-C/Ruby dictav=ShintaroAbe 1981,scotch,coffee,bloodhitrstybutchers,elliotsmith,saga,Myth2,raymondcarver