链接容器中的<别名> _PORT_ <port> _ <proto> _ * env vars的含义和用法
我可以链接--link name:alias
容器和--link name:alias
参数,它将在容器中创build几个环境variables,例如ALIAS_PORT_1234_TCP_ADDR
, ALIAS_PORT_1234_TCP_PORT
, ALIAS_PORT_1234_TCP_PROTO
。
ALIAS_PORT_1234_TCP_ADDR
var可用于检测链接容器的IP(即使build议使用etc/hosts
条目,因为它将在容器重启时更新,而env vars不会更改)。
但是对我而言这并不明显,我可以使用这两个variables。 在给定的例子中, ALIAS_PORT_1234_TCP_ADDR
将是1234
, ALIAS_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_PORT
这是真的,但不考虑端口范围 (使用PORT_START
和PORT_END
环境variables)