==== スタジオ ====
「「「 インターネッツ!!大海原! 」」」♪♪

皆さんこんばんは。ディスカバリーチャンネル「インターネッツ!大海原!!」
MCを務めるのは毎度おなじみジャッカルと、

ジェシーよ~♪
インターネットという大海に生息する高度な精度を誇るOSSにクローズアップし、どんなものなのかを触れ合うことで理解するシリーズ、それが「インターネッツ!!大海原!」。
Dockerシリーズ第4回目です。
前回はdockerのnetworkの中でもbridge networkにフォーカスして説明しました。
今回はdocker networkです。前回までの記事は本記事の一番下に列挙しておきます。
では今回もDockerの生態を紐解いていきましょう。

現地と中継がつながっているわ~
現地スタッフー!お願いねーーー!!!
==== 現地 =====

はーい。ジェーシー、ここからは私が引き取るよー

おっと、いましたね。野生のDockerです。早速近づいて見てみましょう

Docker ネットワーク
前回のbridge ネットワークではネットワークは一つでした以下のような構成です。

でも実際にはこのネットワーク以外にもネットワークを別に用意して
あるコンテナはAというネットワーク、あるコンテナはBというネットワークというように別々のネットワークでの構成を作ることができます。
これがDocker ネットワークです。
bridgeネットワークではコンテナ間の通信はIPアドレスでしかできません。しかし、Dockerネットワークの場合はコンテナ名で互いに通信ができます。
Docker ネットワークの作成と確認
まずはDocker ネットワークを作成します。今回はtest_docker_networkというネットワークを作成しました。
$ sudo -i
# docker network create test_docker_network
50aae0e596b58209a65b4801370074462d1ed14e2988ac68540550e03b5b5dfe
次に作成したDocker ネットワークを確認します。
# docker network ls
NETWORK ID NAME DRIVER SCOPE
1569d4eb777c bridge bridge local
b846d8eefd0a host host local
38b3a797ff8b none null local
50aae0e596b5 test_docker_network bridge local 👈ネットワークが作成されている
今回作成したDocker ネットワークの詳細情報も確認します。IPなどがわかります(IPは172.18.0.0/16ですね)。ちなみにIPをこちらで指定してあげることもでき、その場合は「–subnet」と「–gateway」で指定します。
# docker network inspect test_docker_network
[
{
"Name": "test_docker_network",
"Id": "50aae0e596b58209a65b4801370074462d1ed14e2988ac68540550e03b5b5dfe",
"Created": "2021-06-05T18:38:34.574829705+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
今は以下のような状態です。

Docker ネットワークは青の枠のところですね。
Docker ネットワークにコンテナを配置する
このDocker ネットワークに所属させるコンテナを2台(httpd03とhttpd04)立ててみます。コンテナを組み立てるときに「–net」で所属させるネットワークを指定します。
# docker run -dit --name httpd03 -p 8084:80 --net test_docker_network httpd:2.4
2acb6b2701a7ea06b6f3cf14416784b681b46f8ad37e707f022b9ced71fe5a89
# docker run -dit --name httpd04 -p 8085:80 --net test_docker_network httpd:2.4
afe6ad99ed22dca13e9a5a1bb544a2a5ea2d9cf00cf3665b65372842b973dfc3
コンテナがちゃんとDocker ネットワークに接続されているかを確認してみます。「Containers」ってところですね。「👈」で示してあるところです。ちゃんと今回作成した2台のコンテナが接続できてますね。
# docker network inspect test_docker_network
[
{
"Name": "test_docker_network",
"Id": "50aae0e596b58209a65b4801370074462d1ed14e2988ac68540550e03b5b5dfe",
"Created": "2021-06-05T18:38:34.574829705+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": { 👈ここの項目に注目
"2acb6b2701a7ea06b6f3cf14416784b681b46f8ad37e707f022b9ced71fe5a89": {
"Name": "httpd03",
"EndpointID": "4bef78a5d2714fba9368f2ff40d0362f2dbc73f4ce59dc11f884e99ebe405d37",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"afe6ad99ed22dca13e9a5a1bb544a2a5ea2d9cf00cf3665b65372842b973dfc3": {
"Name": "httpd04",
"EndpointID": "3b99527d15a8273708e759035600a346927674e4784ca1e4ecb15a79e61239e5",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
これで以下のような状態になりました。

さて、bridgeネットワークはIPアドレスでしか通信ができませんでした。
しかし、Dockerネットワークは名前でも通信ができるんでしたよね。それを確認しましょう。
httpd04からhttpd03へアクセスを試みてみましょう。前回の記事と同様にコンテナ内に入ってアクセス確認のために必要なソフトをインストールしていきます。
# docker container exec -it httpd04 /bin/bash
root@afe6ad99ed22:/usr/local/apache2# apt update
root@afe6ad99ed22:/usr/local/apache2# apt -y upgrade
root@afe6ad99ed22:/usr/local/apache2# apt install -y iputils-ping curl
まずping疎通です。IPではなく、コンテナ名でpingを実行します。
root@afe6ad99ed22:/usr/local/apache2# ping -c 3 httpd03
PING httpd03 (172.18.0.2) 56(84) bytes of data.
64 bytes from httpd03.test_docker_network (172.18.0.2): icmp_seq=1 ttl=64 time=0.604 ms
64 bytes from httpd03.test_docker_network (172.18.0.2): icmp_seq=2 ttl=64 time=0.262 ms
64 bytes from httpd03.test_docker_network (172.18.0.2): icmp_seq=3 ttl=64 time=0.249 ms
--- httpd03 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 29ms
rtt min/avg/max/mdev = 0.249/0.371/0.604/0.165 ms
次にcurlです。これもコンテナ名で実行してみます。
root@afe6ad99ed22:/usr/local/apache2# curl httpd03
<html><body><h1>It works!</h1></body></html>
うっひょーっ!ちゃんとコンテナ名で疎通ができていますね。オールOKです!
まとめ、
さて今回はDockerネットワークに触れてみました。
brigdeネットワークとは別のネットワークとして作成でき、複数のネットワーク構成、そしてコンテナ名での疎通が可能になり、より大きなサービスに適したものができる可能性が増えたわけであります。
より自由にネットワーク環境を広げられるようになったわけです。
はい、そんな感じで今回はこの辺にしたいと思います。
最後までよんでいただきありがとうございました。ではまた!
参考資料
「さわって学ぶクラウドインフラ docker基礎からのコンテナ構築」
過去のDockerの記事は以下からどうぞ。
その1
その2
その3
