Docker容器之网络

发布于:2025-03-24 ⋅ 阅读:(26) ⋅ 点赞:(0)

1.docker如何访问容器网络?

首先,通过宿主机创建的容器,可以通过宿主机ping通到容器内部。

安装完docker后,会在宿主机创建一个默认的docker0网卡,当运行一个网卡的时候,如果不指定网卡,那么所有的容器都默认使用该网卡进行通信。并且创建容器时会通过veth-pair虚拟技术在宿主机和容器内部创建一对相互映射的网卡,见如下图:

创建一个容器运行,下图左宿主机,右容器内,可以看到创建的一对网卡相互映射:

容器内部的网卡:

宿主机ping容器内ip

2.容器之间通过docker0桥接可以实现容器之间相互通信

docker是如何处理网络访问呢?答案就是通过veth-pair技术实现虚拟网卡的创建。创建容器时,如果不指定网卡,那么默认设置走的就是docker0网卡

如图:

好比插座一样,两个插头插入插座进行连通通信:

容器通信过程全部是通过veth-pair技术来时实现的,如上通信架构图:

容器之间通过网桥实现对对碰,每创建一个容器,就会生成一对网卡,所有的网络接口都是虚拟的,虚拟转发效率高。另外,当删除掉某个容器之后,对应的网卡也会随之被删除。

默认的docker0信息:

因为当某个容器损坏,重信启动一个功能一样的容器,那么容器ip是变更了的,可能就无法通信。那么是否可以指定名称是否可以通信?见如下图:

上图中,明显看到,因都通过docker0链接,可使用ip进行通信链接。但是无法使用容器名进行?因为默认没有配置dns解析,是无法通过容器名通信的。

docker中可如下参数可以通过容器名进行通信。详情见如下:

--link 通过某个容器链接到另外一个容器,运行一个新容器,通过--link指定,就可以通过当前容器向被连接的容器名直接ping通。反向则不可以(单项链接通信):

另外链接者可以通过docker inspect BBBB 的Links信息:

BBBB的配置:

上述Links和/etc/hosts都能说明BBBB配置了相关的AAAA信息(跟dns配置解析),所以能通过AAAA名称来通信。

可能有人会问,通过--link参数,在AAAA创建时,可使用指定目标BBBB,是否可行呢?答案是,不可能。因为此刻BBBB压根就不存咋。容器压根无法创建起来的。如下:

上述参数已经不推荐使用,局限性太大。另外真正使用中,不使用docker0,因不支持容器名链接访问。

3.自定义网络

查看docker网络:

网络模式:

bridge : 桥接 (docker0)

none: 不配置网络

host: 和宿主机共享网络

container: 容器网络连通,用的少,局限大

创建网卡的参数指令:

docker network --help

默认情况下启动一个容器会自动带有 --net bridge ,就是默认的docker0

dockr run -it --name kkkk --net bridge busybox

自定义网卡创建

创建一个网卡:

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 lx_net

创建一个使用自定义网卡的容器:

docker run -it --name 666 --net lx_net busybox

创建容器指定自定义网卡:

容器会按照指定的网卡信息给容器分配ip地址:

网络连通:

实际场景中,存在容器之间存于不同的网段,导致无法通信,那么如何才能让其打通通信呢?

请看如下:

(不同网段的容器通信)

172.17.x.x网段

192.168.x.x网段:

上述两个容器GGG和UUU因在不同的网段,目前是无法通信的。如果想要让两者通信,需要将其打通,如何打通呢?可以通过docker network connect 网卡名 链接到网卡容器id or 容器名

例如,将GGG容器链接到192.168.x.x网卡段

再行测试:

下图所示,两个容器可以ping通了。

再来看看对应网卡信息:

docker inspect lx_net (容器GGG加入到lx_net网卡中)

图中发现,通过connet操作后,实质上是将容器GGG加入到了lx_net网卡中,如此变相打通了两个不再同网络的容器之间可以进行通信。

查看连接到网卡的容器GGG信息:

下图可以看到,在容器GGG的网络中,也具备了lx_net网卡相关信息,这也是网络通道打通的原因

再创建一个容器VVV,且查看网卡信息:

发现上图中VVV的网络信息中没有DNSxx是null信息。VVV我使用的是默认网卡。所以跟UUU容器肯定也是无法ping同的。如下图:

同样如果想两者之间打通,使用上述connet方法连通:

docker network connect lx_net VVV

VVV容器链接之后,容器VVV加入了网卡lx_net的dns信息,分别为名称容器id

docker inspect VVV (查看VVV容器网络信息)

再看看lx_net网卡网络信息:

VVV容器也被加入了,从而就可以实现通信

综上设置,就可以通过将不同网段的容器连接在一起,相互通信。