docker网络技术剖析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker网络技术剖析相关的知识,希望对你有一定的参考价值。

Docker 中的网络功能介绍

docker容器访问外网,

外网访问docker容器,

docker容器间互访,

编译包制作成rpm包,

docker容器分割VLAN通信,


实验环境:未开启selinux

防伪码: 青春以梦为马


默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器。

Docker 允许通过外部访问容器或容器互联的方式来提供网络服务

外部访问容器:

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P    -p  参数来指定端口映射。

练习环境:运行一个容器,提供web服务和ssh服务

宿主机启用路由转发(net.ipv4.ip_forward=1

通过docker  commitdockerfile生成一个web应用的镜像,这里我通过dockerdockerfile构建镜像模板

1)创建一个sshd_dockerfile工作目录

技术分享

编辑run.sh文件

技术分享

在主机上生成ssh秘钥对,并创建authorized_keys文件

技术分享

技术分享

技术分享

sshd_dockerfile目录下,使用docker  build命令来创建镜像,注意:在最后还有一个”.”,表示使用当前目录中的dockerfile

技术分享

执行docker images查看新生成的镜像

技术分享

当使用–P(大写)标记时,Docker 会随机映射一个随机的端口到内部容器开放的网络端口。

注:-P使用时需要指定--expose选项或dockerfile中用expose指令容器要暴露的端口,指定需要对外提供服务的端口

使用  docker ps  可以看到,本地主机的32770被映射到了容器的22端口,本地主机的32769被映射到了容器的80端口,本地主机的32768被映射到了容器的443 端口。

技术分享

此时访问本机的 32770端口即可访问容器内 ssh 应用。

技术分享

注:192.168.110.128是宿主机的地址

查看容器运行的httpd进程

技术分享

此时访问本机的 32769端口即可访问容器内 web 应用

技术分享

-p(小写)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort |hostPort:containerPort

注意:

容器有自己的内部网络和 ip 地址(使用  docker inspect  可以获取所有的变量。)

-p 标记可以多次使用来绑定多个端口

 

映射所有接口地址:

使用 hostPort:containerPort 格式,将本地的10111端口映射到容器的 22 端口,本地的801端口映射到容器的80端口可以执行

技术分享

测试访问:

技术分享

测试web

技术分享

映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式,指定映射使用一个特定地址,比如宿主机网卡配置的一个地址192.168.110.128

技术分享

映射到指定地址的任意端口

使用 ip::containerPort 绑定192.168.1.102的任意端口到容器的80端口,本地主机会自动分配一个口。--name为启动的容器指定一个容器名。

技术分享

注:还可以使用 udp 标记来指定 udp 端口

# docker run -d -p127.0.0.1:5000:5000/udp –name db4 commit:v1

查看映射端口配置

使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

技术分享

Docker NAT iptables实现

默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器

 

容器访问外部实现

容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址(即docker0地址)。这是使用 iptables 的源地址伪装操作实现的

查看主机的 NAT 规则

iptables -t nat -vnL

技术分享

其中,上述规则将所有源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。

 

外部访问容器实现

容器允许外部访问,可以在 docker run 时候通过 -p -P 参数来启用,不管用那种办法,其实也是在本地的 iptable nat 表中添加相应的规则

使用 -P 时:

技术分享

iptables -t -nat -vnL

技术分享

使用 -p 80:80

技术分享

iptables -t -nat -vnL

技术分享

docker0  网桥

Docker服务默认会创建一个 docker0 网桥(其上有一个docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信

由于目前 Docker 网桥是 Linux 网桥,用户可以使用 brctl show 来查看网桥和端口连接信息。

技术分享

注:brctl 命令在centos中可以使用yum  install bridge-utils 来安装

每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的eth0端口。使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。

技术分享

技术分享

Docker网络配置

Docker 四种网络模式

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

  • host 模式,使用 --net=host 指定。

  • container 模式,使用 --net=container:NAMEorID 指定。

  • none 模式,使用 --net=none 指定。

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

 

host 模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

例如,我们在192.168.110.128/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.1.102:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

启动容器前,执行pgrep http查看宿主机httpd进程

技术分享

上面显示结果说明宿主机没有httpd进程运行

host 模式启动一个含有 web 应用的 Docker 容器

技术分享

用浏览器访问宿主机地址的80端口

注意防火墙:

技术分享

技术分享

container 模式

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

运行一个容器:查看容器的IP

技术分享

将容器切换到后台运行:ctrl+p ctrl+q

在运行一个容器使用container模式:查看新容器的地址

技术分享

none模式

这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

bridge模式

当 docker 启动时,会在主机上创建一个 docker0 的虚拟网卡。他随机挑选 RFC1918 私有网络中的一段地址给 docker0 。比如 172.17.0.1/16,16 位掩码的网段可以拥有 65534 个地址可以使用,这对主机和容器来说应该足够了。

docker0  不是普通的网卡,他是桥接到其他网卡的虚拟网卡,容器使用它来和主机相互通信。当创建一个 docker 容器的时候,它就创建了一个对接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,它们是绑在一起的一对孪生接口。这对接口在容器中那一端的的名字是 eth0 ,宿主主机端的会指定一个唯一的名字,比如 vethAQI2QT 这样的名字。

所有的 veth* 的接口都会桥接到 docker0 ,这样 docker 就创建了在主机和所有容器之间一个虚拟共享网

技术分享

bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 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 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)

技术分享

Docker完成以上网络配置的过程大致是这样的:

1.在主机上创建一对虚拟网卡vethpair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

2.Dockerveth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。

注:brctl 工具依赖 bridge-utils 软件包

技术分享

3.从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

容器内部访问外网以及容器和主机之间的端口映射都是通过Iptables实现的,可以查看Iptables表分析。

 

查看当前 docker0地址

技术分享

在容器运行时,每个容器都会分配一个特定的虚拟机口并桥接到 docker0。每个容器都会配置同 docker0 ip 相同网段的专用 ip 地址,docker0 IP 地址被用于所有容器的默认网关。

运行一个容器并查看

技术分享

通过brctl show命令查看

技术分享

以上, docker0 扮演着veth402429cveth7aad6a6这两个容器的虚拟接口 vethxx interface 桥接的角色。

 

执行docker  network  inspect bridge查看桥接网络的详细信息

技术分享

自定义网桥

除了默认的  docker0  网桥,用户也可以指定网桥来连接各个容器。在启动 Docker 服务的时候,使用  -b BRIDGE  --bridge=BRIDGE  来指定使用的网桥。

Docker 允许你管理 docker0 桥接或者通过-b选项自定义桥接网卡,需要安装bridge-utils软件包。

基本步骤如下:

1.确保 docker 的进程是停止的

2.创建自定义网桥

3.给网桥分配特定的 ip

4. -b 的方式指定网桥

 

具体操作步骤:

如果服务已经运行,那需要先停止服务,并删除旧的网桥

技术分享

然后创建一个网桥  bridge0,给网桥分配特定的 ip

技术分享

查看确认网桥创建并启动

技术分享

修改/etc/sysconfig/docker文件

修改前:

技术分享

修改后:添加前面所新建的网桥

技术分享

启动 Docker 服务。

技术分享

新建一个容器,可以看到它已经桥接到了  br0  上。

技术分享

docker 服务启动成功并绑定容器到新的网桥,新建一个容器,你会看到它的 ip 是我们的设置的新 ip段, docker 会自动检测到它。用 brctl show 可以看到容器启动或则停止后网桥的配置变化,在容器中使用 ip a ip r 来查看 ip 地址配置和路由信息。

重启主机之后,再启动docker服务发现起不来,因为以上都是命令配置,临时性的,只要重启主机就会失效,若要启动服务也有办法,就是将vim /etc/sysconfig/docker文件中的“-b=br0”删了就行。然后就回到了之前的docker0,如下图:

技术分享

技术分享

技术分享

现在docker服务是运行状态,而且虚拟网桥回归到了docker0

 

DNS/HOSTNAME自定义

Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。

在容器中使用 mount 命令可以看到挂载信息:注(mount命令软件包util-linux

# mount 技术分享

这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 /etc/resolv.conf文件立刻得到更新。

如果用户想要手动指定容器的配置,可以利用下面的选项。

-h HOSTNAME or --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的/etc/hostname /etc/hosts。但它在容器外部看不到,既不会在 docker ps 中显示,也不会在其他的容器的 /etc/hosts 看到。

技术分享

--link=CONTAINER_NAME:ALIAS 选项会在创建容器的时候,添加一个其他容器的主机名到

/etc/hosts 文件中,让新容器的进程可以使用主机名ALIAS 就可以连接它。

--dns=IP_ADDRESS 添加 DNS 服务器到容器的/etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host的主机时, DNS 不仅搜索 host,还会搜索 host.example.com。注意:如果没有上述最后 2 个选项,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。

具体其他选项可以查看docker  run  --help帮助

 

docker中的容器互联--linking 系统

docker 有一个 linking  系统可以连接多个容器。它会创建一对父子关系,父容器可以看到所选择的子容器的信息。该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息

自定义容器的命名

linking系统依据容器的名称来执行,因此,首先需要自定义一个好记的容器命名。当我们创建容器的时候,系统会随机分配一个名字。当然我们也可以自己来命名容器,这样做有 2 个好处:

当我们自己指定名称的时候,比较好记,比如一个 web 应用我们可以给它起名叫 web

当我们要连接其他容器时候,可以作为一个有用的参考点,比如连接 web 容器到 db 容器

使用  --name  标记可以为容器自定义命名。使用  docker ps 来验证设定的命名,也可以使用  docker inspect  来查看容器的名字dockerinspect -f "{{ .Name }}" 容器id

注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用 docker rm  来删除之前创建的同名容器。

在执行  docker run  的时候如果添加  --rm  标记,则容器在终止后会立刻删除。注意, --rm    -d  参数不能同时使用。

 

容器互联

使用--link参数可以让容器之间安全的进行交互。

下面先创建一个新的数据库容器。

docker run -dit --name dbserver镜像id

技术分享

然后创建一个新的 web 容器,并将它连接到 db 容器

技术分享

--link 标记的格式: --linkname:alias name 是我们要链接的容器的名称, alias 是这个链接的别名。

使用docker ps来查看容器的连接

技术分享

我们可以看到我们命名的容器, dbserver web dbserver 容器的 names 列有 dbserver 也有 web/dbserver 。这表示 web 容器链接到 db 容器,他们是一个父子关系。在这个 link 中, 2 个容器中有一对父子关系。 docker 2 个容器之间创建了一个安全的连接,而且不用映射dbserver容器的端口到宿主主机上。所以在启动 db 容器的时候也不用 -p -P 标记。使用 link 之后我们就可以不用暴露数据库端口到网络上。

 

注意:你可以链接多个子容器到父容器,比如我们可以链接多个 web db 容器上。

 

Docker 会添加子容器的 host 信息到父容器的  /etc/hosts 的文件。

下面是父容器 web hosts 文件

技术分享

这里有 2 hosts,第一个是 web 容器,web 容器用 id 作为他的主机名,第二个是 dbserver 容器的 ip 和主机名。可以在 web 容器中安装 ping 命令来测试跟dbserver容器的连通。

注意:官方的镜像默认没有安装 ping,需要自行安装,软件包名iputils

技术分享

附:在bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置--icc=false,这样只有使用--link才能使两个容器通信)。

 

多台物理主机之间的容器互联(暴露容器到真实网络中)

技术分享

docker 默认的桥接网卡是 docker0 。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 vethxxx,而 docker 只是把所有这些网卡桥接在一起,如下:

技术分享

这样就可以把这个网络看成是一个私有的网络,通过 nat  连接外网,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数。

如果在企业内部应用,或则做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。

 

技术分享

主机 A 和主机 B 的网卡一都连着物理交换机的同一个 vlan 101, 这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理机器互联。

这样就直接把容器暴露到物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。

不同容器之间的通信可以借助于pipework 这个工具

pipework是由Docker的工程师JérômePetazzoni开发的一个Docker网络配置工具,由200多行shell实现,方便易用。

下载地址:wgethttps://github.com/jpetazzo/pipework.git

技术分享

安装相应依赖软件

yum install bridge-utils -y

配置桥接网络

技术分享

Vi ifcfg-br0

技术分享

重启network服务

技术分享

docker 的桥接指定为 br0,这样跨主机不同容器之间通过 pipework 新建 docker 容器的网卡桥接到 br0,这样跨主机容器之间就可以通信了。

CentOS 7/RHEL 7系统

systemctl stop docker

修改/etc/sysconfig/docker

技术分享

Systemctl restart docker

pipework

docker 默认桥接指定到了 br0,则最好在创建容器的时候加上--net=none,防止自动分配的 IP 在局域网中有冲突。

技术分享

使用镜像运行一个容器

技术分享

注:默认不指定网卡设备名,则默认添加为 eth1

技术分享注:另外 pipework 不能添加静态路由,如果有需求则可以在 run 的时候加上 --privileged=true 权限在容器中手动添加,但这种安全性有缺陷,可以通过 ip netns 操作

技术分享

技术分享

访问容器提供的web服务:

技术分享

使用ip netns添加静态路由,避免创建容器使用--privileged=true选项造成一些不必要的安全问题:

技术分享

在其它宿主机进行相应的配置,新建容器并使用 pipework 添加虚拟网卡桥接到 br0,测试通信情况即可。

注:可以删除 docker0,直接把 docker 的桥接指定为 br0。也可以保留使用默认的配置,这样单主机容器之间的通信可以通过 docker0,而跨主机不同容器之间通过 pipework 新建 docker 容器的网卡桥接到 br0,这样跨主机容器之间就可以通信了。

 

扩展:

pipework可以在下面用三个场景来使用和工作原理。
1 Docker容器配置到本地网络环境中
为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了。
下面我们来操作一下,我主机A地址为192.168.1.102/24,网关为192.168.1.1,需要给Docker容器的地址配置为192.168.1.150/24。在主机A上做如下操作:
安装pipework
下载地址:wget https://github.com/jpetazzo/pipework.git

unzip pipework-master.zip

cp -p /root/pipework-master/pipework /usr/local/bin/
启动Docker容器。
docker run -itd --name test1 镜像 /bin/bash
配置容器网络,并连到网桥br0上。网关在IP地址后面加@指定。
pipework br0 test1 192.168.1.150/[email protected]
将主机enp0s3桥接到br0上,并把enp0s3IP配置在br0上。

ip addr add 192.168.1.102/24 dev br0

ip addr del 192.168.1.102/24 dev enp0s3

brctl addif br0 enp0s3

ip route del default

ip route add default via 192.168.1.1 devbr0 

注:如果是远程操作,中间网络会断掉,所以放在一条命令中执行。
ip addr add 192.168.1.102/24 dev br0; \ ip addr del 192.168.1.102/24 dev enp0s3;\ brctl addif br0 enp0s3; \ iproute del default; \ ip route add default via 192.168.1.1 dev br0 
完成上述步骤后,我们发现Docker容器已经可以使用新的IP和主机网络里的机器相互通信了。

进入容器内部查看容器的地址:

技术分享

pipework工作原理分析
那么容器到底发生了哪些变化呢?我们docker attachtest1上,发现容器中多了一块eth1的网卡,并且配置了192.168.1.150/24IP,而且默认路由也改为了192.168.1.1。这些都是pipework帮我们配置的。

·首先pipework检查是否存在br0网桥,若不存在,就自己创建。
   

·创建veth pair设备,用于为容器提供网卡并连接到br0网桥。
   

·使用docker inspect找到容器在主机中的PID,然后通过PID将容器的网络命名空间链接到/var/run/netns/目录下。这么做的目的是,方便在主机上使用ip netns命令配置容器的网络。因为,在Docker容器中,我们没有权限配置网络环境。
   

·将之前创建的veth pair设备分别加入容器和网桥中。在容器中的名称默认为eth1,可以通过pipework-i参数修改该名称。
   

·然后就是配置新网卡的IP。若在IP地址的后面加上网关地址,那么pipework会重新配置默认路由。这样容器通往外网的流量会经由新配置的eth1出去,而不是通过eth0docker0(若想完全抛弃自带的网络设置,在启动容器的时候可以指定--net=none)
以上就是pipework配置Docker网络的过程,这和Dockerbridge模式有着相似的步骤。事实上,Docker在实现上也采用了相同的底层机制。
通过源代码,可以看出,pipework通过封装Linux上的ipbrctl等命令,简化了在复杂场景下对容器连接的操作命令,为我们配置复杂的网络拓扑提供了一个强有力的工具。当然,如果想了解底层的操作,我们也可以直接使用这些Linux命令来完成工作,甚至可以根据自己的需求,添加额外的功能。

                                       
2 单主机Docker容器VLAN划分
pipework不仅可以使用Linux bridge连接Docker容器,还可以与OpenVswitch结合,实现Docker容器的VLAN划分。下面,就来简单演示一下,在单机环境下,如何实现Docker容器间的二层隔离。
为了演示隔离效果,我们将4个容器放在了同一个IP网段中。但实际他们是二层隔离的两个网络,有不同的广播域。

安装openvswitch

安装基础环境

yum install –y gcc make python-developenssl-devel kernel-devel graphviz \

  kernel-debug-devel autoconf automake rpm-build redhat-rpm-config \

  libtool

技术分享

解压与打包

tar zxvf openvswitch-2.3.1.tar.gz

mkdir -p ~/rpmbuild/SOURCES

cp openvswitch-2.3.1.tar.gz  ~/rpmbuild/SOURCES/

sed ‘s/openvswitch-kmod, //g‘openvswitch-2.3.1/rhel/openvswitch.spec >openvswitch-2.3.1/rhel/openvswitch_no_kmod.spec

rpmbuild -bb --without checkopenvswitch-2.3.1/rhel/openvswitch_no_kmod.spec

技术分享

之后会在~/rpmbuild/RPMS/x86_64/里有2个文件

技术分享

安装第一个就行

技术分享

启动

Systemctl start openvswitch

查看状态

技术分享

技术分享

可以看到是正常运行状态

安装pipework   过程略,参考前面的操作

创建交换机,把物理网卡加入ovs1

技术分享

技术分享

在主机A上创建4Docker容器,test1test2test3test4
技术分享

test1test2划分到一个vlan中,vlanmac地址后加@指定,此处mac地址省略

技术分享

完成上述操作后,使用docker attach连到容器中,然后用ping命令测试连通性,发现test1test2可以相互通信,但与test3test4隔离。这样,一个简单的VLAN隔离容器网络就已经完成。
由于OpenVswitch本身支持VLAN功能,所以这里pipework所做的工作和之前介绍的基本一样,只不过将Linux bridge替换成了OpenVswitch,在将veth pair的一端加入ovs0网桥时,指定了tag。底层操作如下:
ovs-vsctl add-port ovs0 veth* tag=100

技术分享

技术分享

证明vlan被分割,不同vlan的主机不能相互通信。


本文出自 “你好阳光” 博客,谢绝转载!

以上是关于docker网络技术剖析的主要内容,如果未能解决你的问题,请参考以下文章

docker技术剖析--docker网络

docker技术剖析--docker网络docker宿主机之间容器互通

Docker技术底层架构剖析

docker技术剖析--docker supervisorcompose

docker技术剖析--docker supervisor管理进程

docker技术剖析--数据卷