简介
Docker通过网络驱动network drivers
实现容器间的网络互联。默认情况Docker提供两种网络驱动,bridge
网络驱动和overlay
网络驱动。
查看网络:
1 |
|
名为bridge
的网络是一个特殊的网络即docker0
。除非显示声明,否则Docker创建容器时默认使用该网络。
1 |
|
启动容器,未指定网络默认使用docker0
:
1 |
|
查看容器网络:
1 |
|
获取容器IP地址:
1 |
|
Docker网络驱动类型
- bridage:默认网络驱动。桥接网络是的独立的容器之间能够通信。
- host:对于独立容器,移除容器和宿主机之间的网络隔离,直接使用宿主机的网络。
- overlay:覆盖网络能够将多个
Docker daemon
连接起来,并使swarm services之间能够通信。也可以使用覆盖网络在swarm services和独立容器之间建立网络通信,或者不同的Docker daemon
之间的独立容器建立通信。 - macvlan:Macvlan网络允许向容器分配固定的MAC地址,使它在网络中好似一个物理设备。Docker daemon通过MAC地址将流量路由到指定容器。
- none:禁用网络。这种模式下,通常会搭配自定义网络插件。
Overlay网络,覆盖网络
overlay
网络在Docker daemon之间创建了一个分布式的网络。它工作在宿主机网络之上,将容器连接起来。并支持网络加密特性。
当初始化swarm集群或加入一个swarm集群时,在Docker宿主机上会创建两个新的网络:
- ingress网络:一个名为
ingress
的覆盖网络,控制着swarm services的流量。当创建service且不指定自定义覆盖网络时,它被默认使用。 - docker_gwbridge:一个名为
docker_gwbridge
的桥接网络,在swarm集群中充当连接各个独立Docker daemon的角色。
对覆盖网络的操作
创建覆盖网络
前置条件:
- Docker daemon使用覆盖网络的防火墙规则,保持协议和端口双向放开
- TCP端口2377,用以集群管理的通信
- TCP和UDP端口7946,用以节点之间通信
- UDP端口4789,用以覆盖网络间流量
- 初始化swarm集群或者加入一个swarm集群。加入集群后会自动创建一个名为
ingress
的覆盖网络。然后你才可以创建自定义的覆盖网络。
覆盖网络流量加密
使用AES算法的GCM模式
swarm集群模式和独立容器
自定义ingress网络
1 |
|
自定义docker_gwbridge
网络接口
docker_gwbridge
是一个虚拟网桥,用以将覆盖网络和集群间的Docker daemon的物理网卡连接起来。当初始化swarm集群或加入swarm集群时,Docker会自动创建它,但它不是一个Docker设备。它存在与Docker宿主机的内核中。要对docker_gwbridge
进行定制,必须在加入swarm集群之前或先退出swarm集群。
- 停止Docker daemon
- 删除
docker_gwbridge
网桥1
2$ sudo ip link set docker_gwbridge down
$ sudo ip link del dev docker_gwbridge - 启动Docker daemon但不要初始化swarm集群
- 创建
docker_gwbridge
网桥1
2
3
4
5
6$ 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集群。因为docker_gwbridge已存在,Docker不会使用配置创建它。
对swarm集群服务的操作
在覆盖网络中发布端口
绕过swarm集群的routing mesh
1 |
|
参考资料: