主机网络
如果对容器使用host网络模式,则该容器的网络堆栈不会与Docker主机隔离(该容器共享主机的网络名称空间),并且该容器不会分配自己的IP地址。例如,如果运行一个绑定到端口80 host 的容器并使用网络,则该容器的应用程序在主机IP地址上的端口80上可用。
注
:由于使用时容器不拥有自己的IP地址
host模式的网络,端口映射不生效,并且-p,–publish,-P,和–publish-all选项都将被忽略,产生一个警告而不是:
WARNING: Published ports are discarded when using host network mode
主机模式网络对于优化性能以及在容器需要处理大量端口的情况下很有用,因为它不需要网络地址转换(NAT),并且不会为每个端口创建“ userland-proxy”。
主机网络驱动程序仅在Linux主机上工作,而Mac、Windows的Docker EE不支持该主机网络驱动程序。
host通过传递–network host 给docker service create命令,还可以将网络用于群集服务。在这种情况下,控制流量(与管理群集和服务有关的流量)仍会通过覆盖网络发送,但是各个群集服务容器会使用Docker守护程序的主机网络和端口发送数据。这带来了一些额外的限制。例如,如果服务容器绑定到端口80,则在给定的群集节点上只能运行一个服务容器。
示例
-
创建并启动容器作为一个独立的过程。该
--rm
选项意味着一旦容器退出/停止,就将其移除。该-d
标志意味着将容器在后台运行。docker run --rm -d --network host --name my_nginx nginx
-
通过浏览到http:// localhost:80 /来访问Nginx 。
-
使用以下命令检查您的网络堆栈:
检查所有网络接口,并确认未创建新的网络接口。ip addr show
使用netstat命令验证哪个进程绑定到端口80 。您需要使用sudo该进程,因为该进程归Docker守护程序用户所有,否则您将无法看到其名称或PID。
netstat -tulpn | grep :80
-
停止容器。使用–rm选项启动时,它将自动删除。
docker top my_nginx
macvlan网络
某些应用程序,尤其是旧版应用程序或监视网络流量的应用程序,期望直接连接到物理网络。在这种情况下,可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。在这种情况下,需要在Docker主机上指定用于的物理接口macvlan,以及的子网和网关macvlan。macvlan甚至可以使用不同的物理网络接口隔离网络。请记住以下几点:
- 由于IP地址耗尽或“ VLAN传播”,很容易无意间损坏您的网络,在这种情况下,网络中有大量不正确的唯一MAC地址。
- 网络设备需要能够处理“混杂模式”,在该模式下,可以为一个物理接口分配多个MAC地址。
- 如果应用程序可以使用网桥(在单个Docker主机上)或覆盖(跨多个Docker主机进行通信)工作,那么从长远来看,这些解决方案可能会更好。
创建一个macvlan网络
创建macvlan网络时,它可以处于桥接模式或802.1q中继桥接模式。
- 在桥接模式下,macvlan流量通过主机上的物理设备。
- 在802.1q中继桥接模式下,流量通过Docker动态创建的802.1q子接口。可以更精细地控制路由和过滤。
桥接模式
要创建macvlan与给定物理网络接口桥接的网络,–driver macvlan与docker network create命令一起使用。还需要指定parent,这是流量将在Docker主机上实际通过的接口。
docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1 \
-o parent=ens33 pub_net
如果需要排除IP地址在macvlan网络中的使用,例如当一个给定的IP地址已经在使用中时,请使用–aux-addresses:
docker network create -d macvlan \
--subnet=192.168.32.0/24 \
--ip-range=192.168.32.128/25 \
--gateway=192.168.32.254 \
--aux-address="my-router=192.168.32.129" \
-o parent=ens33 macnet32
802.1q中继桥接模式
如果指定parent带有点的接口名称,例如eth0.50,则Docker会将其解释为的子接口,eth0并自动创建该子接口。
docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
-o parent=eth0.50 macvlan50
使用ipvlan代替
在上面的示例中,仍在使用L3桥。可以改用ipvlan L2桥接器。指定
-o ipvlan_mode=l2。
docker network create -d ipvlan \
--subnet=192.168.210.0/24 \
--subnet=192.168.212.0/24 \
--gateway=192.168.210.254 \
--gateway=192.168.212.254 \
-o ipvlan_mode=l2 ipvlan210
禁用容器联网
如果要完全禁用容器上的网络堆栈,可以**–network none**在启动容器时使用该标志。
示例
-
创建容器。
docker run --rm -dit \ --network none \ --name no-net-alpine \ alpine:latest \ ash
-
通过在容器内执行一些常见的联网命令来检查容器的网络堆栈。请注意,没有eth0创建。
docker exec no-net-alpine ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1 link/ipip 0.0.0.0 brd 0.0.0.0 3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN qlen 1 link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
docker exec no-net-alpine ip route
第二个命令返回空,因为没有路由表。