前言
网络是虚拟化技术中最复杂的部分,也是 Docker 应用中的一个重要环节,Docker 中的网络主要解决容器与容器、容器与外部网络、外部网络与容器之间的相互通信问题。
一、Docker 容器网络基本原理
Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别创建一个虚拟接口(veth),并让它们通过宿主机的 docker0 网桥进行连接,这样的一对 veth 叫做 veth pair。
二、Docker 网络驱动
Docker 拥有多种网络驱动程序,以提供核心网络功能。

- bridge
默认网络驱动程序,如未指定驱动程序,使用此网络类型。主要用于同一宿主机上不同容器之间的通信。
- host
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用宿主机的网络。
- none
容器禁用所有网络,不能与外部通信。none 网络没有办法联网,封闭的网络能很好的保证容器的安全性。
- overlay
overlay 网络将多个 Docker 守护进程连接在一起,并使 swarm 服务能够相互通信。还可以使用 overlay网络促进 swarm 服务和独立容器之间的通信,或者在不同 Docker 守护进程上的两个独立容器之间的通信,实现跨主机通信。
- macvlan
macvlan 允许将 MAC 地址分配给容器,使其显示为网络上的物理设备。Docker 守护进程通过容器的 MAC 地址将流量路由到容器。有时使用 macvlan 驱动程序是最佳选择,比如在处理遗留应用程序时,希望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由。
- Network plugins
可以在 Docker 中安装第三方网络插件,这些插件可以从 Docker Hub 或第三方获得。
三、Docker 网络管理命令
使用 docker network --help 命令,可以查看 docker 网络相关的命令。
root@docker:~# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
- docker network ls 查看已建立的网络对象。
常用命令参数:-f,过滤条件,如"driver=bridge"。
-q,只回显网络对象的ID。
安装好 Docker 后,默认会自动创建三个网络,可以使用命令查看。
###查看默认网络。
root@docker:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
dc322c5dd3bc bridge bridge local
b1e9477f6959 host host local
1fbd8be30335 none null local
###查看桥接网络。
root@docker:~# docker network ls -f "driver=bridge"
NETWORK ID NAME DRIVER SCOPE
dc322c5dd3bc bridge bridge local
###查看桥接网络的ID。
root@docker:~# docker network ls -qf "driver=bridge"
dc322c5dd3bc
- docker network inspect 查看网络详细信息。
###查看默认bridge网络详细信息。
root@docker:/docker# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "d91e497829267345e0d5ad9cd85f51e5ce25d736455cee57db62d3b0d8ea73c1",
"Created": "2023-02-22T16:04:44.832948002Z",
"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": {},
"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": {}
}
]
- docker network create 创建新网络对象。
常用命令参数:-d,指定网络驱动(默认是"bridge")。
--subnet,指定子网网段。
--ip-range,指定容器的IP范围。
--gateway,指定子网网关。
###创建一个桥接网络,指定子网、IP范围和网关。
root@docker:/docker# docker network create --driver=bridge --subnet=192.168.0.0/16 --ip-range=192.168.100.0/24 --gateway=192.168.100.254 mybridge
e6fd1c4250936fb20cb3726c07fe0fbcddd762fb3839526e13fa25bcacac98d2
###查看创建的网络。
root@docker:/docker# docker network ls
NETWORK ID NAME DRIVER SCOPE
d91e49782926 bridge bridge local
b1e9477f6959 host host local
e6fd1c425093 mybridge bridge local
1fbd8be30335 none null local
- docker run --network 运行容器时指定网络。
###使用创建的mybridge网络运行一个httpd容器。
root@docker:/docker# docker run -d --name httpd -p 80:80 --net mybridge httpd
22fcd650fef5ab06f62cb78335234cb6333b0f0ff9026af73441e2130cfda1a4
root@docker:/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22fcd650fef5 httpd "httpd-foreground" 4 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp httpd
###查看容器ip地址。
root@docker:/docker# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' httpd
192.168.100.0
###使用容器地址访问服务测试。
root@docker:/docker# curl http://192.168.100.0
<html><body><h1>It works!</h1></body></html>
- docker network rm 删除网络,需要先将使用该网络创建的容器停止并删除。
###直接删除网络,有报错。
root@docker:/docker# docker network rm mybridge
Error response from daemon: error while removing network: network mybridge id 0c21cd98605cd4e36e59b3af6cd5390c2c05f42cfa2668eaefb383ad0026db8b has active endpoints
###停止并删除使用该网络创建的容器。
root@docker:/docker# docker stop httpd
httpd
root@docker:/docker# docker rm httpd
httpd
###再次删除网络,成功。
root@docker:/docker# docker network rm mybridge
mybridge
root@docker:/docker# docker network ls
NETWORK ID NAME DRIVER SCOPE
d91e49782926 bridge bridge local
b1e9477f6959 host host local
1fbd8be30335 none null local
总结
以上就是今天学习了解的内容。