Bootstrap

Docker 网络

目录

前言

一、Docker 网络的底层原理

二、创建新的命名空间,并让二者互相ping通

1.创建命名空间

2.创建网络接口 veth pair

3.命名空间添加veth接口

4.veth接口分配IP

三、Docker 网络架构

1.bridge 网络

2.docker 0 网桥工作原理

3.查看bridge 连接,容器IP

4.创建网络

5. none 网络

 6.host网络

总结


前言

  最近学习到了Docker网络,了解到宿主机与容器之间如何通信的,容器中运行的应用如何通过web访问到的。

一、Docker 网络的底层原理

Docker 网络的底层原理是 Linux 的 Network Namespace,它能够实现网络虚拟化。

二、创建新的命名空间,并让二者互相ping通

1.创建命名空间

分别创建两个命名空间nsw1与nsw2,参考代码如下:

[root@localhost ~]# ip netns add nsw1
[root@localhost ~]# ip netns add nsw2
[root@localhost ~]# ip netns list
[root@localhost ~]# ip netns exec nsw1 ip a
[root@localhost ~]# ip netns exec nsw2 ip a

2.创建网络接口 veth pair

创建网络接口veth-nsw1与veth-nsw2,参考代码如下:

[root@localhost ~]# ip link add veth-nsw1 type veth peer name veth-nsw2

 

3.命名空间添加veth接口

通过ip link set命令,分配两个命名空间。

[root@localhost ~]# ip link set veth-nsw1 netns nsw1 
[root@localhost ~]# ip link set veth-nsw2 netns nsw2 

4.veth接口分配IP

  此时创建的两个网络接口是没有 IP 的。下面要通过 ip netns exec 命令,为每个指定的命名空间执行 IP 添加命令: ip addr add [ip] dev [网络接口],参考命令如下:

[root@localhost ~]# ip netns exec nsw1 ip addr add 192.168.1.10/24 dev veth-nsw1
[root@localhost ~]# ip netns exec nsw2 ip addr add 192.168.1.11/24 dev veth-nsw2
--查看分配的IP
[root@localhost ~]# ip netns exec nsw1 ip a 
[root@localhost ~]# ip netns exec nsw2 ip a 
--启动veth接口
[root@localhost ~]# ip netns exec nsw1 ip link set dev veth-nsw1 up 
[root@localhost ~]# ip netns exec nsw2 ip link set dev veth-nsw2 up

 

三、Docker 网络架构

Docker 网络架构由三个主要部分构成:CNM、Libnetwork 与 Driver。 

CNM,Container Network Model,容器网络模型,其是一种网络连接的解决方案,是一种设计规范、设计标准,其规定了 Docker 网络的基础组成要素。CNM 中定义了三个基本要素:沙盒 Sandbox,终端 Endpoint 与网络 Network。

CNM 是设计规范,而 Libnetwork 是开源的、由 Go 语言编写的、跨平台的 CNM 的标准

实现。Libnetwork 除了实现了 CNM 的三个组件,还实现了本地服务发现、容器负载均衡,以及网络控制层与管理层功能。

不同的网络类型都有对应的不同的底层 Driver,这些 Driver 负责在主机上真正实现

需要的网络功能,例如创建 veth pair 设备等。工作方式都是类似的。通过调用 Docker 引擎的 API 发出请求,然后由 Libnetwork 做出框架性的处理,然后将请求转发给相应的 Driver。通过 docker network ls 命令可以查看当前主机所连接的网络及网络类型。

1.bridge 网络

它也称为单机桥接网络,是 Docker 默认的网络模式。该网络模式只能存在于单个 Docker 主机上,其只能用于连接所在 Docker 主机上的容器。默认的虚拟网桥为docker 0,通如下命令查看

[root@localhost ~]# docker network inspect bridge 
[root@localhost ~]# ip a 

 

2.docker 0 网桥工作原理

在 Linux 主机上,Docker 的 bridge 网络由 Bridge 驱动创建,其在创建时会创建一个默认

的网桥 docker0。容器与网桥间是通过 veth pair 技术实现的连接,网桥与外网间是通过“网络地址转换 NAT 技术”实现的连接,即将通信的数据包中的内网地址转换为外网地址。

3.查看bridge 连接,容器IP

brctl show 
docker inspect ww3

 

4.创建网络

[root@localhost yum.repos.d]# docker network create -d bridge bridge2
[root@localhost yum.repos.d]# docker network ls
[root@localhost yum.repos.d]# docker run -d -it --name ww4 --network bridge2  ubuntu:latest /bin/bash 
--查看bridge2网络详情
[root@localhost yum.repos.d]# docker network inspect bridge2


5. none 网络

none 网络,即没有网络。容器仍是一个独立的 Network Namespace,但没有网络接口,没有 IP

 6.host网络

host 网络,即与宿主机 host 共用一个 Network Namespace。该网络类型的容器没有独立

的网络空间,没有独立的 IP,全部与 host 共用。host网络与容器使用的相同的端口号,不需要额外的端口映射,注意端口冲突。

总结

  1. 一个 Network Namespece 就代表一个独立的主机。一个容器就对应一个 Namespece,所以一个容器就代表了网络中的一个独立主机。
  2. CNM 是规范,Libnetwork 是 CNM 规范的实现,Driver 是 Libnetwork 中不同网络模式的实现
;