链接容器中的<别名> _PORT_ <port> _ <proto> _ * env vars的含义和用法

我可以链接--link name:alias容器和--link name:alias参数,它将在容器中创build几个环境variables,例如ALIAS_PORT_1234_TCP_ADDRALIAS_PORT_1234_TCP_PORTALIAS_PORT_1234_TCP_PROTO

ALIAS_PORT_1234_TCP_ADDR var可用于检测链接容器的IP(即使build议使用etc/hosts条目,因为它将在容器重启时更新,而env vars不会更改)。

但是对我而言这并不明显,我可以使用这两个variables。 在给定的例子中, ALIAS_PORT_1234_TCP_ADDR将是1234ALIAS_PORT_1234_TCP_PROTO将是tcp – 但是这两个值已经在variables的名字中。

有人能够启发我,关于这些variables的意图和使用吗?

有没有情况下,链接容器的暴露端口是不同于它声明与EXPOSE ? 我知道我可以通过-p将一个容器端口绑定到主机,但是我的理解是,这对链接的容器没有任何影响,因为它们将直接与链接容器的端口进行通信,不需要与主机通信会更加困难,因为在容器内部获得主机的IP并不那么容易)。

另外,为什么端口的协议改变或需要被检测?

我很长一段时间以来一直在思考这个问题。 我认为环境variables主要只是一种文档forms, 你可以调用env来发现容器暴露的端口。 我想一个用例可能是从链接容器中的环境中parsingvariables的名字; 这将允许您在运行时select使用哪个或哪些端口。 (即使这样,使用ALIAS_PORTS这样的variables,而不是已经编码的名称也会变得更有意义)。

另外,随着Dockernetworkingfunction的发展,我认为未来可能会发生变化。

是否有情况,其中链接的容器的暴露的端口是不同于它与EXPORT声明的

如果你的意思是EXPOSE ,那么主要的区别就是没有链接,你需要把端口发布到主机上,以便其他容器发现它,并且返回到第一个导出其端口的容器。

但使用–links ,您不必使用-P or -p <hostport>:<containerport> ,您可以使用环境variables发现第一个容器公开的端口。 主机不需要使用其中的一个端口来回送到第一个容器端口。

请参阅“ 链接的Docker容器之间的通信 ”,作为将使用所有三个环境variables的示例。

如果要调用udp://Container_1_IP:5043的URL udp://Container_1_IP:5043 ,则需要使用--link来设置所有3个variables,以便使用正确的IP,端口和协议。

OP评论:

当然,我可以从env vars构build“ udp://Container_1_IP:5043 ” – 但我看不到,为什么我需要这样做:

 $ALIAS_PORT_5043_UDP_PROTO:// $ALIAS_PORT_5043_UDP_ADDR:$ALIAS_PORT_5043_UDP_POR‌​T 

这是真的,但不考虑端口范围 (使用PORT_STARTPORT_END环境variables)