Docker的四大网络模式

198 阅读2分钟

容器的网络方案可以分为三大部分:

  • 单机的容器间通信;
  • 跨主机的容器间通信;
  • 容器与主机间通信。

Docker有以下4种网络模式:

  • bridge模式,通过--network=bridge指定;
  • host模式,通过--network=host指定;
  • container模式,通过--network=container:NAME_or_ID指定,即joiner容器;
  • none模式,通过--network=none指定。

我们在使用docker run命令创建Docker容器时,可以使用--network选项指定容器的网络模式。

docker run ... --network=bridge
docker run ... --network=host
docker run ... --network=container:其他容器name或id
docker run ... --network=none

在安装完Docker之后,Docker Daemon会在宿主机上自动创建三个网络,分别是bridge网络、host网络和none网络,可以使用docker network ls命令查看,如下所示:

#docker network ls
NETWORK ID          NAME                                DRIVER              SCOPE
2f01f5e5421a        bridge                              bridge              local
75462fae20e3        host                                host                local
1d84d00c73db        none                                null                local

bridge模式

host模式

在host模式下,容器和宿主机共用一个network namespace。,如下图所示。

20211022104100

创建一个host网络的容器:

docker run -it --rm --network=host busybox

在容器中查看一下网络信息:

ifconfig

docker0   Link encap:Ethernet  HWaddr 02:42:5E:BF:85:DC  
          ...

ens33     Link encap:Ethernet  HWaddr 00:0C:29:66:D9:C8  
          ...

lo        Link encap:Local Loopback  
          ...

看到的网卡信息和宿主机中一摸一样。

尝试在容器中操作网络,发现没有权限,所以在容器中对网络的操作是有限制的。

ip link add veth0 type veth peer name veth1

ip: RTNETLINK answers: Operation not permitted
ip addr add 1.2.3.3/24 dev ens33

ip: RTNETLINK answers: Operation not permitted

container模式

与一个指定的容器共用一个network namespace。

20211022104207

同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。Kubernetes的Pod网络采用的就是Docker的container模式网络。

我们创建一个运行nginx服务的容器,再创建一个容器再容器内访问nginx服务器,因为它们共用一个network namespace,所以通过本地回环地址127.0.0.1就可以访问了, 如下所示。

docker run --name some-nginx -d nginx
docker run --network=container:some-nginx rancher/curl curl http://127.0.0.1

none模式

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