【问题标题】:Change IP address pool of docker bridge更改docker bridge的IP地址池
【发布时间】:2018-10-22 08:30:28
【问题描述】:

我想为 docker 容器的子网设置自定义 IP 池。为此,我遵循了这个停止的 docker 守护进程,删除了 docker0 接口并使用自定义 NetworkId 重新创建

systemctl stop docker
ip link del docker0

使用 NetworkManager 重新创建 docker0 虚拟网桥接口并将其打开。

ant@ant ~> nmcli con up <UID>
ant@ant ~> ip addr
111: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 3e:ff:1b:ce:e4:a4 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.1/20 brd 172.20.15.255 scope global docker0
       valid_lft forever preferred_lft forever

现在当我再次启动 docker daemon 时,

ant@ant ~> systemctl start docker
ant@ant ~> ip addr
111: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 3e:ff:1b:ce:e4:a4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

我设置的子网是172.20.0.1/20,但是一旦我启动docker守护进程,docker0接口的子网就变成了172.17.0.1/16。我在 LAN 中有一些我希望访问的私有 IP,它们位于该子网中。

有没有更好的方法来配置网桥接口?

【问题讨论】:

    标签: docker


    【解决方案1】:

    Jordan 的回答创建了一个子网工作,然后在容器上运行应用程序时指定该工作。这有助于限制运行容器时使用的 IP 池。

    但是,限制 docker 守护进程创建的docker0 虚拟网桥接口的 IP 池无济于事。我正在寻找的答案如下:

    Docker 运行一个管理容器的守护进程。该守护进程创建一个接口docker0,默认配置为使用172.17.0.1/16 子网进行操作。因此,我们需要配置守护进程以使用所需的子网。

    dockerd 用于运行 docker 守护进程。它有--bip 网桥IP 选项(请参阅dockerd)。

    dockerd --bid=172.20.0.1/20
    

    但大多数系统使用各自的服务管理器运行 docker 来完成此操作。在这种情况下,docker 在/etc/docker/daemon.json 有一个 docker 守护进程配置文件。 Docker linux daemon configuration 因此,如果 daemon.json 尚不存在,则创建它并添加 bip

    {
        "bip":"172.30.0.1/20"
    }
    

    【讨论】:

      【解决方案2】:

      通过创建特定的桥接容器网络,您应该能够使用此命令定义 IP 地址。 documentation 是一个很好的入口点。

      $ docker network create --driver bridge --subnet 172.20.0.1/20 subnet
      $ docker run --name app --network subnet <container>
      

      您的所有容器现在应该在所选子网中有 IP 地址。

      此外,official doc 描述了如何创建自己的网桥连接。

      【讨论】:

        【解决方案3】:

        如果您更改 docker0 网桥的子网,它保持不变。 对于特定的 ip 目的,使用新的网络创建。 docker network create --subnet=172.20.0.1/20 foo 在该网络中运行容器后。 docker run -itd --net foo image_name 假设您想为容器提供特定的 ip。利用 docker run -itd --net foo --ip 172.20.0.12 image_name

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-15
          • 1970-01-01
          • 2018-06-13
          • 1970-01-01
          • 2019-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多