Docker 1.10容器的IP在LAN中

由于Docker 1.10(和libnetwork更新),我们可以手动给一个用户定义的networking中的容器提供一个IP,这很酷!

我想给一个容器在我的局域网中的一个IP地址(就像我们可以用“桥”模式下的虚拟机一样)。 我的局域网是192.168.1.0/24,我所有的电脑里面都有IP地址。 而且我希望我的容器在这个范围内具有IP,以便从我的局域网中的任何地方到达它们(没有NAT / PAT /等等)。

我显然读过Jessie Frazelle的博客文章 ,还有很多其他人在这里和其他地方发帖:

  • 如何设置docker集装箱的iP?
  • 如何将特定的IP分配给容器并使其可以在VM主机之外访问?

还有更多,但没有出来。 我的容器仍然有IP地址在我的docker主机“内部”,而我的局域网上的其他电脑则无法访问。

读Jessie Frazelle的博客文章,我想(因为她使用公共IP),我们可以做我想做的事情吗?

编辑 :的确,如果我做了这样的事情:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet docker run --rm -it --net homenet --ip 192.168.1.100 nginx 

docker主机(br- [a-z0-9] +)上的新接口采用“ – 网关”IP,这是我的路由器IP。 和networking上两台电脑上的IP一样… BOOM

提前致谢。

编辑:这个解决scheme现在是无用的。 从版本1.12开始,Docker提供了两个networking驱动程序:macvlan和ipvlan。 它们允许从LANnetworking分配静态IP。 请参阅下面的答案 。


在寻找有同样问题的人之后,我们去了一个解决方法:

总结 :

  • (五)局域网是192.168.1.0/24
  • 默认网关(=路由器)是192.168.1.1
  • 多个Docker主机
  • 注意:我们有两个网卡:eth0和eth1(专门用于Docker)

我们想要什么 :

我们想要在192.168.1.0/24networking(如电脑)没有任何NAT / PAT /翻译/端口转发/等的IP容器…

问题

当这样做时:

 network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet 

我们可以给容器提供我们想要的IP, 但是br-[a-z0-9]+br-[a-z0-9]+ )创build的网桥将拥有IP 192.168.1.1,这是我们的路由器。

1.设置Dockernetworking

使用DefaultGatewayIPv4参数:

 docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet 

默认情况下,Docker会向桥接接口( br-[a-z0-9]+ )提供第一个IP,这个IP可能已经被另一台机器占用了。 解决方法是使用--gateway参数告诉--gateway分配一个任意的IP(可用):

 docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" --gateway=192.168.1.200 homenet 

我们可以通过将-o com.docker.network.bridge.name=br-home-net到上一个命令来指定网桥名称。

桥接桥!

现在我们有一个由Docker创build的桥( br-[a-z0-9]+ )。 我们需要将它连接到一个物理接口(在我的情况下,我必须NIC,所以我使用eth1):

 brctl addif br-home-net eth1 

3.删除网桥IP

我们现在可以从桥上删除IP地址,因为我们不需要一个:

 ip a del 192.168.1.200/24 dev br-home-net 

IP 192.168.1.200可以在多个docker主机上用作网桥,因为我们不使用它,我们删除它。

使用官方的Docker驱动程序:

从Docker v1.12.0-rc2开始 ,新的MACVLAN驱动程序现在可以在Docker正式版本中使用:

  • MacVlan驱动程序超出实验#23524

这些新的驱动程序已被作者详细logging,并附有使用示例 。

一天结束时,它应该提供类似的function,更容易设置,并与更less的错误/其他怪癖。

在Docker主机上查看容器:

只有警告新的官方macvlan驱动程序是docker主机不能看到/沟通自己的容器。 这可能是可取的或不是,取决于你的具体情况。

如果您的Docker主机上有多个NIC,则可以解决此问题。 并且两个NIC都连接到您的LAN。 然后,可以A)专门为Docker主机的2个nics中的一个专门用于docker。 并使用剩余的networking主机访问局域网。

或者B)通过添加特定路由到只需要通过第二个NIC访问的那些容器。 例如:

 sudo route add -host $container_ip gw $lan_router_ip $if_device_nic2 

方法A)是有用的,如果你想从docker主机访问所有的容器,并有多个硬连线。

如果您只需要访问docker主机中的几个特定容器,则Wheras方法B)很有用。 或者如果你的第二个网卡是一个无线网卡,并且处理所有的LANstream量会慢得多。 例如在一台笔记本电脑上。

安装:

如果在ubuntu 16.04 -rc2不到预发行的-rc2候选版本,请暂时将此行添加或修改到/etc/apt/sources.list中,以表示:

 deb https://apt.dockerproject.org/repo ubuntu-xenial testing 

而不是main (这是稳定版本)。

Docker现在支持MacvlanIPvlannetworking驱动程序。 这两个networking驱动程序的Docker文档可以在这里find。

使用这两种驱动程序,您可以实现所需的scheme(将容器configuration为在桥接模式下像虚拟机一样):

  • Macvlan :允许单个物理networking接口(主设备)拥有任意数量的从设备,每个从设备都有自己的MAC地址。

    需要Linux内核v3.9-3.19或4.0+。

  • IPvlan :允许为主设备创build任意数量的从设备,它们共享相同的MAC地址。

    需要Linux内核v4.2 +(支持早期的内核,但是有bug)。

    有关更多信息,请参阅kernel.org IPVLAN Driver HOWTO 。

通过将其中一个从属设备放入要configuration的容器的networking名称空间来实现容器连接。 主设备保留在主机操作系统(默认名称空间)上。

根据经验,如果连接到外部交换机/路由器的Linux主机的策略configuration为每个端口只允许一个MAC,则应使用IPvLAN驱动程序。 VMWare ESXi环境中经常出现这种情况!

另一个重要的事情要记住(Macvlan和IPvlan):往返主设备的stream量不能被发送到从设备。 如果需要启用主从通信,请参阅由IPvlan作者之一(Mahesh Bandewar)发表的“ IPVLAN – 开始 ”一文中的“ 与主机通信(default-ns) ”部分。

我不再推荐这个解决scheme。 所以它被删除了。 这是使用桥梁驱动程序和brctrl 。

现在有一个更好的官方司机。 请参阅此页上的其他答案: https : //stackoverflow.com/a/36470828/287510

可以通过pipework将物理接口映射到容器中。

将容器连接到本地物理接口

 pipework eth2 $(docker run -d hipache /usr/sbin/hipache) 50.19.169.157/24 pipework eth3 $(docker run -d hipache /usr/sbin/hipache) 107.22.140.5/24 

现在可能有一个本地的方式,但我没有考虑到1.10版本。