Docker 网络是如何工作的?


Docker 最好的特性是“容器化和网络”。使用容器化,我们可以为各种用例创建独立和隔离的环境,例如 Web 应用程序(“Apache”)、数据库服务器(“MongoDB”)和操作系统(“Ubuntu”)。

但是 Docker 网络允许我们将这些容器化应用程序连接起来,以便它们彼此通信或与主机操作系统通信。

Docker Daemon 上的 Docker 网络类型

Docker 上有两种类型的网络:

  • 默认 Docker bridge 网络

  • 用户自定义网络

默认 Docker bridge 网络

此网络在 Docker 安装到主机操作系统后立即创建。要检查机器上的可用网络,请使用以下任何命令。

示例 1

$ip address show $ifconfig

输出

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
   inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
   inet6 fe80::42:49ff:fe42:9791  prefixlen 64  scopeid 0x20<link>
   ether 02:42:49:42:97:91  txqueuelen 0  (Ethernet)
   RX packets 0  bytes 0 (0.0 B)
   RX errors 0  dropped 0  overruns 0  frame 0
   TX packets 27  bytes 4038 (4.0 KB)
   TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

显示的网络之一是 docker0,它是默认的 bridge 网络。现在让我们创建一个 Docker 容器,并检查它是否连接到 docker0 网络。

示例 2

从 Docker Hub 拉取 busybox 的最新镜像并运行容器。

$docker pull busybox:latest

输出

Using default tag: latest
latest: Pulling from library/busybox
405fecb6a2fa: Pull complete 
Digest: sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65f5757a954831450185
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest

现在运行此镜像的容器。

示例 2

$docker run -itd --name mycontainer busybox

输出

337c0846a65ea2cf1b500b391aa64e98b8b7c54de0f10d13ddeab53fb9ff8eeb

现在让我们看看新创建的容器是否连接到 docker0。

示例 4

$ip address show

输出

veth617ac3f@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
   link/ether 3e:b7:dc:87:5f:3f brd ff:ff:ff:ff:ff:ff link-netnsid 0
   inet6 fe80::3cb7:dcff:fe87:5f3f/64 scope link 
      valid_lft forever preferred_lft forever

这表明一个新的虚拟以太网连接到 docker0 bridge 网络。

用户自定义网络

Docker 不希望 DevOps 工程师使用默认网络,因为它不像其他网络那样隔离和安全。如果您不想连接到此网络,您可以创建自己的网络并将容器连接到它。

要创建网络,您可以使用以下三种 Docker 网络类型。这些网络也称为驱动程序。

  • Bridge (桥接)

  • Host (主机)

  • None (无)

创建 Bridge 网络

Docker 网络提供各种功能,例如将容器连接到特定网络,使用特定驱动程序(bridge、host、null)创建网络等等。让我们创建一个 bridge 类型的网络,并将 mycontainer 容器连接到它。

示例 1

$docker network create -–driver bridge mynetwork

输出

dd1341a489b9b55d31521ea9665d935a9dff732f3b2552e88404aac90a6c5531

以下命令用于检查是否创建了新网络。

示例 2

$docker network ls

输出

NETWORK ID    NAME      DRIVER   SCOPE
1381008c7449   bridge     bridge   local
db9d7d7d4e55   host      host     local
dd1341a489b9   mynetwork   bridge   local
574f05aae08a   none      null     local

现在将此网络连接到容器。

示例 3

$docker network connect mynetwork mycontainer

要检查容器是否连接到网络,请在终端上执行以下命令。

示例 4

$docker network inspect mynetwork

输出

[
   {
      "Name": "mynetwork",
      "Id": "dd1341a489b9b55d31521ea9665d935a9dff732f3b2552e88404aac90a6c5531",
      "Created": "2022-11-27T14:59:49.852692374+05:30",
      "Scope": "local",
      "Driver": "bridge",
      "EnableIPv6": false,
      "IPAM": {
         "Driver": "default",
         "Options": {},
         "Config": [
            {
               "Subnet": "172.18.0.0/16",
               "Gateway": "172.18.0.1"
            }
         ]
      },
      "Internal": false,
      "Attachable": false,
      "Ingress": false,
      "ConfigFrom": {
         "Network": ""
      },
      "ConfigOnly": false,
      "Containers": {
         "337c0846a65ea2cf1b500b391aa64e98b8b7c54de0f10d13ddeab53fb9ff8eeb": {
            "Name": "mycontainer",
            "EndpointID": "fe31f87b1b61ccc6e220a7465d0d415596563df50729470be5346ce948c6c692",
            "MacAddress": "02:42:ac:12:00:02",
            "IPv4Address": "172.18.0.2/16",
            "IPv6Address": ""
         }
      },
      "Options": {},
      "Labels": {}
   }
]

突出显示的行表明容器 mycontainer 已成功连接到创建的网络 mynetwork。

创建 Host 网络

主机网络是最不安全和最少使用的 Docker 网络。一次只允许运行一个主机网络实例,此实例已由 Docker 创建,名为 host。我们可以在创建 Docker 容器期间或之后将此网络连接到容器。

在创建容器期间。

示例 1

$docker run –itd --network host --name newcontainer nginx

输出

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a603fa5e3b41: Pull complete
c39e1cda007e: Pull complete
90cfefba34d7: Pull complete
a38226fb7aba: Pull complete
62583498bae6: Pull complete
9802a2cfdb8d: Pull complete
Digest: sha256:e209ac2f37c70c1e0e9873a5f7231e91dcd83fdf1178d8ed36c2ec09974210ba
Status: Downloaded newer image for nginx:latest
ceb1670b8ce0a02c5ea8f6a2f617cf0530c07fc0f360a9fb11c23d93b5e070ce

主机网络的优点之一是您不需要公开或发布任何类型的端口。在这里,我们可以从主机访问 nginx 服务器。

您也可以为此容器使用 bridge 网络,但是您必须将 Docker 容器端口公开或发布到主机。

示例 2

$docker run –itd --name newwebserver --network bridge –p 8080:80 nginx 

输出

fbd0471717985bf7a198da76cc87dd458e1463a605228f5c6068f5d7b57bac72

让我们检查容器是否正在运行。使用以下命令查看最新的运行容器。

示例 3

$docker ps –l

输出

CONTAINER ID   IMAGE    COMMAND             CREATED       STATUS       PORTS                           NAMES
fbd047171798   nginx    "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   newwebserver

现在在主机浏览器中浏览到 localhost:8080。

创建 None 网络

此网络外部的任何人都无法与容器通信,反之亦然。容器将只具有环回地址,没有网络。none 网络的驱动程序是 null。

使用 none 网络创建 Docker 容器

示例 1

$docker run –itd --name alonecontainer --network none busybox

输出

e8f43661dfae89d4de892c301741ac9e9cf1b2b472e2f2260eecd24ec427192c

检查容器内的网络。首先使用以下命令进入容器 shell。

示例 2

$docker exec -it alonecontainer sh

在容器 shell 中,使用“ip”命令列出连接到此容器的网络。

示例 3

$ip address show

输出

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever

更新于:2022-12-28

321 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告