Docker Network

一、Docker 网络架构

Docker 容器网络是为应用程序所创造的虚拟环境的一部分,其能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块

Docker 为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和驱动

1.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 通信

1.2 Libnetwork

Libnetwork 是 CNM 的一个标准实现。Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库,Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件,此外还实现了本地服务发现、基于 Ingress 的容器负载均衡,以及网络控制层和管理层等功能

1.3 驱动

 驱动主要负责实现数据层相关内容,如:网络的连通性和隔离性是由驱动来处理的。驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,如:桥接网络和覆盖网络

Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。例如 Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver 等等。每个驱动负责创建其上所有网络资源的创建和管理 

二、常见网络类型

2.1 bridge网络

bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问

Docker 容器的默认网络驱动,需多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择

2.2 host网络

对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。 当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择

2.3 container网络

这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建网卡、配置 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信

2.4 none网络

Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。即 Docker 容器没有网卡、IP、路由等信息。容器完全网络隔离

2.5 overlay网络

借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个 Docker 守护进程连接在一起,使集群服务能够相互通信。当需要运行在不同 Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择

在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,其是一个网桥设备,主要用于 Docker 各容器及宿主机的网络通信

三、Docker 网络管理命令

3.1 docker network create

功能:创建自定义网络

docker network create [OPTIONS] NETWORK
  • -d,--driver:网络驱动
  • --gateway:网关地址
  • --subnet:表示网段的 CIDR 格式的子网
  • --ipv6:启用 ipv6
docker network create --driver=bridge --subnet=192.168.0.0/16 br0

3.2 docker network inspect

功能:查看网络详情

docker network inspect [OPTIONS] NETWORK [NETWORK...]
  • -f,--format:指定格式

3.3 docker network connect

功能:将容器连接到网络。可以按照名称或者ID连接容器。一旦连接,容器可以与同一网络中的其他容器容器通信

docker network connect [OPTIONS] NETWORK CONTAINER
  • --ip:指定 IP 地址
  • --ip6:指定 IPv6 地址

3.4 docker network disconnect

功能:断开网络

docker network disconnect [OPTIONS] NETWORK CONTAINER
  • -f:强制退出

3.5 docker network prune

功能:删除不使用的网络 

docker network prune
  • -f,--force不提示

3.6 docker network rm

功能:删除一个或者多个网络

docker network rm NETWORK [NETWORK...]
  • -f:强制退出

3.7 docker network list

功能:列出网络

docker network ls [OPTIONS]
# 别名
docker network list
  • -f,--filter:指定过滤条件
  • --format:指定格式
  • --no-trunc:不截断
  • -q,--quiet:仅仅显示 id

四、网络详解

4.1 docker Bridge网络

 Docker Bridge 网络采用内置的 bridge 驱动,bridge 驱动底层采用的是 Linux 内核中  Linux bridge 技术。就网络而言,bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,其允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离 

默认情况下,创建的容器在没有使用--network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络,即下面的 name 为 bridge 的网络

默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字

4.2 docker Host网络

 Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统, 但是基于 host 网络模式,容器将不会获得一个独立的 Network Namespace,而是和宿主机共用同一个 Network Namespace,容器将不会虚拟出自己的网卡,IP 等,而是直接使用宿主机的 IP 和端口 

 连接到 host 网络的容器共享宿主机的网络栈,容器的网络配置与宿主机完全一样。可以通过 --network=host 指定使用 host 网络 

4.3 docker Container网络

Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模式。之所以称为"other container 模式",是因为这个模式下的 Docker Container,会使用其他容器的网络环境。之所以称为"特别",是因为这个模式下容器的网络隔离性会处于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离

Docker Container 的 other container 网络模式实现逻辑如下:

  1. 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
  2. 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用 other container 的 namespace

4.4 docker none网络

none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何网卡

使用场景

针对一些对安全性要求比较高并且不需要联网的应用, 可以使用 none 网络, 如:生成随机密码, 避免生成密码被第三方获取

一些第三方的应用可能需要 docker 帮忙创建一个没有网络的容器, 网络由第三方自己来配置

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG_Bond20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值