【Docker】Dockerネットワークで快適Docker生活

2022.04.08

2022.04.08

Fabeee社員ブログ

【Docker】Dockerネットワークで快適Docker生活
初めまして、こんにちは。

昨年12月よりFabeeeに入社させていただきました、やしち、と申します。

今までは、経理という全くの異業種で、お仕事しておりましたが、

プログラミングの面白さに目覚めてしまい、プログラム中毒です。幸せです。

 

みんな大好きDockerですが、細かいパラメーターが多くてうまく起動しないことも多いですよね。今回は、そんなDockerの重要部分であるDockerネットワーク周りを、あれこれお話しさせていただければと思います。

 

 

Dockerネットワークってなんぞや?

Dockerネットワークとは、

ホストのネットワークと分離したり、名前解決をしたり、

まさにDockerを使う理由の根幹ですよね。

 

Dockerネットワークには下記ような種類があります。

【Bridge】

ホスト上のネットワークと隔離されていて、

ネットワーク内部の各コンテナはそれぞれ疎通できます。

また、ポートをバインドすることで、ホスト側からアクセスできます。

デフォルトで作成されるネットワークはBridgeです。

 

【Host】

Bridgeとは異なり、ネットワークと隔離されず、

ホスト上のネットワークにそのまま接続します。

ホストの名前空間やポートをそのまま使用するため、衝突に注意です。

 

【None】

コンテナ内外で、一切ネットワークの接続ができません。

孤島状態です。

ただし、ループバックはできます。

 

 

この中で、多く使われるのがBridgeネットワークです。

やはり、ネットワーク隔離、名前空間の確保などが、Dockerの強みですよね。

Hostネットワークは、ネットワークパフォーマンスを上げたい場合などに使用します。

NATを使用しないため、高速です。

それぞれのサービスに合ったネットワークを選択してみてください。

 

docker-compose同士で接続してみよう!

さて、ここから、本題に移りたいと思います。

そもそもDockerネットワークを調べはじめたきっかけとしては、

業務内で、docker-composeを二重起動し、特定のコンテナだけ疎通したい!という場面に遭遇しました。
そう未知との遭遇。

 

まずは、その解決策をご紹介します。

 

1, まずは、両方のdocker-composeをそれぞれ起動させる

 $ docker network ls

NETWORK ID     NAME                           DRIVER    SCOPE
000000000000   bridge                         bridge    local
000000000000   host                           host      local
000000000000   none                           null      local
000000000000   network1_default               bridge    local
000000000000   network2_default               bridge    local

無事、network1_defaultとnetwork2_defaultが起動してますね

 

2, もう片方のネットワークにコンテナを接続する

docker network connect 繋げたいネットワーク名 繋げたいコンテナ名 とするだけで、

今まで片方のネットワークからしかアクセスできなかったコンテナにアクセスできるようになりました!

便利ですね、超感動ですね。

 

【接続前】

            "Networks": {
                "network1_default": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                }
            }

【接続後】

            "Networks": {
                "network1_default": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                },
                "network2_default": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                }
            }

あとは、いつも通りお好きな方法でリクエストを投げ飛ばすだけです。ばっちりキャッチしてくれます。

 

補足ですが、Dockerでリクエストを飛ばす方法は、コンテナ名やコンテナIDなどで接続できますが、

接続先の名前空間の衝突などを避けたい場合は、–alias オプションを使用することにより任意の名前でも呼び出しすることが可能になります。
至れり尽くせりですね。

docker network connect --alias=任意の名前 繋げたいネットワーク名 繋げたいコンテナ名

他にも–ipで任意のIPアドレスを設定できたり、本当にキャンベル方面に足を向けて眠れませんね。

 

 

docker-compose.ymlで設定しよう!

上記は手動でゴリゴリ接続する方法でしたが、

もちろんdocker-compose.ymlに書いて設定することもできます。

networksに任意のネットワークを設定することで、手軽にネットワークを作成できます

docker-compose.yml

version: '3'
services:
  my_container:
    networks:
      - default
      - test

networks:
  test:

上記のように、設定し、docker-composeを起動させると…

$ docker network ls

NETWORK ID     NAME                           DRIVER    SCOPE
000000000000   bridge                         bridge    local
000000000000   host                           host      local
000000000000   none                           null      local
000000000000   network1_default               bridge    local
000000000000   network1_test                  bridge    local
$ docker inspect my_container

            "Networks": {
                "network1_default": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                },
                "network1_test": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                }
            }

無事、network1_testネットワークを作成し、なおかつ、my_containerは、

network1_defaultとnetwork1_testに接続されました!

 

ちなみに、普段何気なく使っているdefaultネットワークも、設定することが可能です。

docker-compose.yml

version: '3'
services:
  my_container:
    networks:
      - default
      - test

networks:
  default:
    driver: my-driver
  test:

docker-compose.ymlで既存のネットワークに接続させよう!

先程のdocker-composeを二重起動し、特定のコンテナだけ疎通したい!という問題の設定は、

現在のネットワーク内部に新たにネットワークを作るのではなく、

既存のネットワークに接続したい、ということでしたよね。

もちろん、下記のように設定することで、既存のネットワークにも接続することができます。

docker-compose.yml

version: '3'
services:
  my_container:
    networks:
      - default
      - test

networks:
  default:
    driver: my-driver
  test:
    external:
      name: network2_default
$ docker inspect my_container

            "Networks": {
                "network1_default": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                },
                "network2_default": {
                    "IPAMConfig": null,
                    "Links": null,

                    ...
                    ...
                    ...
                }
            }

はい、まさに、求めていた形ですね。興奮しますね。

testにexternalで接続先を指定することで、先程とは違い、新たにネットワークを作成するのではなく、既存のネットワークから探してくれるようになります。

大興奮ですね。

 

ちなみに同じネットワーク内であれば、linksなどで接続する必要はなく、

networksの設定などを特にしていないのであれば、default(bridgeなので)でそのまま疎通されます。

そして、公式でもlinksではなくnetworksを使用することを推奨してます。

便利ですもんね、networks殿。

 

最後に

いかがだったでしょうか、Dockerネットワークの魅力を少しでもお伝えできたなら、嬉しい限りです。双方向接続用コンテナを作ってもよし、一方のコンテナに接続するnetworksを最初から設定してもよし。

夢が無限大に広がりますね!わくわくしますね。

私自身も、さらに勉強しつつDockerと仲良くなり、素敵なサービスを作っていきます。

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。