文章来源:WorkMap技术博客-Docker网络
简介
容器网络指的是容器之间(或容器与非Docker工作负载之间)连接和通信的能力。
容器不知道它连接到了什么样的网络,也不知道它的对等方是否也是Docker工作负载。容器只看到一个带有IP地址、网关、路由表、DNS服务和其他网络细节的网络接口。
默认情况下,使用docker create或docker run创建或运行容器时,容器不会将任何端口暴露给外部。
使用–publish或-p,将端口公开给Docker外部的服务。这会在主机上创建一个防火墙规则,将容器端口映射到主机上的一个端口,让外部访问。
以下是一些示例:
-p 8080:80
将容器中的 TCP 80 端口,映射到 Docker 主机的8080 端口 。
-p 192.168.1.100:8080:80
将容器中的 TCP 80 端口,映射到 IP 为 192.168.1.100 的Docker 主机 的8080 端口 。
> 只有ip是192.168.1.100的主机可以访问该容器;
-p 8080:80/udp
将容器中的 UDP 80 端口, 映射到 Docker 主机的8080 端口 。
-p 8080:80/tcp -p 8080:80/udp
将容器中的 TCP 80 端口,映射到 Docker 主机的 TCP 8080 端口 ,并将容器中的 UDP 80 端口,映射到 Docker 主机的 UDP 8080 端口 。
docker 网络驱动
Docker 的网络子系统是插件式架构的,通过不同的驱动程序来控制。默认提供下列驱动程序:
-
bridge:默认的网络驱动程序。如果不指定驱动程序,则创建的就是bridge网络。桥接网络通常用于同一主机上的多个容器间通信。
-
host:移除容器和 Docker 主机之间的网络隔离,直接使用主机的网络。用于系统类程序,需要访问主机网络。
-
overlay:将多个 Docker 主机连接在一起,使不同节点上的 Swarm 服务和独立容器可以通信。该方式可以解耦对操作系统级别路由的依赖。
-
ipvlan:IPvlan 网络使用户完全控制 IPv4 和 IPv6 寻址。VLAN 驱动程序在此基础上构建,可以完全控制layer 2 VLAN 标记甚至 IPvlan L3 路由。
-
macvlan:Macvlan 网络可以为容器分配 MAC 地址,使容器在主机网络上显示为物理设备。Docker 守护程序可以通过它们的 MAC 地址将流量路由到容器。用于期望直接连接到物理网络的传统应用程序。
-
none:完全隔离容器与主机和其他容器。
-
网络插件:可以安装和使用第三方网络插件。
默认安装的docker Engine,执行docker network ls
命令,可以列出所有网络。包括:bridge,host,none。
Bridge网络
桥接网络适用于在同一 Docker主机上运行的容器间通信。在不同 Docker 主机上运行的容器间通信,可以在操作系统级别管理路由,或者可以使用Overlay网络。
启动 Docker 时,会自动创建默认桥接网络(也称为 bridge),并且新启动的容器会默认连接到它。还可以创建用户定义的桥接网络。用户定义的桥接网络优先级高于默认桥接网络。
自定义桥接网路和默认桥接网络的区别
-
用户定义的桥接网络提供容器之间的自动 DNS 解析。
默认桥接网络上的容器只能通过 IP 地址相互访问,
在用户定义的桥接网络上,容器可以通过名称或别名解析彼此。 -
用户定义的桥接网络提供更好的隔离。
所有没有指定 --network 的容器都附加到默认桥接网络上。这可能会存在风险,因为不相关的堆栈/服务/容器可以相互通信。
使用用户定义的网络提供了一个作用域网络,只有附加到该网络的容器才能通信。 -
容器可以随时连接和断开用户定义的网络。
在容器的生命周期中,您可以随时连接或断开它与用户定义的网络的连接。
要将容器从默认桥接网络中删除,需要停止容器并使用不同的网络选项重新创建它。 -
每个用户定义的网络都创建一个可配置的桥接。
可以对默认桥接网络进行配置,但所有容器都使用相同的设置,例如 MTU 和 iptables 规则。默认桥接网络的配置需要重新启动 Docker。
使用 docker network create 创建和配置用户定义的桥接网络。如果不同组应用程序具有不同的网络要求,则可以在创建时单独配置每个用户定义的桥接。
常用命令
- 创建网络
docker network create my-net
创建自定义网络时,可以指定配置,可以通过
docker network create --help
命令查看参数。 - 删除网络
docker network rm my-net
- 启动容器时,连接到自定义网路
docker create --name my-nginx \ --network my-net \ --publish 8080:80 \ nginx:latest
- 将正在运行中的容器,连接到自定义网络
docker network connect my-net my-nginx
- 将容器从自定义网络中断开连接
docker network disconnect my-net my-nginx
Host网络
使用主机网络模式时,该容器的网络堆栈与 Docker 主机不隔离(容器共享主机的网络命名空间),并且容器不会分配自己的 IP 地址。
注意:使用主机模式网络时,由于容器没有自己的 IP 地址,因此端口映射不起作用,-p、–publish、-P 和 --publish-all 选项被忽略,并产生警告。
主机模式网络可用于优化性能,在需要处理大量端口的情况下非常有用,因为它不需要网络地址转换(NAT),并且不会为每个端口创建“用户空间代理”。
主机网络驱动程序仅适用于 Linux 主机,并不支持 Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server。
创建容器时使用host网络模式
docker run --rm -d --network host --name my_nginx nginx
通过http://localhost:80
访问该服务。
Overlay网络
Overlay网络驱动程序,在多个 Docker 主机之间创建分布式网络。该网络层位于主机网络之上,支持加密通信。
初始化一个 swarm集群 或将 Docker 主机加入现有 swarm 集群时,Docker 宿主机上会创建两个新网络:
- 一个名为ingress的Overlay网络,处理与 swarm 服务相关的控制和数据流量。创建 swarm 服务时,会默认连接到 ingress 网络。
- docker_gwbridge 桥接网络,用于连接多个Docker主机。
可以使用 docker network create 创建自定义的Overlay网络,就像创建自定义的桥接网络一样。服务或容器可以同时连接到多个网络。服务或容器只能在它们各自连接的网络之间进行通信。
虽然可以将 swarm 服务和独立容器都连接到覆盖网络,但默认行为和配置注意事项是不同的。
前置条件
-
加入到Overlay网络的 Docker 主机需要打开以下端口:
- 用于集群管理的 TCP 端口 2377
- 用于节点之间通信的 TCP 和 UDP 端口 7946
- 用于Overlay网络通信的 UDP 端口 4789
-
在创建Overlay网络之前,必须通过 docker swarm init 将 Docker主机初始化为集群管理节点,或使用 docker swarm join 将其加入到现有的swarm集群中。这两个操作都会创建默认的供Swarm服务使用的ingress。
使用方式
- 创建Swarm 服务使用的Overlay网络
docker network create -d overlay my-overlay
- 创建Swarm服务和独立容器间通信的Overlay网络
docker network create -d overlay --attachable my-attachable-overlay
- 创建加密网络
docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
使用自定义的ingress
- 删除默认ingress
docker network rm ingress
- 创建自定义ingress(可以自定义名字,但只能创建一个)
docker network create \ --driver overlay \ --ingress \ --subnet=10.11.0.0/16 \ --gateway=10.11.0.2 \ --opt com.docker.network.driver.mtu=1200 \ my-ingress
自定义docker_gwbridge(在加入到Swarm集群之前)
- 停止Docker引擎
- 删除docker_gwbridge
sudo ip link set docker_gwbridge down sudo ip link set docker_gwbridge down
- 启动docker引擎
- 创建自定义docker_gwbridge
docker network create \ --subnet 10.11.0.0/16 \ --opt com.docker.network.bridge.name=docker_gwbridge \ --opt com.docker.network.bridge.enable_icc=false \ --opt com.docker.network.bridge.enable_ip_masquerade=true \ docker_gwbridge
- 加入到swarm集群
Overlay网络的缺陷
由于 Linux 内核的限制,当1000个容器共存于同一主机上时,覆盖网络变得不稳定,容器间通信可能会中断。