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