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 次瀏覽

開啟您的 職業生涯

完成課程獲得認證

開始學習
廣告