Bootstrap

Docker网络管理--原生网络(bridge host none)与自定义网络

当开始大规模使用Docker时,会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker 的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后介绍一些自定义网络模式。

一 默认网路(bridge host none)

当安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络

[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1ac95ee04680        bridge              bridge              local
7cc9b35549e8        host                host                local
087f79d6ce55        none                null                local

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥
ip addr show docker0

 

Docker内置这三个网络,运行容器时,可以使用该--network标志来指定容器应连接到哪些网络。

bridge网络代表docker0所有Docker安装中存在的网络。除非你使用该docker run --network=<NETWORK>选项指定,否则Docker守护程序默认将容器连接到此网络。

我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:

host模式:使用 --net=host 指定。

none模式:使用 --net=none 指定。

bridge模式:使用 --net=bridge 指定,默认设置。

container模式:使用 --net=container:NAME_or_ID 指定。

下面分别介绍一下Docker的各个网络模式。

1.1 默认网络通信模式brigde网桥

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物 理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网 段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般 Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是 可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。

开启容器后,自动添加brigde接口

Bridge 桥接模式的实现步骤主要如下:

    Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
    Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
    Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 e

;