把容器之间连起来
本实验在真正的 VM 中运行
这个环境不是 Pod,而是由 KubeVirt 启动的虚拟机。Linux 内核独立运行,systemd 真正管理服务,docker 也不是模拟工具,而是真正的 Docker 引擎。通过 docker run 启动的容器会成为实际进程,docker exec 和 docker logs 也都能照常工作。
过去,这个实验在 Pod 中运行。由于该环境放弃了所有内核权限,启动容器的步骤无法进行,因此只能学习直接解开镜像归档的变通方法。现在不再需要绕路了。
有两点需要了解。
- **首次启动大约需要 1 分钟。**因为 VM 需要启动并安装 Docker,比 Pod 实验(通常 40 秒)更慢。
- **没有浏览器预览。**进入 VM 的连接只开放评分端口。如果启动了 Web 服务器,请在 VM 内使用
curl检查。
目标
通过自定义网络让容器之间使用名称通信,确认位于不同网络时彼此不可见,并养成只向环回地址开放端口的习惯。
为什么重要
容器网络事故大多源自两种误解。一种是认为“容器的 127.0.0.1 应该就是主机的 127.0.0.1”,另一种是认为“既然开放了端口,防火墙应该会拦住”。前者可以用网络命名空间连环回接口也会复制这一事实解释;后者则是因为发往容器的数据包并不把主机作为最终目的地。由此可得出结论:限制绑定地址是最简单、最可靠的控制手段。
步骤
- 创建
/root/ops2,并创建一个名为dk-net的自定义网络。 - 使用
nginx:1.27-alpine,以dk-api为名连接到dk-net并在后台运行。 - 使用
alpine:3.20,以dk-client为名连接到同一个dk-net,并使其持续运行。 - 在
dk-client内使用容器名称向dk-api发送 HTTP 请求,将响应保存到/root/ops2/dns.txt。其中包含 nginx 默认页面即可。 - 新建名为
dk-net2的网络,启动dk-lonely容器并使其仅连接该网络。确认从dk-lonely无法访问dk-api,然后在/root/ops2/isolated.txt中写入unreachable。 - 使用
nginx:1.27-alpine启动名为dk-pub的容器,但只将容器的 80 端口发布到127.0.0.1的 8080 端口。 - 不要删除
dk-lonely,将它额外连接到dk-net,然后确认现在能否解析dk-api名称。 - 在
/root/ops2/net.md中分别逐行写入dk-api、dk-client、dk-lonely、dk-pub;在dk-lonely行中同时写入所属网络的数量,在dk-pub行中同时写入已发布的绑定地址和端口。
参考
- 使用
docker network connect <네트워크> <컨테이너>为已运行的容器额外连接网络。 - 使用
docker exec dk-client getent hosts dk-api可以单独检查名称解析。 - 此环境采用 rootless 模式,无法开放小于 1024 的端口。请使用 8080。
- 常见错误 1:如果在第 3 步直接启动 alpine,它会立即退出。请提供一个持续运行的命令。
- 常见错误 2:如果在第 6 步省略绑定地址,端口会向所有接口开放。评分会将此判为失败。
创建自定义网络
创建 /root/ops2,并创建一个名为 dk-net 的自定义网络。
有一组用于操作网络的子命令。之所以不使用默认网桥,是为了使用名称解析。
将容器连接到网络
使用 nginx:1.27-alpine,以 dk-api 为名连接到 dk-net 并在后台运行。
启动容器时可以指定要连接的网络。请通过 inspect 的 NetworkSettings.Networks 确认。
再连接一个容器到同一网络
使用 alpine:3.20,以 dk-client 为名连接到同一个 dk-net,并使其持续运行。
第二个容器必须持续运行,才能在其中执行命令。
通过名称找到彼此
在 dk-client 内使用容器名称向 dk-api 发送 HTTP 请求,将响应保存到 /root/ops2/dns.txt。其中包含 nginx 默认页面即可。
位于同一个自定义网络时,容器名称就是主机名。请从容器内发送 HTTP 请求并保存响应。
不同网络彼此不可见
新建名为 dk-net2 的网络,启动 dk-lonely 容器并使其仅连接该网络。确认从 dk-lonely 无法访问 dk-api,然后在 /root/ops2/isolated.txt 中写入 unreachable。
请从只连接新网络的容器尝试访问,并用一个表示结论的单词记录结果。
向主机开放端口
使用 nginx:1.27-alpine 启动名为 dk-pub 的容器,但只将容器的 80 端口发布到 127.0.0.1 的 8080 端口。
如果省略绑定地址,端口会向所有接口开放。请限制为环回地址。此环境无法开放小于 1024 的端口。
将已运行的容器额外连接到网络
不要删除 dk-lonely,将它额外连接到 dk-net,然后确认现在能否解析 dk-api 名称。
有一个命令无需重新创建容器即可连接网络。必须保留现有连接。
整理可达关系
在 /root/ops2/net.md 中分别逐行写入 dk-api、dk-client、dk-lonely、dk-pub;在 dk-lonely 行中同时写入所属网络的数量,在 dk-pub 行中同时写入已发布的绑定地址和端口。
请写入实际值:每个容器连接了哪些网络、共连接几个网络,以及哪个端口开放到了哪里。