Docker 网络实验场

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

Docker 网络是容器编排的基础部分,它使得容器之间以及容器与外部网络之间能够进行通信。本挑战将引导你了解 Docker 网络的基本概念,从创建和管理网络到连接和断开容器。

通过完成这个挑战,你将获得 Docker 网络命令的实践经验,并理解如何设置容器之间的通信。这些技能对于在 Docker 环境中开发和部署多容器应用程序至关重要。

让我们一起深入 Docker 网络的世界吧!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-389054{{"Docker 网络实验场"}} docker/exec -.-> lab-389054{{"Docker 网络实验场"}} docker/inspect -.-> lab-389054{{"Docker 网络实验场"}} docker/network -.-> lab-389054{{"Docker 网络实验场"}} end

创建网络

在这一步中,你将创建你的第一个 Docker 网络。这是连接容器并实现它们之间通信的基础。

任务

  1. 使用 docker network create 命令创建一个名为 my-network 的新桥接网络。
  2. 通过列出所有 Docker 网络来验证网络是否创建成功。

要求

  • 所有操作都在 /home/labex/project 目录下执行。
  • 创建网络时使用默认的桥接驱动(bridge driver)。

示例

完成此步骤后,当你运行 docker network ls 时,应该会看到 my-network 被列出:

NETWORK ID     NAME         DRIVER    SCOPE
abcdef123456   my-network   bridge    local
✨ 查看解决方案并练习

在网络中启动容器

现在我们已经有了一个网络,接下来让我们启动一些容器并将它们连接到该网络。这一步将演示如何在特定网络中启动容器,这是 Docker 网络中的一个关键概念。

任务

  1. 使用 nginx 镜像启动一个名为 container1 的容器,并将其连接到 my-network
  2. 使用 httpd 镜像启动另一个名为 container2 的容器,并将其连接到 my-network
  3. 验证这两个容器是否正在运行并连接到 my-network

要求

  • 所有操作都在 /home/labex/project 目录下执行。
  • 启动容器时使用 --network 标志将它们连接到 my-network
  • 以分离模式(detached mode)运行这两个容器。

示例

完成此步骤后,当你使用 docker ps 时,应该会看到两个容器正在运行:

CONTAINER ID   IMAGE   COMMAND   CREATED         STATUS         PORTS     NAMES
abcdef123456   nginx   "..."     2 minutes ago   Up 2 minutes   80/tcp    container1
fedcba654321   httpd   "..."     2 minutes ago   Up 2 minutes   80/tcp    container2
✨ 查看解决方案并练习

测试连通性

在这一步中,你将验证容器是否可以通过你创建的网络相互通信。这是确保你的网络配置按预期工作的关键测试。

任务

  1. 使用 docker exec 命令在 container1 中运行一个 shell。
  2. container1 中,使用 curl 命令通过容器名称访问 container2

要求

  • 所有操作都在 /home/labex/project 目录下执行。
  • curl 命令中使用 container2 作为主机名。
  • curl 命令应访问 container2 的默认 HTTP 端口(80)。

示例

container1 执行 curl 命令后,你应该会看到默认的 Apache HTTP 服务器页面内容:

<!DOCTYPE html>
<html><body><h1>It works!</h1></body></html>
✨ 查看解决方案并练习

将容器连接到多个网络

在这一步中,你将学习如何将单个容器连接到多个网络。这是一个更高级的概念,适用于创建复杂的网络拓扑或逐步在网络之间迁移服务。

任务

  1. 创建一个名为 my-network2 的新桥接网络。
  2. container2 连接到 my-network2,同时保持其与 my-network 的连接。
  3. 验证 container2 现在是否已连接到这两个网络。

要求

  • 所有操作都在 /home/labex/project 目录下执行。
  • 使用 docker network connect 命令将 container2 添加到 my-network2
  • 使用 docker inspect 命令验证网络连接。

示例

container2 连接到 my-network2 后,当你检查容器时,应该会看到列出的两个网络:

"Networks": {
    "my-network": {
        ...
    },
    "my-network2": {
        ...
    }
}
✨ 查看解决方案并练习

从网络中断开容器连接

在这一步中,你将学习如何在不停止容器的情况下将其从网络中移除。这在需要隔离容器或重新组织网络架构时非常有用。

任务

  1. 使用 docker network disconnect 命令将 container2my-network 中断开连接。
  2. 验证 container2 是否不再连接到 my-network

要求

  • 所有操作都在 /home/labex/project 目录下执行。
  • 使用 docker network disconnect 命令将 container2my-network 中移除。
  • 使用 docker network inspect 命令验证断开连接。

示例

container2my-network 断开连接后,当你检查 my-network 时,应该不会看到 container2 被列出:

$ docker network inspect my-network
[
    {
        "Name": "my-network",
        ...
        "Containers": {
            "container1": {
                ...
            }
        },
        ...
    }
]
✨ 查看解决方案并练习

删除网络

在这最后一步中,你将学习如何在不再需要时删除 Docker 网络。清理未使用的资源是高效管理 Docker 环境的重要部分。

任务

  1. 如果 container2 仍然连接,请将其从 my-network2 中断开连接。
  2. 使用 docker network rm 命令删除 my-network2 网络。
  3. 验证 my-network2 是否已被删除。

要求

  • 所有操作都在 /home/labex/project 目录下执行。
  • 在删除 my-network2 之前,确保没有容器连接到它。
  • 使用 docker network ls 命令验证网络是否已删除。

示例

删除 my-network2 后,当你运行 docker network ls 时,应该不会看到它被列出:

NETWORK ID     NAME         DRIVER    SCOPE
abcdef123456   my-network   bridge    local
ghijkl789012   bridge       bridge    local
mnopqr345678   host         host      local
stuvwx901234   none         null      local
✨ 查看解决方案并练习

总结

恭喜你完成了 Docker 网络基础挑战!你已经成功掌握了 Docker 网络的核心概念,包括:

  1. 创建自定义 Docker 网络
  2. 在特定网络中启动容器
  3. 测试容器之间的连通性
  4. 将容器连接到多个网络
  5. 从网络中断开容器连接
  6. 删除 Docker 网络

这些技能构成了高效 Docker 网络管理的基础,在你处理更复杂的容器化应用程序时将非常宝贵。请记住,正确的网络配置对于容器隔离、安全性以及服务之间的高效通信至关重要。

在整个挑战中,你学习了如何为容器创建隔离环境、启用它们之间的通信,并动态管理网络连接。这些能力使你能够设计适应不断变化需求的复杂网络架构。

随着你继续探索 Docker,可以考虑深入研究更高级的网络主题,例如用于多主机设置的覆盖网络(overlay networks)、网络插件,以及 Docker 网络如何与 Kubernetes 等容器编排平台集成。你可能还想深入了解网络安全概念,例如如何使用网络策略控制容器之间的流量。

继续练习这些技能,你将能够为未来的项目设计和管理复杂的容器网络架构。请记住,有效的网络是构建可扩展、安全且高效的容器化应用程序的关键。