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