Skip to content
60.Docker»20.网络模式»LV001-网络模式简介.md

LV001-网络模式简介

容器之间虽然不是物理隔离,但是它们彼此之间默认是不互联互通的,这也有助于保持每个容器的纯粹性,相互之间互不影响。既然使用了容器,通常情况下,容器需要与宿主机通信,或者 A 容器与 B 容器通信而 B 不需要知道 A 的存在,或者 A/B 两容器相互通信。从而,就引出了本节内容,他们相互通信,就绕不开容器的网络模式!

一、概述

1. 容器的网络模式

基于对 Network Namespace 的控制,docker 可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。按 docker 官方的说法,docker 容器的网络有五种模式:

模式名称 简介 备注

bridge

容器拥有独属于自己的虚拟网卡和和虚拟 IP 等网络资源,它们分别通过 docker0 虚拟网卡与宿主机的 eth0(一般是这个,也可能叫 ens33,看主机的网卡了) 网卡交互,进而和外界网络交互 默认模式
host 容器没有自己的任何独立的网络资源(比如:容器的 IP、网卡和端口),完全和宿主机共享网络空间 弊端:同一个端口只能同时被一个容器服务绑定
none 该模式关闭了容器的网络功能,仅有独自的网络空间(一个空架子),并且该模式不会给容器分配任何网络资源,包括虚拟网卡、路由、防火墙、IP、网关、端口等

只有一个容器,没有任何的网络资源(很少用)

container 它是 bridge 和 host 模式的合体,优先以 bridge 方式启动启动第一个容器,后面的所有容器启动时,均指定网络模式为 container,它们均共享第一个容器的网络资源,除了网络资源,其他资源,容器彼此之间依然是相互隔离的 第一个以 bridge 方式启动的容器服务挂掉,后面依赖它的容器,都暂停服务
自定义 该模式也更为灵活,可以通过-d 指定自定义的网络模式的类型,可以是 bridge 或者 overlay,其中 overlay 功能更为强大,可以指定多个 subnet 子网网段。 该模式,在容器之间可以使用别名相互通信,这一点可以给我们带来很大的方便(重要)

2. 三种网络

Docker 安装以后,会默认创建三种网络,可以通过下面的命令查看:

shell
docker network ls

【例】

shell
  /workspace git:(main) docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
7e6753c82f11   bridge    bridge    local
b5230fbd18e6   host      host      local
2b7fefd9cd99   none      null      local

Tips:这里只有三种,为什么上面说有五种?剩余的两种需要手动定义后,再通过 docker network ls 命令查看才会展现出来。

3. docker0 虚拟网卡

我们在 CNB 的云原生开发环境中执行 ifconfig 命令:

shell
  /workspace git:(main) ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:d2:70:dc:72  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.27.247.2  netmask 255.255.255.0  broadcast 172.27.247.255
        ether 02:42:ac:1b:f7:02  txqueuelen 0  (Ethernet)
        RX packets 3384  bytes 870989 (850.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3127  bytes 6466984 (6.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 94  bytes 7630 (7.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 94  bytes 7630 (7.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

就会看到这里有一个 docker0 的虚拟网卡,当 docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,宿主机上以 Bridge 模式启动的容器会链接到这个虚拟网桥上。docker0 默认地址 172.17.0.0/16

虚拟网桥的工作方式和物理交换机类似,这样宿主机上的所有容器就通过 docker0 连在一个二层网络中,再通过 docker0 和物理网卡 eth0 交互(这里 CNB 的网卡名字是 eth0,像本地 VMware 中 Ubuntu 的话可能就是叫 ens33 了)。

4. 怎么指定网络模式

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

shell
docker run --net=bridge
docker run --net=host
docker run --net=container
docker run --net=none

当是什么也不加的时候,默认使用的是 bridge 模式,这个模式下,内部容器都会把信息汇总给 docker0 网卡,由它再转发给 eth0,来和外界交互。

参考资料:

Docker:网络模式详解 - Gringer - 博客园

Docker 四种网络模式(Bridge,Host,Container,None) - wq9 - 博客园

Docker 学习:容器五种(3+2)网络模式 | bridge 模式 | host 模式 | none 模式 | container 模式 | 自定义网络模式详解-CSDN 博客

莫道桑榆晚 为霞尚满天.