3.2 网络配置(下篇)

本实验要求学生了解Docker的三种特殊网络连接方式:
- Container网络模式(共享网络命名空间)
- Host网络模式(使用主机网络)
传统的容器连接(--link
参数)
这些网络模式各有特点和适用场景,掌握它们将帮助你更灵活地设计容器化应用的网络架构。
准备工作
删除以下内容:
- 所有容器(包括运行中的和已停止的)
- 所有镜像
- 所有自建网络(alpine-web)
关于删除的命令:
- docker rm 删除容器
- docker rmi 删除镜像
- docker network rm 删除网络
实验过程
任务一:container 网络模式
Container网络模式允许新创建的容器共享现有容器的网络命名空间,包括网络接口、IP地址、路由表等。这对于需要共享网络但保持其他资源隔离的场景非常有用。
1.创建 alpine1 容器,默认连接到 bridge 网络
docker run -dit --name alpine1 alpine
2.创建 alpine2 容器,通过 container 网络模式和现有容器 alpine1
共享网络
使用--network container:<容器名>
参数创建共享网络的容器:
docker run -dit --network container:alpine1 --name alpine2 alpine
3.验证两个容器的状态是否正常
4.进入 alpine2 的 ash 终端,并验证是否可以访问网络
docker exec -it alpine2 ash
ping -c 3 baidu.com
-c
指定次数
5.比较网络配置
ifconfig
ifconfig 命令用来查看网卡信息
退出 alpine2
exit
进入 alpine1
并查看网络信息
docker exec -it alpine1 ash
ifconfig
对比两个容器的网络配置,可以看到它们的网卡MAC地址、IP地址等网络信息完全一致。这证明它们确实共享同一个网络命名空间。
在container网络模式下,第二个容器不会创建自己的网络接口,而是共享第一个容器的网络栈。这意味着:
- 两个容器共享同一个IP地址
- 它们共享同一套端口空间(不能使用相同的端口)
- 它们之间可以通过
localhost
互相访问 - 它们共享同一个路由表和防火墙规则
Container网络模式特别适用于以下场景:
- 需要容器间高效通信的应用组件
- 监控或调试容器网络
- 需要共享网络但保持其他资源隔离的场景
任务二:host网络模式
Host 网络模式让容器直接使用宿主机的网络命名空间,没有网络隔离。容器可以直接使用主机的网络接口,无需端口映射。
1.以 mysite 镜像运行容器,并指定 –network 为 host
docker run -d --name mysite --network host harbor.seahi.me/stu/mysite:v0.2
2.访问网站
在浏览器中访问验证:
3.运行使用host网络的httpd容器
docker run -d --name httpd --network host httpd
查看是否运行成功,为什么?
思考:
刚才使用的命令
docker run -d --name httpd --network host httpd
与下面的命令,效果一样的么?
docker run -d --name httpd2 -p 80:80 httpd
docker run -d --name httpd3 -P httpd
- –network host:
- 容器直接使用主机网络
- 没有网络隔离
- 不需要端口映射
- 性能最好(没有NAT开销)
- 安全性较低(容器可以访问主机所有网络接口)
- -p 80:80:
- 容器使用独立的网络命名空间
- 通过端口映射将容器端口暴露给主机
- 明确指定主机端口和容器端口的映射关系
- 如果主机端口已被占用,容器将无法启动
- -P:
- 容器使用独立的网络命名空间
- Docker自动分配主机上的随机高位端口映射到容器暴露的端口
- 适合不关心具体端口号的场景
- 避免端口冲突
已弃用:使用传统的容器连接
在上一实验中,我们发现连接到默认bridge网络的容器无法通过容器名互相访问。这是因为默认的bridge网络不支持容器名称的DNS解析,而自定义的桥接网络则支持这一功能。
Docker提供了一种传统的解决方案:使用--link
参数在容器间建立连接,实现容器名解析。
--link <容器名:容器别名>
1.先启动3号容器
首先,创建一个名为alpine3的容器:
docker run -dit --name alpine3 alpine
2.启动4号容器并连接到3号容器
使用--link
参数将4号容器链接到3号容器:
docker run -dit --link alpine3:alp --name alpine4 alpine
这个命令创建了一个名为alpine4的容器,并将它链接到alpine3容器,链接别名为"alp"。
3.进入4号容器验证
进入alpine4容器,尝试通过别名和原名ping alpine3:
docker exec -it alpine4 ash
ping -c 3 alp
ping -c 3 alpine3
可以看到,alpine4容器既可以通过别名"alp"也可以通过原名"alpine3"访问第一个容器。
4.退出4号容器
exit
5.进入3号容器验证
docker exec -it alpine3 ash
ping alpine4
如上图所示,alpine3无法通过容器名访问alpine4。这说明--link
参数创建的连接是单向的。
--link
参数已被Docker官方标记为遗留功能,不推荐在新项目中使用。推荐使用自定义网络来实现容器间的名称解析。附:Docker网络模式总结
Docker提供了多种网络模式,以满足不同的应用场景需求:
1. Bridge网络模式(默认)
- 容器拥有独立的网络命名空间
- 通过虚拟网桥连接到主机网络
- 需要端口映射才能从外部访问容器服务
- 默认bridge网络不支持容器名解析
- 自定义bridge网络支持容器名解析和更好的隔离性
2. Host网络模式
- 容器共享主机的网络命名空间
- 没有网络隔离
- 直接使用主机的网络接口和端口
- 性能最好(没有NAT开销)
- 可能导致端口冲突
- 安全性较低
3. Container网络模式
- 容器共享另一个容器的网络命名空间
- 共享IP地址、端口空间和网络配置
- 容器间可通过localhost通信
- 适用于紧密耦合的应用组件
4. None网络模式
- 容器有自己的网络命名空间
- 没有网络接口(除了loopback)
- 完全隔离的网络环境
- 适用于不需要网络的场景或自定义网络设置
附:网络模式选择指南
在选择Docker网络模式时,可以参考以下指南:
- 使用自定义bridge网络:
- 适用于大多数容器应用
- 提供良好的隔离性和容器名解析
- 使用host网络模式的场景:
- 需要最佳网络性能的应用
- 网络密集型应用
- 需要使用主机特定网络功能的应用
- 单机部署且不关心网络隔离的场景
- 使用container网络模式的场景:
- 需要共享网络但保持其他资源隔离的应用组件
- 辅助容器(如监控、日志收集)
- 微服务架构中紧密耦合的服务
- 使用none网络模式的场景:
- 批处理任务
- 不需要网络的计算任务
- 需要完全自定义网络配置的场景