Dockerの生態系に迫る!第4回 :クジラたちにもリベラリズムを。コンテナのより自由なnetworkへ。docker network登場。

スポンサーリンク
tech系(Linux)
スポンサーリンク

==== スタジオ ====

「「「 インターネッツ!!大海原! 」」」♪♪

ジャッカル
ジャッカル

皆さんこんばんは。ディスカバリーチャンネル「インターネッツ!大海原!!」

MCを務めるのは毎度おなじみジャッカルと、

ジェシー
ジェシー

ジェシーよ~♪

インターネットという大海に生息する高度な精度を誇るOSSにクローズアップし、どんなものなのかを触れ合うことで理解するシリーズ、それが「インターネッツ!!大海原!」。

Dockerシリーズ第4回目です。

前回はdockerのnetworkの中でもbridge networkにフォーカスして説明しました。

今回はdocker networkです。前回までの記事は本記事の一番下に列挙しておきます。

では今回もDockerの生態を紐解いていきましょう。

ジェシー
ジェシー

現地と中継がつながっているわ~

現地スタッフー!お願いねーーー!!!

==== 現地 =====

現地スタッフ兼ナレーション
現地スタッフ兼ナレーション

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

現地スタッフ兼ナレーション
現地スタッフ兼ナレーション

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

引用:https://www.docker.com/company/newsroom/media-resources

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

https://apao-m-appare99999.com/?p=466

その2

https://apao-m-appare99999.com/?p=574

その3

https://apao-m-appare99999.com/?p=763
タイトルとURLをコピーしました