LabHub
学习 学习路径 课程

卷、网络与 Compose

把容器之间连起来

在 LabHub 中继续学习

本实验在真正的 VM 中运行

这个环境不是 Pod,而是由 KubeVirt 启动的虚拟机。Linux 内核独立运行,systemd 真正管理服务,docker 也不是模拟工具,而是真正的 Docker 引擎。通过 docker run 启动的容器会成为实际进程,docker execdocker logs 也都能照常工作。

过去,这个实验在 Pod 中运行。由于该环境放弃了所有内核权限,启动容器的步骤无法进行,因此只能学习直接解开镜像归档的变通方法。现在不再需要绕路了。

有两点需要了解。

目标

通过自定义网络让容器之间使用名称通信,确认位于不同网络时彼此不可见,并养成只向环回地址开放端口的习惯。

为什么重要

容器网络事故大多源自两种误解。一种是认为“容器的 127.0.0.1 应该就是主机的 127.0.0.1”,另一种是认为“既然开放了端口,防火墙应该会拦住”。前者可以用网络命名空间连环回接口也会复制这一事实解释;后者则是因为发往容器的数据包并不把主机作为最终目的地。由此可得出结论:限制绑定地址是最简单、最可靠的控制手段

步骤

  1. 创建 /root/ops2,并创建一个名为 dk-net 的自定义网络。
  2. 使用 nginx:1.27-alpine,以 dk-api 为名连接到 dk-net 并在后台运行。
  3. 使用 alpine:3.20,以 dk-client 为名连接到同一个 dk-net,并使其持续运行。
  4. dk-client使用容器名称dk-api 发送 HTTP 请求,将响应保存到 /root/ops2/dns.txt。其中包含 nginx 默认页面即可。
  5. 新建名为 dk-net2 的网络,启动 dk-lonely 容器并使其仅连接该网络。确认从 dk-lonely 无法访问 dk-api,然后在 /root/ops2/isolated.txt 中写入 unreachable
  6. 使用 nginx:1.27-alpine 启动名为 dk-pub 的容器,但只将容器的 80 端口发布到 127.0.0.1 的 8080 端口
  7. 不要删除 dk-lonely,将它额外连接到 dk-net,然后确认现在能否解析 dk-api 名称。
  8. /root/ops2/net.md 中分别逐行写入 dk-apidk-clientdk-lonelydk-pub;在 dk-lonely 行中同时写入所属网络的数量,在 dk-pub 行中同时写入已发布的绑定地址和端口。

参考

创建自定义网络

创建 /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-apidk-clientdk-lonelydk-pub;在 dk-lonely 行中同时写入所属网络的数量,在 dk-pub 行中同时写入已发布的绑定地址和端口。

请写入实际值:每个容器连接了哪些网络、共连接几个网络,以及哪个端口开放到了哪里。