当前位置: 首页 > news >正文

【Docker】容器网络探索(二):实战理解 host 网络

本专栏文章持续更新,新增内容使用蓝色表示。

在容器网络探索的第一篇中,详细介绍了 Docker 的默认 bridge 网络模式和自定义 bridge 网络模式。

【Docker】容器网络探索(一):实战理解 Bridge 网络-CSDN博客

这两种模式虽然提供了良好的网络隔离,但都存在一个共同的特点:需要通过端口映射才能让外部网络访问容器服务。而本篇文章将探索一种更为直接的网络方案—— host 网络模式

一、测试 host 模式

使用 docker network ls 命令列出 docker 当前网络:

docker network ls

使用以下命令查看 host 网络的详细信息:

docker network inspect host

观察输出结果,可以发现 host 网络根本没有分配 IP 地址。这也是host模式的特点所在—— host 模式下,容器不会拥有自己独立的网络命名空间,而是直接共享宿主机的网络栈

1.1 创建 Host 网络模式的容器

docker run -d --name nginx-host --network host --rm nginx

创建完成后,检查宿主机的网络接口:

ip a s

结果显示系统并没有为这个容器创建新的网络接口(如veth pair)。

1.2 测试网络访问

现在直接访问nginx服务:

curl localhost 

可以发现无需端口映射,直接通过 localhost 就能访问到容器中的 nginx 服务。

在浏览器中直接输入宿主机的 IP 地址(如http://192.168.30.130),同样可以看到 nginx 的欢迎页面。

验证服务来源

为了确认这确实是 nginx-host 容器在提供服务,我们可以修改默认欢迎页面:

# 进入容器
docker exec -it nginx-host sh# 修改欢迎页面内容
echo 'Hello from nginx-host, Welcome!' > /usr/share/nginx/html/index.html# 退出容器
exit

再次访问页面,发现内容已经更新,证实了服务确实来自我们创建的容器。

注意1:字符编码问题

上一步修改页面内容,如果直接使用中文,在宿主机使用 curl 命令测试时没什么问题,但是在浏览器测试会乱码。

因为curl 不关心编码,它只是原样输出接收到的字节流,并且终端有自己的编码设置。而浏览器需要解析出确切的编码才能正确显示文本,首先查找HTTP响应头中的 Content-Type,如果没有,查找HTML中的 <meta charset>,如果还没有,就自动猜测编码。

明确指明正确的编码格式就可以避免这种问题。

# 创建包含UTF-8声明的HTML文件
cat > /usr/share/nginx/html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>欢迎页面</title>
</head>
<body><h1>这里是nginx-host,欢迎欢迎~</h1><p>这是一个中文测试页面</p>
</body>
</html>
EOF

注意2:主机名继承

host 网络模式下创建的容器,会继承主机名。

docker exec -it nginx-host /bin/bash

进入 nginx-host 容器内部,主机名没有发生变化。

下面再创建一个桥接模式的测试容器进行对比:

docker run -d --name nginx-bridge --rm nginx
docker exec -it nginx-bridge /bin/bash


结果为 root@容器ID。

二、Host 模式的共享与隔离

host 模式下究竟共享了哪些内容?

我们可以创建一个 apline-host 容器进行测试。

docker run -it --name apline-host --network host --rm alpine sh

2.1 网络共享验证

在 alpine-host 容器中执行ip a s,看到的网络接口与宿主机一致。

alpine-host 容器:

宿主机:

2.2 主机名共享验证

执行 hostname,显示的结果与宿主机名相同。

apline-host容器:

宿主机:

2.3 端口共享

由于直接使用宿主机的网络栈,所有端口都是自然共享的,这也是为什么不需要端口映射的原因。

那指定了 host 网络模式同时指定了端口映射会怎样?

docker run -d --name nginx-port --network host -p 8080:80 --rm nginx

答案是 docker 会拒绝端口映射,但容器还是会生成。

2.4 仍然隔离的资源

进程树(PID命名空间)

文件系统(Mount命名空间)

用户权限(User命名空间)

IPC资源(IPC命名空间)

这部分可以自行尝试验证。

至此, host 网络模式探索的差不多了,那它可以像 bridge 网络一样自定义吗?

docker network create -d host myhost

答案是不行,host网络只能有一个且为默认创建的那个。

其余网络模式在下一篇介绍。


如有问题或建议,欢迎在评论区中留言~

http://www.dtcms.com/a/560568.html

相关文章:

  • 《数据结构风云》:二叉树遍历的底层思维>递归与迭代的双重视角
  • Java EE初阶 --多线程2
  • 论文精读(七):结合大语言模型和领域知识库的证券规则规约方法
  • Linux shell sed 命令基础
  • 选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
  • 【JVM】详解 Java内存模型(JMM)
  • 做网站工作室广告网站建设
  • 小语种网站制作广州网站建设哪里有
  • 广州学做网站上饶网站建设多少钱
  • GO写的http服务,清空cookie
  • 响应式企业网站模板望京网站建设公司
  • 最新聊天记录做图网站ip软件点击百度竞价推广
  • 关于学校网站建设申请报告深圳市网络seo推广价格
  • 公司网站后台怎么上传图片百度西安分公司地址
  • Go语言设计模式:组合模式详解
  • 南昌市住房和城乡建设网站检测网站是否正常
  • 自建网站费用营销推广的主要方法
  • 罗田做网站一个人看的在线观看视频免费下载
  • 网站 首页 栏目 内容wordpress发文章
  • 云南建设厅和网站一个软件的制作过程
  • 湛江网站制作系统厦门哪些企业做视频网站的
  • 宝塔做网站安全吗网站建设课程设计要求
  • 建设微信网站制作自建购物网站
  • 网站的建设和推广上传网站教程
  • 怎么做网站关键字搜索超办网ppt下载
  • 杨凯做网站软件开发平台哪家好
  • 各大搜索引擎提交网站入口大全动漫网页设计作品模板
  • 优化大师怎么样seo优化一般多少钱
  • 设计师个人网站欣赏湖南企业竞价优化
  • 外贸网站建设wordpress的ping列表