我可以使用--link name:alias
参数链接docker容器,该参数将在容器中创建多个环境变量,例如ALIAS_PORT_1234_TCP_ADDR
,ALIAS_PORT_1234_TCP_PORT
,ALIAS_PORT_1234_TCP_PROTO
。
ALIAS_PORT_1234_TCP_ADDR
var可用于检测链接容器的IP(即使建议使用etc/hosts
条目,因为它将在容器重启时更新,而env变量不会改变。)
但对我而言,我可以使用这些其他两个变量并不明显。在给定示例中,ALIAS_PORT_1234_TCP_ADDR
将为1234
,ALIAS_PORT_1234_TCP_PROTO
将为tcp
- 但这两个值已经在变量的名称中。
有人可以告诉我这些变量的意图和用途吗?
是否存在链接容器的公开端口与EXPOSE
声明的端口不同的情况?我知道我可以通过-p
将容器端口绑定到主机但我的理解是,这对链接容器没有影响,因为它们将直接与链接容器的端口对话,无需与主机(这将更加困难,因为在容器内获取主机的IP并不容易)。
另外,为什么端口协议会发生变化或需要检测?
答案 0 :(得分:0)
是否存在链接容器的公开端口与其使用EXPORT声明的端口不同的方案
如果您的意思是EXPOSE
,那么主要区别在于没有链接,您需要将端口发布到主机,以便其他容器发现它并与第一个导出其容器的容器进行通信端口。
但是使用--links,您不必使用-P or -p <hostport>:<containerport>
,您可以发现第一个容器使用环境变量公开的端口。主机不需要使用其中一个端口回送到第一个容器端口。
参见&#34; Communication between linked docker containers&#34;作为一个使用所有三个环境变量的例子。
如果要调用从Container_2调用URL udp://Container_1_IP:5043
,则需要--link
设置所有3个变量才能使用正确的IP,端口和协议。
OP评论:
当然,我可以构建&#34;
udp://Container_1_IP:5043
&#34;来自env vars - 但我看不出,为什么我需要这样做:
$ALIAS_PORT_5043_UDP_PROTO:// $ALIAS_PORT_5043_UDP_ADDR:$ALIAS_PORT_5043_UDP_PORT
确实如此,但没有考虑 port range (PORT_START
和PORT_END
环境变量)
答案 1 :(得分:0)
我自己很想知道这件事。我认为环境变量主要只是一种文档形式;您可以调用env
来发现容器暴露的端口。我想一个用例可能是从链接容器中的环境中解析变量的名称;这将允许您在运行时选择要使用的端口或端口。 (即使这样,拥有诸如ALIAS_PORTS
之类的变量而不是具有已经编码的值的名称似乎更有意义。
此外,我认为随着Docker网络功能的发展,这可能会在未来发生变化。