【问题标题】:docker multiple containers with static addressesdocker 多个具有静态地址的容器
【发布时间】:2015-01-05 04:12:34
【问题描述】:

我正在从事一个通常使用虚拟机实现的项目。但是我想改用 docker 容器来破解,以便练习和学习新的东西。

所以这就是我想做的:创建几个在同一主机上运行的容器,具有静态 IP 地址,彼此连接(但不一定与外部世界连接)。 换句话说,我想模拟一种独立网络,由连接到同一个交换机的多台计算机组成。

我尝试更改容器中的 /etc/network/interfaces 来为 eth0、docker0、...设置静态 IP 地址,但它不会以任何方式影响系统。我尝试使用 --net=host, --cap-add=NET_ADMIN 但没有帮助。

这让我发疯。求救! 谢谢

编辑: 我没有说的重要内容:我正在使用我的 Mac Book Air,并且我正在运行 boot2docker(它创建了一个运行 docker 的 VM)。 当我使用“docker run -i -t ubuntu /bin/bash”运行映像时,我没有 docker0 作为接口:在容器中运行“ip a”仅显示 lo 和 eth0。

【问题讨论】:

    标签: static ip docker


    【解决方案1】:

    你为什么尝试--net=host?此选项完全禁用网络隔离,并在默认网络命名空间中运行容器。这意味着 docker 容器可以看到所有主机网络接口。我认为这不是你的选择。

    重要的是要说明 docker 如何处理孤立的网络。首先,它创建了名为docker0 的网桥(至少默认情况下)。每次使用隔离网络(即没有--net=host)启动容器时,docker 都会创建一对veth 接口。 docker 提供给容器的接口之一(如果您将在容器中运行 ip link list,您将看到这个 virtual 接口)。另一个 docker 插入 bridge docker0 (顺便说一句,您可以通过将“-b ${BRIDGE}”选项传递给 docker daemon 来说明要使用哪个网桥)。

    我建议您阅读article about docker bridgesthis one about network namespaces

    尝试使用隔离网络运行容器,然后分配您喜欢的静态 IP。但请注意路由 - 主机必须有路由到您的容器运行的子网。最简单的方法(对我来说也是唯一合适的方法) - 从与 docker bridge 相同的子网分配给您的容器 IP。

    以下示例对我很有效。

    user@host$ ip addr
    docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
        inet 172.17.42.1/16 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::5484:7aff:fefe:9799/64 scope link 
           valid_lft forever preferred_lft forever
    
    root@docker-1# ip addr
    eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.2/16 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:2/64 scope link 
           valid_lft forever preferred_lft forever
    
    
    root@docker-2# ip addr
    eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.3/16 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:5/64 scope link 
           valid_lft forever preferred_lft forever
    

    【讨论】:

    • 哦,是的,您是如何尝试为您的容器分配 IP 的?仅修改 /etc/network/interfaces 将不起作用,因为没有人可以为您应用此配置。容器启动后,您应该使用ifdownifup 工具根据您的配置配置接口。
    • 嗨 Viacheslav,感谢您这么快回答。所以我尝试了 -net=host 因为到目前为止我没有工作,所以我尝试了我找到的所有东西,包括这个。让我们阅读您建议我的那些文章。再次感谢
    • 我使用 /etc/network/interfaces 分配:auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet 静态地址 10.0.2.50 网络掩码 255.255.255.0 网关 10.0.2.100 广播 10.0.2.255但是,使用“ifdown eth0”会给出:“ifdown:interface eth0 not configured”。我不明白,因为容器中的“ip a”给了我 eth0 的“inet 172.17.0.3/16 scope global eth0”(而没有关于 docker0 ...)
    • 是的,我的错。 ifdown 不会取消配置此接口,因为接口已由 docker 配置但不是 ifup。你可以运行ifup eth0。之后,您的 eth0 将有两个 IP 地址。您也可以使用 ip addr del ${OLD_ADDRESS} dev eth0 删除旧 IP 地址
    • 感谢您的提示。所以我尝试了 ifup,但我得到了与前几天相同的错误:root@758da37c06e7:/# ifup eth0 RTNETLINK answers: Operation not allowed 无法启动 eth0。 /// 我在尝试“root@758da37c06e7:/# ip addr del 172.17.0.4/16 dev eth0 RTNETLINK answers: Operation not allowed”之前得到同样的错误“RTNETLINK answers: Operation not allowed”。
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2021-01-04
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多