在 Docker 早期阶段,网络部分代码都存在于 daemon 当中。daemon 变得臃肿,并且不符合 UNIX 工具模块化设计原则,即既能独立工作,又易于集成到其他项目。
所以,Docker 将该网络部分从 daemon 中拆分,并重构为一个叫作 Libnetwork 的外部类库。
现在,Docker 核心网络架构代码都在 Libnetwork 当中。Libnetwork 实现了 CNM 中定义的全部 3 个组件。此外它还实现了本地服务发现(Service Discovery)、基于 Ingress 的容器负载均衡,以及网络控制层和管理层功能。
Docker 网络架构的设计规范是 CNM。CNM 中规定了 Docker 网络的基础组成要素,完整内容见 GitHub 的 docker/libnetwork 库。
抽象来讲,CNM 定义了 3 个基本要素:沙盒(Sandbox)、终端(Endpoint)和网络(Network)。
- 沙盒是一个独立的网络栈。其中包括以太网接口、端口、路由表以及 DNS 配置。
- 终端就是虚拟网络接口。就像普通网络接口一样,终端主要职责是负责创建连接。在 CNM 中,终端负责将沙盒连接到网络。
- 网络是 802.1d 网桥(类似大家熟知的交换机)的软件实现。因此,网络就是需要交互的终端的集合,并且终端之间相互独立。
两个均包含相同本地桥接网络 mynet 的 Docker 主机。虽然网络是相同的,但却是两个独立的网络。这意味着图中容器无法直接进行通信,因为并不在一个网络当中。每个 Docker 主机都有一个默认的单机桥接网络。
image.png
网络基本命令
# 列出网络
docker network ls
# 网络详细
docker network inspect
# 创建新的单机桥接网络
// Linux
docker network create -d bridge localnet
// Windows
docker network create -d nat localnet
# 创建一个新的容器,并接入到新建桥接网络 localnet 当中
docker run -d --name c1 \
--network localnet \
alpine sleep 1d
# 删除 Docker 主机上全部未使用的网络。
docker network prune
# 删除 Docker 主机上指定网络。
docker network rm localnet
# 给容器添加网络
docker network connect nginx localnet
# 连接时指定ip
docker network connect --ip 192.168.10.10 net1 ctn1
# 将两个容器 link方式连接到一起
docker network connect --link my-ctn1 my-ctn2
# 给容器断开网络
docker network disconnect nginx localnet
在 2015 年 3 月,Docker 公司收购了一个叫作 Socket Plane 的网络初创企业。收购的原因有二,首先是因为这会给 Docker 带来真正意义的网络架构,其次是让容器间联网变得非常简单,以至于开发人员都可以配置它。
Docker 公司在这两点上都取得了巨大的成功。但是,简洁的网络命令实际由大量的组件构成。这部分内容是在进行生产环境部署和问题定位前必须要了解的。
构建 Swarm
【4.1】服务器安装 Docker Swarm中搭建 Portainer 中介绍了swarm的搭建
覆盖网络
# 在 swarm 的主机上执行
docker network create -d overlay my-net
docker network ls
image.png
image.png
local bridge 网络 一般是以172 /16的
swarm overlay 一般是 10 /24 的
除了这两种还有
host 即直接使用宿主机的网络
none 即不适用任何网络
ipvlan/macvlan 虚拟的ip/虚拟mac
点波关注 系统搭建(docker)
网友评论