Jér*_*Pin 20 networking docker
从Docker 1.10(以及libnetwork更新)开始,我们可以手动为用户定义网络中的容器提供IP,这很酷!
我想在LAN中为容器提供一个IP地址(就像我们可以在"桥接"模式下使用虚拟机).我的局域网是192.168.1.0/24,我的所有计算机都有IP地址.我希望我的容器具有此范围内的IP,以便从LAN中的任何位置(无NAT/PAT /等等)到达它们.
我显然读过Jessie Frazelle的博客文章,很多其他人在这里和所有地方发帖都喜欢:
还有更多,但没有出来; 我的容器仍然在我的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
Run Code Online (Sandbox Code Playgroud)
docker主机上的新接口(br- [a-z0-9] +)采用' - gateway'IP,这是我的路由器IP.在网络上的两台计算机上使用相同的IP ... BOOM
提前致谢.
Jér*_*Pin 19
编辑:这个解决方案现在没用了.从版本1.12开始,Docker提供了两个网络驱动程序:macvlan和ipvlan.它们允许从LAN网络分配静态IP.请参阅以下答案.
在寻找有相同问题的人之后,我们找到了一个解决方法:
我们希望在192.168.1.0/24网络(如计算机)中使用带有ip的容器,而不需要任何NAT/PAT /转换/端口转发/等...
这样做时:
network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
Run Code Online (Sandbox Code Playgroud)
我们能够为容器提供我们想要的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
Run Code Online (Sandbox Code Playgroud)
默认情况下,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
Run Code Online (Sandbox Code Playgroud)
我们可以通过添加-o com.docker.network.bridge.name=br-home-net到上一个命令来指定桥名.
现在我们有了一个br-[a-z0-9]+由Docker创建的bridge().我们需要将它桥接到物理接口(在我的情况下,我必须使用NIC,所以我使用eth1):
brctl addif br-home-net eth1
Run Code Online (Sandbox Code Playgroud)
我们现在可以从桥中删除IP地址,因为我们不需要一个:
ip a del 192.168.1.200/24 dev br-home-net
Run Code Online (Sandbox Code Playgroud)
IP 192.168.1.200可以用作多个docker主机上的桥接器,因为我们不使用它,我们将其删除.
Docker现在支持Macvlan和IPvlan网络驱动程序.可以在此处找到两个网络驱动程序的Docker文档.
使用这两种驱动程序,您可以实现所需的方案(将容器配置为在桥接模式下的行为类似于虚拟机):
Macvlan:允许单个物理网络接口(主设备)拥有任意数量的从设备,每个设备都有自己的MAC地址.
需要Linux内核v3.9-3.19或4.0+.
IPvlan:允许您为主设备创建任意数量的从设备,这些设备共享相同的MAC地址.
需要Linux内核v4.2 +(支持早期内核但存在错误).
有关详细信息,请参阅kernel.org IPVLAN驱动程序HOWTO.
通过将其中一个从设备放入要配置的容器的网络命名空间来实现容器连接.主设备保留在主机操作系统(默认命名空间)上.
根据经验,如果连接到外部交换机/路由器的Linux主机配置的策略允许每个端口只允许一个MAC,则应使用IPvlan驱动程序.在VMWare ESXi环境中经常出现这种情况!
另一个需要记住的重要事项(Macvlan和IPvlan):进出主设备的流量不能发送到从设备和从设备发送.如果需要启用主从通信,请参见由地址作者之一(Mahesh Bandewar)发布的" IPVLAN - 开头 "文章中的" 与主机通信(default-ns) " 部分.
| 归档时间: |
|
| 查看次数: |
16682 次 |
| 最近记录: |