Docker网络
Docker Bridge 网络采用内置的 bridge 驱动, bridge 驱动底层采用的是 Linux 内核中Linux bridge 技术。就网络而言, bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器
Docker网络
一.Docker网络架构
Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作
系统的网络环境中独立出来,形成容器自有的网络设备、 IP 协议栈、端口套接字、 IP
路由表、防火墙等等与网络相关的模块。
Docker 为实现容器网络,主要采用的架构由三部分组成: CNM、 Libnetwork 和驱动。
1.CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model)。 CNM 中规定
了 Docker 网络的基础组成要素: Sandbox、 Endpoint、 Network。
-
Sandbox:提供了容器的虚拟网络栈,也即端口、套接字、 IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
-
Network: Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。
-
Endpoint:就是虚拟网络的接口,就像普通网络接口一样, Endpoint 的主要职责
是负责创建连接。 Endpoint 类似于常见的网络适配器,那也就意味着一个 Endpoint 只
能接入某一个网络, 当容器需要接入到多个网络,就需要多个 Endpoint。
如上图所示,容器 B 有两个 Endpoint 并且分别接入 Networkd A 和 Network B。那么
容器 A 和容器 B 之间是可以实现通信的,因为都接入了 NetworkA。但是容器 A 和容
器 C 不可以通过容器 B 的两个 Endpoint 通信。
2.Libnetwork
Libnetwork 是 CNM 的一个标准实现。 Libnetwork 是开源库,采用 Go 语言编写(跨
平台的),也是 Docker 所使用的库, Docker 网络架构的核心代码都在这个库中。
Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基
于 Ingress 的容器负载均衡,以及网络控制层和管理层等功能。
3.驱动
驱动主要负责实现数据层相关内容,例如网络的连通性和隔离性是由驱动来处理的。
驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,例如桥接网络和覆盖网络。
Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。例如 Bridge Driver、
Host Driver、 Overlay Driver、 MacVLan Driver、 IPVLan Driver、 None Driver 等
等。每个驱动负责创建其上所有网络资源的创建和管理。
二.常见网络类型
- bridge 网络
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上
的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。
Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。 - host 网络
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。
当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络
是最佳选择。 - container 网络
这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主
机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器
共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离
的。两个容器的进程可以通过 lo 网卡设备通信 - none 网络
Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任
何网络配置。也就是说,这个 Docker 容器没有网卡、 IP、路由等信息。容器完全网络
隔离。 - overlay 网络
借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个
Docker 守护进程连接在一起,使集群服务能够相互通信。当我们需要运行在不同
Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆
盖网络是最佳选择。

另外,在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,它是一个网
桥设备,主要用于 Docker 各容器及宿主机的网络通信。
三.docker 网络管理命令

1.docker network create
- 功能
创建自定义网络 - 语法
docker network create [OPTIONS] NETWORK
- 关键参数
- -d, --driver: 网络驱动
- –gateway: 网关地址
- –subnet: 表示网段的 CIDR 格式的子网
- –ipv6: 启用 ipv6

2.docker network inspect
- 功能
查看网络详情 - 语法
docker network inspect [OPTIONS] NETWORK [NETWORK...]
- 关键参数
- -f,–format:指定格式

3.docker network connect
- 功能
于将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接,容器可以与同一网络中的其他容器通信。 - 语法
docker network connect [OPTIONS] NETWORK CONTAINER
- 关键参数
- –ip: 指定 IP 地址
- –ip6: 指定 IPv6 地址

4.docker network disconnect
- 功能
断开网络 - 语法
docker network disconnect [OPTIONS] NETWORK CONTAINER• 关键参数
- 关键参数
- -f:强制退出

5.docker network prune
- 功能
删除不使用的网络 - 语法
docker network prune [OPTIONS]
- 关键参数
- -f, --force : 不提示

6.docker network rm
- 功能
删除 1 个或者多个网络 - 语法
docker network rm NETWORK [NETWORK...]
- 关键参数
- -f:强制退出

7.docker network ls
- 功能
列出网络 - 语法
docker network ls [OPTIONS]
- 别名
docker network list
- 关键参数
- -f, --filter:指定过滤条件
- –format:指定格式
- –no-trunc:不截断
- -q, --quiet :仅仅显示 id



四.网络详解
1.docker Bridge 网络
网络介绍
Docker Bridge 网络采用内置的 bridge 驱动, bridge 驱动底层采用的是 Linux 内核中
Linux bridge 技术。就网络而言, bridge 网络是在网络段之间转发流量的链路层设备,
而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使
用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连
接到该网桥网络容器的隔离。
Docker Container 的 bridge 桥接模式可以参考下图:
默认情况下,创建的容器在没有使用–network 参数指定要加入的 docker 网络时,
默认都是加入 Docker 默认的单机桥接网络,即下面的 name 为 bridge 的网络。
查看 docker 支持的网络
默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。
Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。
bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。
2.docker Host 网络
网络介绍
Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统, 但是如果基
于 host 网络模式,容器将不会获得一个独立的 Network Namespace,而是和宿主机
共用同一个 Network Namespace,容器将不会虚拟出自己的网卡, IP 等,而是直接使
用宿主机的 IP 和端口。
3.docker Container 网络
网络介绍
Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模
式。之所以称为“other container 模式”,是因为这个模式下的 Docker Container,会使
用其他容器的网络环境。之所以称为“特别”,是因为这个模式下容器的网络隔离性会处
于 bridge 桥接模式与 host 模式之间。 Docker Container 共享其他容器的网络环境,则
至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的
容器存在网络隔离。
Docker Container 的 other container 网络模式可以参考下图:
Docker Container 的 other container 网络模式实现逻辑如下:
- 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
- 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,
使用 other container 的 namespace



使用场景
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容
器,传输效率较高。但是两个容器之间存在依赖,如果依赖容器重启了,会导致另外
一个服务的网络不可用。
4.docker none 网络
网络介绍
none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何
网卡。



使用场景
- 针对一些对安全性要求比较高并且不需要联网的应用, 可以使用 none 网络, 比
如生成随机密码, 避免生成密码被第三方获取。 - 一些第三方的应用可能需要 docker 帮忙创建一个没有网络的容器, 网络由第三
方自己来配置。
更多推荐


所有评论(0)