Docker网络实战:容器通信与隔离之道
Docker网络主要实现容器间通信、外部访问容器服务、容器访问外网等功能。常见网络类型包括:Bridge(默认桥接模式)、Host(共享宿主机网络)、Container(共享容器网络)、None(无网络)和Overlay(跨主机网络)。关键命令包括创建网络(docker network create)、查看详情(inspect)、连接/断开网络(connect/disconnect)以及删除网络(
文章目录
一、Docker网络概念
1.1 Docker为什么需要网络?
- 实现容器间通信:这是最核心的原因。现代应用,尤其是微服务架构,是由多个独立的服务组成的(例如:Web前端、用户认证服务、订单服务、数据库等)。每个服务通常运行在各自的容器中。
- 实现外部网络访问容器内的服务:一个Web服务器容器(如Nginx、Tomcat)之所以有用,是因为外部用户(通过浏览器)或其他系统能够访问它提供的服务(如网站或API)。
- 允许容器访问外部网络:容器内的应用经常需要从互联网获取资源或数据。
- 连接容器与宿主机:有时容器需要与宿主机上的服务或文件系统进行交互。
1.2 常见网络类型
-
Bridge网络(桥接网络):是 Docker 的默认网络模式,它会在宿主机内部创建一个私有虚拟网络,容器像连接到同一个虚拟交换机一样被分配独立IP,并通过NAT与外部通信,是实现单主机上多容器间通信最常用且隔离性良好的方式。
-
Host(宿主机网络):让容器直接共享宿主机的网络命名空间,容器本身没有独立IP,直接使用主机网卡和端口,消除了NAT开销从而提供最佳网络性能,但代价是牺牲了网络隔离性并可能引发端口冲突。
-
Container(容器网络):这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
-
None(无网络):模式为容器提供了一个完全无网络的环境,内部仅存在回环接口,使其与外界彻底隔离,适用于追求绝对安全或只需执行离线计算的特殊任务。
-
Overlay(叠加网络):是用于 Docker 集群的高级模式,它能在多个物理主机之上构建一个统一的虚拟网络,使不同机器上的容器能像在同一局域网内一样直接通信,是 Swarm 或 Kubernetes 等编排工具的基础。
二、网络命令
docker network create
功能:创建自定义网络
语法:
docker network create [OPTIONS] NETWORK
关键参数:
d, --driver
:网络驱动--gateway
:网关地址--subnet
:表示网段的CIDR
格式的子网--ipv6
:启用ipv6
示例:
docker network inspect
功能:查看网络详情
语法:
docker network inspect [OPTIONS] NETWORK [NETWORK...]
关键参数:
-f, --format
: 指定格式
示例:
docker network connect
功能:用于将容器连接到网络,可以按名称或 ID 连接容器。连接后,容器可以与同一网络中的其他容器通信。
语法:
docker network connect [OPTIONS] NETWORK CONTAINER
关键参数:
--ip
: 指定 IP 地址--ip6
: 指定 IPv6 地址
示例:
docker network disconnect
功能:断开网络
语法:
docker network disconnect [OPTIONS] NETWORK CONTAINER
关键参数:
-f
:强制断开
示例:docker network disconnect web1 mybox1
docker network prune
功能:删除不使用的网络
语法:
docker network prune [OPTIONS]
关键参数:
-f, --force
:不提示
示例:
docker network rm
功能:删除 1 个或者多个网络
语法:
docker network rm NETWORK [NETWORK...]
关键参数:
-f
: 强制删除
示例:
docker network ls
功能:列出网络
语法:
docker network ls [OPTIONS]
别名:docker network list
关键参数:
-f, --filter
: 指定过滤条件--format
: 指定格式--no-trunc
: 不截断-q,--quiet
:仅仅显示id
示例:
三、网络模式的设置
docker Bridge网络
bridge网络结构:
+---------------+ | Internet | +-------+-------+ | +--------+---------+ | Host eth0 | | 192.168.1.100/24 | +--------+---------+ | | (NAT) +---------------------+------------------------+ | docker0 Bridge | | 172.17.0.1/16 | +--------+----------------------------+---------+ | | | (veth pair) | (veth pair) | | +--------+----------+ +---------+---------+ | Container A | | Container B | | | | | | eth0: | | eth0: | | 172.17.0.2/16 | | 172.17.0.3/16 | +-------------------+ +-------------------+
在创建容器时没有使用--network
参数指定网络时,默认连接到docker模式。
- 注意:
docker
自定义桥接网络支持通过Docker DNS
服务进行域名解析,也就是我们可以直接通过使用容器名进行通信,因为DNS
服务可以解析容器名到IP地址的映射,但是默认的Bridge
网络时不支持DNS
的。
案例:让两个容器连接到同一个自定义网络进行通信
- 创建自定义网络web1
docker network create web1
- 创建并启动两个busybox容器,并且将容器连接到网络web1
docker run -itd --name=box1 --network web1 busybox
docker run -itd --name=box2 --network web1 busybox
- 进入box1容器检验是否能与box2通信
docker exec -it box1 sh
ping box2
exit
- 进入box2容器检验是否能与box1通信
docker exec -it box2 sh
ping box1
exit
- 创建一个容器box3使用默认的bridge
docker run -itd --name=box33 --name=box3 busybox
- 验证是否能进行DNS域名解析和是否能与使用自定义网络的容器通信
docker exec -it box3 sh
ping box1
效果如下:
- 注意:容器启动后,Docker 有时不会明确提示运行结果(成功 / 失败),因此建议每次启动容器后,通过
docker ps
或docker ps -a
命令检查容器状态。
3.1 host网络
host网络结构:
+---------------+ | Internet | +-------+-------+ | +-------------------------------------------------+ | Docker Host | | | | +---------------------+ | | | Host eth0 +------------------------+ | | 192.168.1.100/24 | | | +---------------------+ | | | | +-------------------------------------------+ | | | Container | | | | | | | | (直接使用宿主机的网络栈) | | | | (共享 eth0: 192.168.1.100/24) | | | +-------------------------------------------+ | +-------------------------------------------------+
示例:
- 运行容器使用host网络
docker run -itd --name=box4 --network host busybox
- 检查宿主机网络配置信息和容器的网络配置信息是否相同
ifconfig
docker exec -it box4 ifconfig
该模式的缺点:宿主机和容器的端口是共用的,无隔离,所以不能让它们用相同的端口。
测试:
- 因为将宿主机nginx服务启动(默认是80端口)
nginx
- 启动一个nginx容器(默认使用的也是80端口)使用host网络,看是否出现冲突
docker run -d --name=web1 --network host nginx:1.24.0
- 检查该容器是否在正常运行
docker ps
docker ps -a
3.2 container网络
container网络结构:
+---------------+ | Internet | +-------+-------+ | +--------+---------+ | Host eth0 | | 192.168.1.100/24 | +--------+---------+ | +--------+---------+ | docker0 Bridge | | 172.17.0.1/16 | +--------+---------+ | | (veth pair) +-------------------+ +--+-------------------+ | Container A | | Container B | | (网络提供者) | | (共享网络栈) | | | | | | eth0: | | | | 172.17.0.2/16 +-------+ | | | | 使用Container A的 | +-------------------+ | 网络命名空间 | | eth0: 172.17.0.2/16| +-------------------+
该模式和host
模式类似,只是对象换成了容器
示例:
- 启动box5容器以container模式连接到box1
docker run -itd --name=box5 --network container:box1 busybox
- 检查网络联通性
docker exec -it box5 ping www.baidu.com
docker exec -it box5 ifconfig
- 断开box1的网络,检查box5网络变化
docker network disconnect web1 box1
docker exec -it box5 ping www.baidu.com
docker exec -it box5 ifconfig
- 启动box1的网络,检查box5网络变化
docker network connect web1 box1
docker exec -it box5 ping www.baidu.com
docker exec -it box5 ifconfig
3.3 none网络
none
网络就是指没有网络,处于这个模式下的容器除了lo
(本地环回),没有任何虚拟网卡。
示例:
- 创建并启动容器,网络设置为none模式
docker run -itd --name=box6 --network none busybox
- 尝试ping百度
docker exec -it box6 ping www.baidu.com
- 查看ifconfig
docker exec -it box6 ifconfig
效果:
非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!
更多推荐
所有评论(0)