Docker - 容器链接



Docker 容器链接是一个引人注目的功能,它使容器能够以非常安全有效的方式相互通信。当您链接容器时,它会在容器之间创建一个安全的隧道,以便一个容器可以访问在另一个容器中运行的服务。这在微服务架构的设置中尤其方便,因为不同的服务必须放在单独的容器中。

在本章中,让我们了解什么是容器链接以及如何使用 Docker 命令和示例来实现它。

什么是 Docker 容器链接?

如上所述,Docker 中的容器链接可以帮助您构建相互连接的服务网络,这些服务协同工作以形成一个完整的应用程序。链接容器时,需要指定环境变量,并更新 /etc/hosts 文件,以便更容易地让链接的容器相互发现。

请注意,Docker 容器链接已经是一个遗留功能,容器相互通信的现代方法在于 Docker 网络。Docker 网络在容器间通信方面提供了更大的灵活性和可管理性以及可扩展性。使用 Docker 网络,容器的添加或删除会动态进行,而不会中断现有的通信渠道。

虽然链接容器对于开发环境仍然有用,但 Docker 建议对于更复杂和生产级的环境,应该使用 Docker 网络。转向使用网络反映了 Docker 向更强大、可扩展和可管理的容器编排解决方案演进。

使用链接系统连接容器

使用 --link 选项连接 Docker 容器提供安全、直接的通信,其中一个容器可以连接到另一个容器中提供的服务并使用这些服务。它设置环境变量并填充接收容器的 /etc/hosts 配置文件,以便在不将任何冗余端口暴露给外部世界的情况下连接这两个容器。

要使用 --link 将 Docker 容器链接在一起,在启动新容器时,可以使用以下语法:

$ docker run -d --name recipient_container --link source_container:image_alias image_name:tag

以下是命令的细分:

  • -d - 以分离模式运行容器。
  • --name recipient_container - 可以指定接收容器名称。
  • --link source_container/image_alias - 将源容器链接到给定镜像别名的接收容器。
  • image_name:tag - 指定用于创建接收容器的 Docker 镜像。

例如,将名为 db 的 MySQL 数据库容器与 PHP 应用程序容器链接:

$ docker run -d --name php_app --link db:mysql php:latest
Docker Container Linking 1

Docker 中的 --link 选项提供了一种创建微服务架构的绝佳方法,其中多个容器可以安全地进行通信。这简化了网络设置,因为它随时配置环境变量和主机文件条目,以便在链接的容器之间实现顺畅的通信。

使用网络端口映射连接容器

Docker 中的端口映射允许容器与主机系统通信。这实际上使得 Docker 容器内的几个端口对主机机器可见,以便您可以从另一个网络或同一 Docker 网络内的其他容器访问容器内运行的服务。

您将在 Docker run 命令中使用 -p 标志来使用端口映射连接容器。该标志设置主机系统和容器端口的映射。

以下是您可以执行此操作的方法:

$ docker run -d --name my-container -p host_port:container_port image_name:tag

在此命令中:

  • -d - 在后台以分离模式运行容器。
  • --name my-container - 为容器命名,以便您可以轻松管理它。
  • -p host_port:container_port - 将 Docker 容器中的 container_port 作为 host_port 暴露在主机系统上。
  • image_name:tag - 这指定了容器创建时要使用的 Docker 镜像。

例如,以下命令将运行一个 Nginx Web 服务器并将容器端口 80 映射到主机端口 8080:

$ docker run -d --name my-nginx -p 8080:80 nginx:latest
Docker Container Linking 2

此命令将从 nginx:latest 镜像启动一个名为 my-nginx 的新容器。现在,可以通过在任何 Web 浏览器中访问 https://127.0.0.1:8080 来访问容器内的 Nginx Web 服务器。

Docker 创建的环境变量

了解 Docker 环境变量,尤其是在使用 --link 连接容器并更新 /etc/hosts 文件时,对于配置和管理相互依赖的 Docker 环境至关重要。在使用 --link 链接容器时,Docker 本身会设置一些环境变量;它还会修改接收容器中的 /etc/hosts 配置,以支持链接容器之间的顺畅通信。

对于创建的每个链接,Docker 都会在目标容器中设置相应的环境变量。这些变量会自动填充源容器连接的所有信息,包括 IP 地址和端口。Docker 设置的环境变量:

  • 环境变量格式 - Docker 设置的变量格式为 <alias>_PORT_<port>_PROTO、<alias>_PORT_<port>_PORT 和 <alias>_PORT_<port>_ADDR。
  • 这里,<alias> 是赋予源容器的别名,<port> 是源容器中公开的端口号,PROTO、PORT 和 ADDR 分别指协议类型(TCP 或 UDP)、端口号和 IP 地址。

例如,将 MySQL 容器 (DB) 链接到应用程序容器将在应用程序容器的环境中创建诸如 DB_PORT_3306_TCP_PROTO、DB_PORT_3306_TCP_PORT 和 DB_PORT_3306_TCP_ADDR 之类的变量。

更新 /etc/hosts 文件

Docker 会修改目标容器内 /etc/hosts 的内容,为每个链接的容器添加一个条目。该条目将使用 `--link` 选项指定的别名与源容器的 IP 地址关联。例如,如果您使用别名“mysql”将 MySQL 容器 (db) 链接起来,Docker 会将目标容器中的 /etc/hosts 内容修改为:

<IP_address_of_db_container>   mysql

这允许接收容器将别名 mysql 解析为 db 已映射到的 IP 地址,以便在链接的容器之间轻松进行网络通信。

重要注意事项

动态更新

所有这些环境变量和 /etc/hosts 文件中的条目都会在每次链接或重新启动容器时由 Docker 动态更新,以确保通信的统一性和可靠性。

弃用

虽然 --link 仍然有效,但 Docker 建议使用用户定义的网络来连接容器,因为它提供了更好的网络配置控制和更大的灵活性。

安全

最好防止敏感数据被硬编码到环境变量或 /etc/host 条目中。相反,必须使用 Docker 密钥或配置管理安全工具来管理敏感数据。

结论

Docker 通过使用 –link 和其他高级方法(如端口映射和网络配置)简化了容器的连接,以便在 Docker 化环境中的容器之间实现顺畅的交互。这在微服务架构和复杂的应用程序部署中将非常有用。

虽然 link 提供了一种连接容器的简单方法,但使用用户定义的网络是推荐的 Docker 方法,因为它支持增强的网络功能并符合最佳实践。与旧方法相比,用户定义的网络提供了对通信、扩展和安全方面的更多控制。

关于 Docker 容器链接的常见问题

我们在这里收集了一套关于如何 Docker 化容器链接的常见问题及其答案:

1. Docker 容器链接仍在使用吗?

Docker 容器链接已被弃用,并被更现代的网络选项取代,例如用户定义的桥接网络、Docker Compose 等。遗留链接可能仍然出现在某些旧设置中,但建议使用较新的网络选项以保持更好的安全性和安全性。

2. Docker 容器链接的替代方案是什么?

链接容器的主要替代方案是用户定义的桥接网络和 Docker Compose。这些具有灵活性和控制容器之间网络流量的优点。用户定义的网络允许用户为其容器创建隔离的网络,而 Docker Compose 使管理多容器应用程序及其网络配置更加无缝。

广告