一、简介
Docker的网络结构来源于一种容器网络模型(CNM)的方案,核心部分是Libnetwork
,Libnetwork是对CNM的一种实现,在GitHub上有开源libnetwork: networking,Libnetwork提供了Docker的核心网络结构的全部功能,还提供了本地服务发现和基础容器的负载均衡
Docker网络结构组成
Docker的网络结构由3部分:
- CNM:设计标准,规定了Docker网络架构的基础组成要素
- Libnetwork:基础组件,控制管理层,Docker采用的CNM的具体实现,用Go语言编写
- 驱动:网络数据层,通过实现特定网络拓扑的方式来拓展模型网络能力
CNM
CNM中规定了Docker网络的基础组成要素,其中定义个3个基本要素:沙盒(Sandbox)、终端(Endpoint)和网络(Network)
沙盒:是一个独立的网络栈、其中包括以太网接口、端口、路由表以及DNS配置
终端:虚拟网络接口、可以理解为普通网络接口一样,主要负责创建连接。在CNM中,终端负责将沙盒的网络与外部网络联通
网络:就是网络!类似于交换机的软件实现
3个组件连接方式:

Docker容器是环境中最小的调度单位,容器间的网络连接大致,如下图:
容器A只有一个网络接口连接到了网络1,容器B有2个网络接口,分别连接到了网络1和网络2。容器A和容器B都链接了网络1所以互相通信的,但是容器B中的2个EP没有第三层架构,所以不能相互通信。

二、基本概念
是什么?
是 Docker 对容器网络隔离的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。
为什么需要?
- 容器间的网络隔离
- 实现部分容器之间的网络共享
- 管理多个子网下容器的 ip
能干什么?
-
提供了多种模式,可以定制化的为每个容器置顶不同的网络
-
自定义网络模式,划分不同的子网以及网关、dns等配置
-
网络互通
- 实现不同子网之间的网络互通
- 基于容器名(主机名)的方式在网络内访问
三、网络模式
Docker的网路模式一共有4中:
- Bridge
- none
- host
- Container
Docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | --net=host | 容器和宿主机共享Network namespace。 |
container模式 | --net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | --net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | --net=bridge | (默认为该模式) |
当我们安装Docker时,就自动装上了3种网络模式:Bridge、none、host
sql
# docker network ls
NETWORK ID NAME DRIVER SCOPE
89ec3f4e7254 bridge bridge local
d7c9c94fa497 host host local
cf539b4d3a68 none null local
创建容器时,默认使用的是Bridge模式
1、bridge 桥接模式
在主机中创建一个 Docker0 的虚拟网桥,在 Ddocker0 创建一对虚拟网卡,有一半在主机上 vethxxx,还有一半在容器内 eth0

2、host 主机模式
容器不再拥有自己的网络空间,而是直接与主机共享网络空间,那么基于该模式创建的容器对应的 ip 实际就是与主机同一个子网,同一个网段。
缺点:直接把容器的网络暴露出去

3、none
Docker 会拥有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息,意味着,当前容器处于不联网状态。
特点:完全隔离,与外部任何机器都无网络访问,只有自己的 lo 本地网络 127.0.0.1

4、container

就是不会创建自己的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等

5、自定义模式
不适用 Docker 自带的网络模式,而是自己去定制化自己特有的网络模式。
命令:
docker network COMMAND
docker 网络管理命令
sql
[root@iZwz936bbexlrZ ~]# docker network
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
创建网络的帮助文档
sql
[root@iZwz936bbexlrZ ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment
[root@iZwz936thmcmvxsgbbexlrZ ~]#
桥接模式的容器互联

跨网络通信

不同容器的网络模式不同,如何使两个容器连接起来
连接方式

将容器的也连接到自定模式上
arduino
docker network connect liuqingxu net1