LoginSignup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

docker内 IPアドレスについて

初めて質問させていただきます。
dockerのネットワークについて、質問させてください。

今回は、docker上で3つのコンテナ(コンテナA、コンテナB、コンテナCが動いている)が動いていると仮定して、話を進めていきたいと思います。

コンテナに振られるIPアドレス

  • brigeネットワーク(docker0)ネットワーク 172.17.0.1
  • コンテナAのネットワーク 172.18.0.1
  • コンテナBのネットワーク 172.19.0.1
  • コンテナCのネットワーク 172.20.0.1

質問したいこと

  1. IPアドレスの振り分け設定(/etc/docker/daemon.json等)を特に行わない場合、もしコンテナD、コンテナE...と増えていく場合、クラスBの2オクテット目が1ずつ増える(172.21.0.1、172.22.0.1)割り振り方となるのでしょうか...。

2. コンテナに振られるIPアドレスのサブネットマスクは、基本的に(※IPアドレスの振り分け設定を行わない場合)、/16となるのでしょうか。

基本的なことで大変恐縮ではございますが、
教えていただけますと幸いです。

もし、認識に間違い等がありましたら、
併せて教えていただきますと幸いです。

どうぞよろしくお願いします。

0

1Answer

コンテナに振られるIPアドレス
brigeネットワーク(docker0)ネットワーク 172.17.0.1
コンテナAのネットワーク 172.18.0.1
コンテナBのネットワーク 172.19.0.1
コンテナCのネットワーク 172.20.0.1

上記の前提を理解した上で回答したいので質問させてください。

  • コンテナA,B,Cはデフォルトのbrigeネットワーク(172.17.0.0/16)に接続していないということでしょうか?
    • その場合、コンテナA,B,Cそれぞれ専用のネットワークを docker network create コマンド等で作成されたということでしょうか?
0

Comments

  1. @W-Hidetoshi

    Questioner

    ご返信ありがとうございます。
    また、言葉足らずの説明で申し訳ございません。

    コンテナA,B,Cはデフォルトのbrigeネットワークに接続している前提で考えております。

  2. 回答ありがとうございます。

    コンテナA,B,Cはデフォルトのbrigeネットワークに接続している前提で考えております。

    理解しました。では、前提となるデフォルトのbrigeネットワークの動きも含めて順を追って回答します。

    デフォルトのbrigeネットワークのセグメントについて

    まず、デフォルトのbrigeネットワークのセグメントですが、 以下のとおりdocker network inspectコマンドで確認できます。
    "Subnet"プロパティの値を見ると、デフォルトbrigeネットワークは172.17.0.0/16のセグメントで構成されていることがわかります。

    $ docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    48ba1e3ca645   bridge    bridge    local
    0c37af463bab   host      host      local
    89d55398e5b6   none      null      local
    
    $ docker network inspect 48ba1e3ca645
    [
        {
            "Name": "bridge",
            "Id": "48ba1e3ca64506921874115f84b593cf00fa9d1954a7628bf4164ee9c95b46d7",
            ...省略
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.17.0.0/16",
                        "Gateway": "172.17.0.1"
                    }
                ]
            },
    

    コンテナのIPアドレスの割り当てについて

    コンテナがデフォルトのbrigeネットワークに接続している場合、Dockerは各コンテナに対して172.17.0.0/16の中のホストアドレスの若番から順番にIPアドレスを割り当てます。つまり、特に設定変更を行わない場合、以下のようにIPアドレスが自動的に割り当てられます。

    • コンテナAのIPアドレス 172.17.0.2
    • コンテナBのIPアドレス 172.17.0.3
    • コンテナCのIPアドレス 172.17.0.4

    なので、質問文に記載のように2オクテット目が変化するようなことはなく、4オクテット目から1ずつ増加していきます。
    以下は、3台のコンテナをデフォルトのbrigeネットワークに接続した場合の結果となります。

    # 3つのコンテナを起動(特にネットワークを指定していないのでデフォルトのbrigeネットワークに接続される)
    $ docker run --name containerA -d -p 8080:80 nginx
    $ docker run --name containerB -d -p 8081:80 nginx
    $ docker run --name containerC -d -p 8082:80 nginx
    
    $ docker container ls
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
    9622fb90cde3   nginx     "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes   0.0.0.0:8082->80/tcp   containerC
    168e8163d2bc   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   0.0.0.0:8081->80/tcp   containerB
    fd762ccdbaef   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   0.0.0.0:8080->80/tcp   containerA
    
    # デフォルトのbrigeネットワークの情報を確認
    $ docker network inspect 48ba1e3ca645
    [
        {
            "Name": "bridge",
            "Id": "48ba1e3ca64506921874115f84b593cf00fa9d1954a7628bf4164ee9c95b46d7",
            ...省略
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.17.0.0/16",
                        "Gateway": "172.17.0.1"
                    }
                ]
            },
            ...省略 
            # デフォルトのbrigeネットワークに接続するコンテナの情報 
            "Containers": {
                "168e8163d2bc1561a1d23173a4bd50c6e98419b0fdcf8622105abe6d3379a5d1": {
                    "Name": "containerB",
                    "EndpointID": "ffe74d785a10b2c3f5e9f0b44aa797560ce8d59cc943b1f4ef9d09fd2040724e",
                    "MacAddress": "02:42:ac:11:00:03",
                    "IPv4Address": "172.17.0.3/16",
                    "IPv6Address": ""
                },
                "9622fb90cde3d57fafc9cebe9c76aedd2806772e9f8fb101b6269ade39236085": {
                    "Name": "containerC",
                    "EndpointID": "dd13c711fcf42ee32c06edd5d387a10efcf3e6559468d24946378cb9017f9308",
                    "MacAddress": "02:42:ac:11:00:04",
                    "IPv4Address": "172.17.0.4/16",
                    "IPv6Address": ""
                },
                "fd762ccdbaeff3904c7d9470e0e4f945dbd60a629eb928a9be4ec78142e8c9ae": {
                    "Name": "containerA",
                    "EndpointID": "fa31906bdaa3e7a4230d26405ce89b97e22434a2f288df93e124ff71b65693bb",
                    "MacAddress": "02:42:ac:11:00:02",
                    "IPv4Address": "172.17.0.2/16", 
                    "IPv6Address": ""
                }
            },
    

    上記の通り、docker network inspect <brigeネットワークのID>コマンドを実行すると、各コンテナに割り当てられたIPアドレスが確認できます。
    172.17.0.0/16の中の若番から順番にIPアドレスが割り当てられていることがわかるかと思います。

    上記の動きを踏まえ、以下ご質問に回答します。

    IPアドレスの振り分け設定(/etc/docker/daemon.json等)を特に行わない場合、もしコンテナD、コンテナE...と増えていく場合、クラスBの2オクテット目が1ずつ増える(172.21.0.1、172.22.0.1)割り振り方となるのでしょうか...。

    コンテナD、コンテナEもデフォルトのbrigeネットワークに接続する場合、前述のとおり若番からIPが割り当てられます。A,B,Cがすでに起動していることを前提にするならば以下のようになります。

    • コンテナD: 172.17.0.4
    • コンテナE: 172.17.0.5

    コンテナに振られるIPアドレスのサブネットマスクは、基本的に(※IPアドレスの振り分け設定を行わない場合)、/16となるのでしょうか。

    デフォルトのbrigeネットワークに接続する場合はそうなります。
    なお、docker network createコマンドを使うと、デフォルトのbrigeネットワークではなく、新しいカスタムのbrigeネットワークを作成することができます。
    その際に、例えばdocker network create --subnet 192.168.0.0/24 custom-my-network のようにすると、192.168.0.0/24のサブネットを作ることができます。

Your answer might help someone💌