互联网技术 / 互联网资讯 · 2024年3月14日

容器环境变量在云计算核心技术中的应用

本教程聚焦在容器化环境中环境变量的行为及其对应用配置的影响。通过对链接容器之间的变量传递与暴露机制的解读,帮助开发与运维人员在云计算场景中更高效地管理配置。

当容器建立连接时,系统会在目标容器中自动创建若干环境变量,并且会公开源容器中与环境变量相关的变量。这些变量来自不同的来源,便于在目标容器内以编程方式获取源容器的信息。

1. 源容器在构建时定义的环境变量会通过链接传递给目标容器

2. 在运行目标容器时,通过 -e、–env 和 –env-file 等选项,将源容器的环境变量暴露到目标容器中

这些变量使应用程序能够在目标容器内灵活发现源容器的相关信息。

举例来说,如果一个名为 web 的容器通过链接获得了一个名为 db 的数据库容器,则目标容器中会出现一组以 DB_ 为前缀的变量,用于描述与数据库容器相关的元信息。这些变量的前缀会根据链接别名进行填充,帮助区分不同的数据库实例。

此外,源容器中对端口的暴露也会以变量的形式定义,使用统一的前缀格式进行命名。前缀的组成通常包含:链接别名、暴露的端口号,以及协议类型(TCP/UDP)。通过这种命名方式,可以在目标容器中直接读取端口、地址和协议等信息。

示例前缀格式通常如下:
前缀_地址前缀_端口前缀_协议。例如,如同前缀为 WEBDB_PORT_5432_TCP,则变量 WEBDB_PORT_5432_TCP_ADDR 表示数据库服务的 IP 地址,WEBDB_PORT_5432_TCP_PORT 表示端口号,WEBDB_PORT_5432_TCP_PROTO 表示协议。

如果一个容器公开多个端口,将为每个端口生成一组环境变量。也就是说,公开 4 个端口就会产生 12 个环境变量集(每个端口 3 个变量)。

此外,还会为源容器的首个公开端口生成一个特殊变量,包含该端口的完整 URL。首端口的“首”定义为最低编号的公开端口;若同一端口对多种协议暴露,则选择其中一种协议。

最后,源容器中每个原本由源容器提供的环境变量也会以目标容器中的变量形式暴露。对于每个变量,目标容器都会创建一个以 ENV_ 开头的变量,其值等于源容器在启动时所使用的值。

回到数据库的示例,您可以在目标容器中运行环境变量查询来查看这些变量。例如执行如下命令可列出某个容器的环境变量:

命令示例:docker run –rm –name web2 –link db:db training/webapp env

您会看到一组以 DB_ 为前缀的环境变量,其中 dblnk 的信息来自源容器。若 alias 为 db1,则变量前缀会变为 DB1_。借助这些环境变量,应用程序可以安全且私密地连接到 db 容器上的数据库,只有链接的网页容器才具备通信权限。

[[[IMG_1]]]