Docker网络:彻底解决容器与容器、容器与宿主机之间的通信痛点
Docker Network(网络)
Docker 网络架构简介
Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。
Docker 为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和驱动。
CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model)。CNM 中规定了 Docker 网络的基础组成要素:Sandbox、Endpoint、Network。

- Sandbox:提供了容器的虚拟网络栈,也即端口、套接字、IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
- Network:Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。
- Endpoint:就是虚拟网络的接口,就像普通网络接口一样,Endpoint 的主要职责是负责创建连接。Endpoint 类似于常见的网络适配器,一个 Endpoint 只能接入某一个网络,当容器需要接入到多个网络,就需要多个 Endpoint。
如上图所示,容器 B 有两个 Endpoint 并且分别接入 NetworkA 和 Network B。那么容器 A 和容器 B 之间是可以实现通信的,因为都接入了 NetworkA。但是容器 A 和容器 C 不可以通过容器 B 的两个 Endpoint 通信。
Libnetwork
Libnetwork 是 CNM 的一个标准实现。Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库,Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基于 Ingress 的容器负载均衡,以及网络控制层和管理层等功能。
驱动
驱动主要负责实现数据层相关内容,例如网络的连通性和隔离性是由驱动来处理的。驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,例如桥接网络和覆盖网络。
Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。例如 Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVlan Driver、None Driver 等等。每个驱动负责创建其上所有网络资源的创建和管理。

常见网络类型
1. bridge 网络
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。
Docker 容器的默认网络驱动。当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。
2. host 网络
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择。
3. container 网络
这个模式指定新创建的容器和引进存在的一个容器共享一个网络,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
4. none 网络
Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。容器完全网络隔离。
5. overlay 网络
借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个 Docker 守护进程连接在一起,使集群服务能够相互通信。当需要运行在不同 Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。
另外,在 Docker 安装时,会自动创建一个 docker0 的 Linux 桥设备,主要用于 Docker 各容器及宿主机的网络通信。
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::6c60:6cff:fe25:3165 prefixlen 64 scopeid 0x20<link>
ether 6e:60:6c:25:31:65 txqueuelen 0 (Ethernet)
RX packets 214188 bytes 18150375 (18.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 238839 bytes 467352547 (467.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Docker 网络管理命令
命令清单
| 命令 | 别名 | 功能 |
|---|---|---|
docker network create | 创建网络 | |
docker network connect | 连接网络 | |
docker network disconnect | 断开网络 | |
docker network ls | docker network list | 列出网络 |
docker network prune | 删除不使用的网络 | |
docker network inspect | 查看网络详情 | |
docker network rm | docker network remove | 删除 1 个或者多个网络 |
docker network create
- 功能:创建自定义网络
- 语法:
docker network create [OPTIONS] NETWORK - 关键参数:
-d, --driver:网络驱动--gateway:网关地址--subnet:表示网段的 CIDR 格式的子网--ipv6:启用 ipv6
- 样例:
drw@VM-0-14-ubuntu:~$ docker network create --driver=bridge --subnet=192.168.0.0/16 br0 b70a165e5a2a23106984b74a3e5e4d7f70de105d7812acf007095333078e5cb6 drw@VM-0-14-ubuntu:~$ docker network ls NETWORK ID NAME DRIVER SCOPE b70a165e5a2a br0 bridge local 81142c44c27c bridge bridge local 857b67128692 host host local bda7527b37a8 none null local
docker network inspect
- 功能:查看网络详情
- 语法:
docker network inspect [OPTIONS] NETWORK [NETWORK...] - 关键参数:
-f, --format:指定格式
- 样例:
drw@VM-0-14-ubuntu:~$ docker network inspect br0 [ { "Name": "br0", "Id": "b70a165e5a2a23106984b74a3e5e4d7f70de105d7812acf007095333078e5cb6", "Created": "2026-05-01T23:50:27.305562996+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv4": true, "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Options": {}, "Labels": {}, "Containers": {}, "Status": { "IPAM": { "Subnets": { "192.168.0.0/16": { "IPsInUse": 3, "DynamicIPsAvailable": 65533 } } } } } ]
docker network connect
- 功能:将容器连接到网络。可以按名称或 ID 连接容器。一旦连接,容器可以与同一网络中的其他容器通信。
- 语法:
docker network connect [OPTIONS] NETWORK CONTAINER - 关键参数:
--ip:指定 IP 地址--ip6:指定 IPv6 地址
- 样例:
# 将正在运行的容器连接到网络 $ docker network connect multi-host-network my_container1 # 启动时将容器连接到网络 $ docker run -itd --network=multi-host-network busybox-container # 指定容器的 IP 地址 $ docker network connect --ip 10.10.36.122 multi-host-network container2
docker network disconnect
- 功能:断开网络
- 语法:
docker network disconnect [OPTIONS] NETWORK CONTAINER - 关键参数:
-f:强制退出
- 样例:
docker network disconnect multi-host-network my_container1
docker network prune
- 功能:删除不使用的网络
- 语法:
docker network prune [OPTIONS] - 关键参数:
-f, --force:不提示
- 样例:
docker network prune
docker network rm
- 功能:删除 1 个或者多个网络
- 语法:
docker network rm NETWORK [NETWORK...] - 关键参数:
-f:强制退出
- 样例:
docker network rm br0
docker network ls
- 功能:列出网络
- 语法:
docker network ls [OPTIONS] - 别名:
docker network list - 关键参数:
-f, --filter:指定过滤条件--format:指定格式--no-trunc:不截断-q, --quiet:仅显示 id
- 样例:
docker network list
网络命令基本操作
1. 创建网络并指定 ip 地址段
docker network create --subnet=172.18.0.0/16 mynetwork
2. 查看创建的网络
root@139-159-150-152:/data/myworkdir/fs/webapp2# docker network ls
NETWORK ID NAME DRIVER SCOPE
722af9bec715 mynetwork bridge local
3. 创建一个容器并加入网络
root@139-159-150-152:/data/myworkdir/fs/webapp2# docker run -itd --name mynginx --network mynetwork nginx:1.22.1
33895fdea93bc939010542a5bc16123ab4e50873f412b75cc637ccda85c36c26
4. 查看容器网络信息
root@139-159-150-152:/data/myworkdir/fs/webapp2# docker inspect mynginx
[
{
"Networks": {
"mynetwork": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"33895fdea93b"
],
"NetworkID": "722af9bec71562ad5f1f80c354035911d5c493af34f6e483a25c16c0f8d394d",
"EndpointID": "5eee38468165501db5328a75ec444a93f92ad6814b1ba22aca9dc4c2863b369f",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
}
]
5. 创建一个新的 nginx 容器 mynginx2,但是不加入自定义网络
docker run -itd --name mynginx2 nginx:1.22.1
6. 查看该容器的网络配置,默认采用的是 docker0 桥
root@139-159-150-152:/data/myworkdir/fs/webapp2# docker inspect mynginx2
[
{
"NetworkSettings": {
"Bridge": "",
"SandboxID": "974cef355acef4255e27eac658c2240948c5d0595387ea0be172fd079829983",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/974cef355ace",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "15f4263e9ffdf14f10bdabc5186fd41629e700b22e6c320f45f23d7d1bb9166d4",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6bdab7287628b374a92bb115c060d93ccf518062d51b2d110104596928056dc1",
"EndpointID": "15f4263e9ffdf14f10bdabc5186fd41629e700b22e6c320f45f23d7d1bb9166d4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
7. 将该容器加入到创建的网络
docker network connect mynetwork mynginx2
8. 再次查看容器 2 网络配置,多了一个 mynetwork
root@139-159-150-152:/data/myworkdir/fs/webapp2# docker inspect mynginx2
[
{
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6bdab7287628b374a92bb115c060d93ccf518062d51b2d110104596928056dc1",
"EndpointID": "15f4263e9ffdf14f10bdabc5186fd41629e700b22e6c320f45f23d7d1bb9166d4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
},
"mynetwork": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"90345f6559a"
],
"NetworkID": "722af9bec71562ad5f1f80c354035911d5c493af34f6e483a25c16c0f8d394d",
"EndpointID": "c33fd16871850068d55c87aec001d6702358c5b943bbdf606a30848e56cd8",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:03",
"DriverOpts": {}
}
}
}
}
]
网络详解
docker Bridge 网络
网络介绍
Docker Bridge 网络采用内置的 bridge 驱动,bridge 驱动底层采用的是 Linux 内核中 Linux bridge 技术。就网络而言,bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥的容器的隔离。
Docker Container 的桥接模式可以参考下图:

默认情况下,创建的容器在没有使用 --network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络 ,即下面的 name 为 bridge 的网络。
# 查看 docker 支持的网络
[zsc@VM-8-12-centos ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
62025acd24c8 bridge bridge local
785122438a77 host host local
9ff4f20749be none null local
默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。
操作案例:容器间的网络通信
使用 busybox 镜像创建两个容器,并且保持在后台运行:
[zsc@VM-8-12-centos ~]$ docker container run -itd --name c1 busybox
04a54835bf9416ac07115356a0f1220aa1e505c033490fde013b03731b223550
[zsc@VM-8-12-centos ~]$ docker container run -itd --name c2 busybox
864bc0584612cee0a2ac8ebcd1c4a08ec2cf94ec21cb257523e946cf05f97fbd
查看两个容器的 ip 地址:
# 查看 c1 容器 ip 地址
[zsc@VM-8-12-centos ~]$ docker exec -it c1 ip a
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
109: eth0@if110: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 查看 c2 容器 ip 地址
[zsc@VM-8-12-centos ~]$ docker exec -it c2 ip a
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
99: eth0@if100: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
在 c1 容器中 ping c2 容器的 IP 地址,验证通信:
[zsc@VM-8-12-centos ~]$ docker container exec -it c1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.113 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.117 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.096 ms
64 bytes from 172.17.0.3: seq=3 ttl=64 time=0.100 ms
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.096/0.106/0.117 ms
查看 bridge 网络的详细信息:
[zsc@VM-8-12-centos ~]$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "62025acd24c8b81f82102acc1fa9496c18c21511a3ae2d3dc1c6919b9bddc5fb",
"Created": "2022-11-28T12:40:13.640581452+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"04a54835bf9416ac07115356a0f1220aa1e505c033490fde013b03731b223550": {
"Name": "c1",
"EndpointID": "32a38240d6c85e08a7a4e25c1db53d76e631ff77c232382f772b3091d05a5de6",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"864bc0584612cee0a2ac8ebcd1c4a08ec2cf94ec21cb257523e946cf05f97fbd": {
"Name": "c2",
"EndpointID": "61bf7176a40d752336c22edb691ff84878b88993750522c335aa64811515350ad",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
当我们停止其中一个容器时,它会自动和 docker0 断开连接:
[zsc@VM-8-12-centos ~]$ docker container stop c1
c1
再次查看 docker0 信息,发现容器 C1 和 docker0 切断连接了。
创建自定义 bridge
在默认情况下,我们创建的容器都会连接在 docker0 这个 bridge 上。那其实我们也可以创建一些自定义的 bridge,让运行的容器通过自定义 bridge 进行通信。可以通过 create 命令来创建新的 bridge。
[zsc@VM-8-12-centos ~]$ docker network create -d bridge new-bridge
0aa8840cec0c59ddfa5d57df1dceec278d1e2a2ad85164fcc869da36d4f5d2f7
创建自定义 bridge 时可能会出现如下报错:
[zsc@VM-8-12-centos ~]$ docker network create -d bridge new-bridge
Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-45ac8acddba4 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
可以通过重启 docker 服务来解决这个问题:
[zsc@VM-8-12-centos ~]$ systemctl restart docker
使用命令 docker network inspect 查看 new-bridge 网络信息会发现这个网络的子网 IP 是 172.18.0.0/16,它表示如果我们创建容器并连接到该网络上,就会给该容器分配一个 172.18.xx.xx 这个网段的 IP 地址。
[zsc@VM-8-12-centos ~]$ docker network inspect new-bridge
[
{
"Name": "new-bridge",
"Id": "0aa8840cec0c59ddfa5d57df1dceec278d1e2a2ad85164fcc869da36d4f5d2f7",
"Created": "2022-12-03T17:54:11.03156873+08:00",
"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": {},
"Options": {},
"Labels": {}
}
]
创建容器时,通过 --network 选项指定要连接的网络:
# 创建 c3 容器,并指定连接 new-bridge
[zsc@VM-8-12-centos ~]$ docker container run -itd --name c3 --network new-bridge busybox
7bf65538bf284901f2f54e69ad07b42e7c26ec33a15b2944c88cf0ca53b23e14
过滤 c3 容器网络相关信息,可以看到该容器已经连接到 new-bridge 上了:
[zsc@VM-8-12-centos ~]$ docker container inspect c3 | grep "Networks" -A 17
"Networks": {
"new-bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"7bf65538bf28"
],
"NetworkID": "0aa8840cec0c59ddfa5d57df1dceec278d1e2a2ad85164fcc869da36d4f5d2f7",
"EndpointID": "8fd511dd90c2cb3d0ffb848e9364b4d57601d6cbb6a02e037a7d48e1ff046906",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
查看自定义 bridge 网络的详细信息,发现 c3 容器已经连接到该网络上了。
DNS 解析
Docker 自定义桥接网络是支持通过 Docker DNS 服务进行域名解析的,可以直接使用容器名进行通信,因为 Docker 的 DNS 可以解析容器名到 IP 地址的映射。但是默认的 bridge 网络不支持 DNS 的。
- c1 和 c2 容器默认连接 bridge 网络
- c3 和 c4 容器默认连接 new-bridge 网络
# 创建 c4 容器,连接 new-bridge
[zsc@VM-8-12-centos ~]$ docker container run -itd --name c4 --network new-bridge busybox
601b834f6af72619e37bceed25344d9f29393092123eb132f56892a621a84ba2
查看当前容器列表:
[zsc@VM-8-12-centos ~]$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
601b834f6af7 busybox "sh" 20 seconds ago Up 19 seconds c4
7bf65538bf28 busybox "sh" 20 hours ago Up 20 hours c3
864bc0584612 busybox "sh" 42 hours ago Up 20 hours c2
04a54835bf94 busybox "sh" 42 hours ago Up 20 hours c1
验证 c1 和 c2 是否能够使用 dns 解析服务
查看 c1 和 c2 容器的 ip 地址:
[zsc@VM-8-12-centos ~]$ docker container exec -it c1 ip a
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
109: eth0@if110: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[zsc@VM-8-12-centos ~]$ docker container exec -it c2 ip a
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
99: eth0@if100: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
c1 容器 ping c2 容器的 IP 地址是可以 ping 通的:
[zsc@VM-8-12-centos ~]$ docker container exec -it c1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.087 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.087 ms
^C
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.087/0.087 ms
但 c1 容器 ping c2 容器名发现找不到 IP 地址,确定默认 bridge 网络不支持 DNS:
[zsc@VM-8-12-centos ~]$ docker container exec -it c1 ping c2
ping: bad address 'c2'
验证 c3 和 c4 是否能够使用 DNS 解析服务
查看 c3 和 c4 容器 IP 地址:
[zsc@VM-8-12-centos ~]$ docker container exec -it c3 ip a
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
105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
[zsc@VM-8-12-centos ~]$ docker container exec -it c4 ip a
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
113: eth0@if114: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
c3 容器 ping c4 容器的 IP 地址可通:
[zsc@VM-8-12-centos ~]$ docker container exec -it c3 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.200 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.099 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.135 ms
^C
--- 172.18.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.099/0.144/0.200 ms
c3 容器 ping c4 容器名可通,确定自定义 bridge 支持 DNS:
[zsc@VM-8-12-centos ~]$ docker container exec -it c3 ping c4
PING c4 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.099 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.105 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.110 ms
^C
--- c4 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.099/0.104/0.110 ms
端口暴露和转发
暴露方式
端口暴露有 2 种方式,在启动容器的时候添加端口参数:
-P:暴露所有端口,将指定的容器端口映射至主机所有地址的一个动态端口,动态端口指随机端口,具体的映射结果可使用docker port命令查看。-p <hostPort>:<containerPort>:将容器端口<containerPort>映射至指定的主机端口<hostPort>。
端口转发
连接 bridge 网络的容器只能与连接在当前网络中的容器进行通信。如果一个容器想要对外提供一些网络服务的话,需要进行端口转发才可以实现。端口转发将 Docker 容器的端口映射到宿主机的端口上,那么任何发送到宿主机该端口的流量,都会被转发到容器的端口中。
示例:
# 创建一个 nginx 容器,并把容器 80 端口转发到宿主机的 8088 端口
docker container run --name test-nginx --rm -d -p 8088:80 nginx
通过浏览器访问宿主机的 8088 端口时,会得到 nginx 主页。
docker Host 网络
网络介绍
Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统,但是如果基于同一网络模式,容器不会获得一个独立的 Network Namespace,而是和宿主机共用同一个 Network Namespace,容器将不会虚拟出自己的网卡,IP 等,而是直接使用宿主机的 IP 和端口。
连接到 host 网络的容器共享宿主机的网络栈,容器的网络配置与宿主机完全一样。我们可以通过 --network host 指定使用 host 网络。
操作案例
# 创建容器 c1 使用 bridge 网络
[zsc@VM-8-12-centos ~]$ docker container run --name c1 -itd busybox
b64a6793432324141c1ed1498e215d3c4ac80a947182d6ded3a967ac682db2b
# 创建容器 c2 使用 host 网络
[zsc@VM-8-12-centos ~]$ docker container run --name c2 -itd --network host busybox
6a8627b0656b6b219e7e7027b79657812da2b7e142ef356e17663c680b6f6fd9
查看 c1 的网络信息:
[zsc@VM-8-12-centos ~]$ docker exec c1 ip a
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
121: eth0@if122: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
查看 c2 的网络信息:
[zsc@VM-8-12-centos ~]$ docker exec c2 ip a
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 52:54:00:ad:a5:a2 brd ff:ff:ff:ff:ff:ff
inet 10.0.8.12/22 brd 10.0.11.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fead:a5a2/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 02:42:c5:fc:88:f9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:c5ff:fefc:88f9/64 scope link
valid_lft forever preferred_lft forever
...
可以看到 c1 容器是独立的网络配置,而 c2 容器是和宿主机共享网络配置。
使用场景
- bridge 网络在通信的时候需要进行端口转发以及 NAT 地址转换,会消耗一些资源以及性能。
- 直接使用 host 网络最大的好处就是性能好,如果容器对网络传输效率有较高的要求,建议选择 host 网络。但需要考虑端口冲突问题,其他服务已经被占用的端口就不能再使用了。
docker Container 网络
网络介绍
Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模式。之所以称为“other container 模式”,是因为这个模式下的 Docker Container,会使用其他容器的网络环境。之所以称为“特别”,是因为这个模式下容器的网络隔离性会处于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
操作案例
- 创建一个 busybox 容器
docker run -itd --name netcontainer1 busybox
- 使用 netcontainer1 的网络创建另外一个容器
docker run -itd --name netcontainer2 --network container:netcontainer1 busybox
- 进入两个容器,查看容器的 ip 信息,发现两个 ip 和 mac 完全一样
root@139-159-152:~# docker exec -it netcontainer1 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2896 (2.8 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # exit
root@139-159-152:~# docker exec -it netcontainer2 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2896 (2.8 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # exit
- 停止容器 1,再次查看容器 2 的网络,发现 eth0 网卡消失了,只有一个本地网络了
root@139-159-152:~# docker stop netcontainer1
netcontainer1
root@139-159-152:~# docker exec -it netcontainer2 sh
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
- 重启容器 1 和容器 2
docker restart netcontainer1
docker restart netcontainer2
再次查看,可以看到容器网络恢复:
root@139-159-152:~# docker exec -it netcontainer2 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2896 (2.8 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
使用场景
在这种模式下的 Docker Container,容器之间可以通过 localhost 来访问 namespace 中的另外一个服务的网络效率较高。但是两个容器之间存在依赖,如果依赖的容器重启了,会导致另外一个服务的网络不可用。
docker none网络
网络介绍
none网络就是指没有网络。挂在这个网络下的容器除了lo(本地回环),没有其他任何网卡。
操作案例
在运行容器的时候,可以通过--network=none参数来指定容器使用none网络。
# 创建c3容器使用none网络
[zsc@VM-8-12-centos ~]$ docker container run -itd --name c3 --network none busybox
32663e441a4661600d9d0cfa3a4d3b86b7bdaf64bf62de1ce977298897c08b8d
# 查看c3容器的网络信息,发现只有lo
[zsc@VM-8-12-centos ~]$ docker container exec -it c3 ip a
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
使用场景
- 针对一些对安全性要求比较高并且不需要联网的应用,可以使用none网络,比如生成随机密码,避免生成密码被第三方获取。
- 一些第三方的应用可能需要docker帮忙创建一个没有网络的容器,网络由第三方自己来配置。
更多推荐
所有评论(0)