自Docker 1.10(以及libnetwork更新)以来,我们可以手动为用户定义的网络内的容器提供IP,这很酷!
我想在LAN中为容器提供一个IP地址(就像我们可以在“桥接”模式下使用虚拟机)。我的局域网是192.168.1.0/24,我的所有计算机都有IP地址。我希望我的容器具有此范围内的IP,以便从LAN中的任何位置(无NAT / PAT /等等)到达它们。
我显然读过Jessie Frazelle的blog post,其他很多人都在这里和其他地方发帖如下:
等等,但没有任何结果;我的容器仍然在我的docker主机“内部”有IP地址,而我的LAN上的其他计算机无法访问它。
阅读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] +)采用'--gateway'IP,这是我的路由器IP。在网络上的两台计算机上使用相同的IP ... BOOM
提前致谢。
答案 0 :(得分:18)
编辑:此解决方案现在无用。从版本1.12开始,Docker提供了两个网络驱动程序:macvlan和ipvlan。它们允许从LAN网络分配静态IP。请参阅answer below。
在寻找people who have the same problem后,我们采用了解决方法:
我们希望在192.168.1.0/24网络(如计算机)中安装带有ip的容器,而不需要任何NAT / PAT /转换/端口转发/等...
这样做时:
network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
我们能够为容器提供我们想要的IP,但由docker(br-[a-z0-9]+
)创建的网桥将具有IP 192.168.1.1,这是我们的路由器。
使用DefaultGatewayIPv4
参数:
docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet
默认情况下,Docker会向桥接口(br-[a-z0-9]+
)提供第一个IP,这可能已被另一台机器占用。解决方案是使用--gateway
参数告诉docker分配任意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创建的桥(br-[a-z0-9]+
)。我们需要将它桥接到物理接口(在我的情况下,我必须使用NIC,所以我使用eth1):
brctl addif br-home-net eth1
我们现在可以从网桥中删除IP地址,因为我们不需要一个:
ip a del 192.168.1.200/24 dev br-home-net
IP 192.168.1.200
可用作多个泊坞主机上的桥接器,因为我们不使用它,我们将其删除。
答案 1 :(得分:5)
Docker现在支持 Macvlan 和 IPvlan 网络驱动程序。可以找到两个网络驱动程序的Docker文档here。
使用这两种驱动程序,您可以实现所需的方案(将容器配置为在桥接模式下的行为类似于虚拟机):
Macvlan :允许单个物理网络接口(主设备)拥有任意数量的从设备,每个设备都有自己的MAC地址。
需要Linux内核v3.9-3.19或4.0 +。
IPvlan :允许您为主设备创建任意数量的从设备,这些设备共享相同的MAC地址。
需要Linux内核v4.2 +(支持早期内核但存在错误)。
有关详细信息,请参阅kernel.org IPVLAN Driver HOWTO。
通过将其中一个从属设备放入要配置的容器的网络命名空间来实现容器连接。主设备保留在主机操作系统上(默认命名空间)。
根据经验,如果连接到外部交换机/路由器的Linux主机配置的策略允许每个端口只有一个MAC,则应使用IPvlan驱动程序。在VMWare ESXi环境中经常出现这种情况!
另一个需要记住的重要事项(Macvlan和IPvlan):无法向主设备发送和从主设备发送流量。如果需要启用主从通信,请参阅其中一个发布的“ IPVLAN - 开始”文章中的“与主机通信(default-ns)”部分IPvlan作者(Mahesh Bandewar)。
答案 2 :(得分:4)
使用官方Docker驱动程序:
从Docker v1.12.0-rc2开始,新的MACVLAN驱动程序现已在官方Docker版本中提供:
- MacVlan驱动程序不在实验#23524
这些新驱动程序已well documented by the author(s), with usage examples。
它应该提供类似的功能,更容易设置,以及更少的错误/其他怪癖。
在Docker主机上查看容器:
新官方macvlan驱动程序的唯一警告是docker主机无法查看/与自己的容器通信。根据您的具体情况,这可能是否可取。
如果Docker主机上有多个NIC,则可以解决此问题。两个NIC都连接到您的LAN。然后可以A)专门为docker主机的2个nic专用于docker。并使用剩余的nic来让主机访问LAN。
或B)通过将特定路由添加到您需要通过第二个NIC访问的容器。例如:
sudo route add -host $container_ip gw $lan_router_ip $if_device_nic2
如果您想从docker主机访问所有容器并且您有多个硬连线链接,方法A)非常有用。
如果您只需要从docker主机访问几个特定容器,那么<p> Wheras方法B)非常有用。或者,如果您的第二个NIC是一个wifi卡,并且处理所有LAN流量的速度会慢得多。例如,在笔记本电脑上。<强> 安装: 强>
如果在ubuntu 16.04上看不到预先发布的-rc2
候选人,请暂时将此行添加或修改到/etc/apt/sources.list,说:
deb https://apt.dockerproject.org/repo ubuntu-xenial testing
而不是main
(稳定版本)。
答案 3 :(得分:2)
我不再推荐这个解决方案了。所以它已被删除。那是using bridge driver and brctrl 。
现在有一个更好的官方司机。请参阅此页面上的其他答案:https://stackoverflow.com/a/36470828/287510
答案 4 :(得分:0)
以下是使用macvlan的示例。它在http://10.0.2.1/启动了一个Web服务器。
这些命令和Docker Compose文件适用于QNAP和QNAP的Container Station。请注意,QNAP的网络接口是qvs0
。
Lars Kellogg-Stedman的博客文章&#34; Using Docker macvlan networks&#34; [1] [2] 解释了命令的含义。
docker network create -d macvlan -o parent=qvs0 --subnet 10.0.0.0/8 --gateway 10.0.0.1 --ip-range 10.0.2.0/24 --aux-address "host=10.0.2.254" macvlan0
ip link del macvlan0-shim link qvs0 type macvlan mode bridge
ip link add macvlan0-shim link qvs0 type macvlan mode bridge
ip addr add 10.0.2.254/32 dev macvlan0-shim
ip link set macvlan0-shim up
ip route add 10.0.2.0/24 dev macvlan0-shim
docker run --network="macvlan0" --ip=10.0.2.1 -p 80:80 nginx
使用版本2,因为版本3不支持其他网络配置,例如gateway
,ip_range
和aux_address
。
version: "2.3"
services:
HTTPd:
image: nginx:latest
ports:
- "80:80/tcp"
- "80:80/udp"
networks:
macvlan0:
ipv4_address: "10.0.2.1"
networks:
macvlan0:
driver: macvlan
driver_opts:
parent: qvs0
ipam:
config:
- subnet: "10.0.0.0/8"
gateway: "10.0.0.1"
ip_range: "10.0.2.0/24"
aux_address: "host=10.0.2.254"
答案 5 :(得分:-1)
可以通过pipework
将物理接口映射到容器中。
Connect a container to a local physical interface
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版本。