【问题标题】:How do I refer to a docker container from another docker container, inside a network?如何在网络内从另一个 docker 容器引用 docker 容器?
【发布时间】:2017-09-26 13:00:04
【问题描述】:

我正在尝试使用 Confluence 创建一项服务,并使用 JIRA 创建一项服务。

我已经创建了一个这样的网络:

docker network create --driver bridge atlassian_stack

并在此网络上各发布一个容器,一个暴露端口 8080,另一个暴露 8090:

docker run -it --detach --publish 8080:8080 --net=atlassian_stack --name JIRA cptactionhank/atlassian-jira-software:latest

docker run -it --detach --publish 8090:8090 --net=atlassian_stack --name CONFLUENCE cptactionhank/atlassian-confluence:eap

我可以在本地访问 http://localhost:8080(JIRA) 和 http://localhost:8090(Confluence)。

但是,将应用程序链接在一起需要 Atlassian 产品中的硬编码 IP。 Confluence 想知道 JIRA 所在的位置,以及 vica verca。他们似乎无法在上述 IP 地址上看到对方(这是有道理的),因为它抱怨未解析的 DNS。

那么问题是:当应用程序需要硬编码的 DNS/IP,并且它们位于同一个网络中时,我如何正确地将它们相互引用?

【问题讨论】:

  • 尝试在 confluence 配置中使用 JIRA:8080 和 CONFLUENCE:8090 反之亦然
  • 尝试使用容器名称 - 似乎不起作用,至少在 jira/confluence 设置中:/
  • 你是对的!我在容器名称中有一个下划线,这就是他们看不到对方的原因......有道理。干杯。

标签: docker networking dns jira


【解决方案1】:

当多个容器共享一个公共网络时,每个容器都可以使用容器的name 解析任何其他容器(在同一网络上)。

因此,在您的情况下,您应该能够运行 docker exec -it JIRA ping CONFLUENCEdocker exec -it CONFLUENCE ping JIRA,假设 ping 在这些容器中可用,如果没有,您可以在每个容器中执行/附加一个 shell 并安装所需的网络工具(pingtelnetnc 等)[docker exec -it JIRA sh 然后在# 提示符处、yum install telnet -yapt instal -y 取决于基础映像的特定发行版。]

如果您只能使用 IP 地址(而不是主机名/名称),那么您需要在 Confluence 启动时获取它,方法是运行 nslookup jira 或类似的东西。下面是一个例子:

~ ᐅ docker network create -d bridge www
9e1ab7c25a58fdbdaa1ec46bbcf9c9b37bb6ddc776abe6b2fb47dbb0c100d750
~ ᐅ docker run -d --name w1 --network www busybox top
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
03b1be98f3f9: Pull complete
Digest: sha256:99ccecf3da28a93c063d5dddcdf69aeed44826d0db219aabc3d5178d47649dfa
Status: Downloaded newer image for busybox:latest
fb0c198b002559b6ccd7dd145a394592a7258b1a955012aae8c707a5bea70c86
~ ᐅ docker run -d --name w2 --network www busybox top
13ea6ceb82f7d80d34a8cc3b6ba79bdfcc1d3a5f1df1b5f59a20323db21a7190
~ ᐅ docker exec -it w1 nslookup w2
Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      w2
Address 1: 172.19.0.3 w2.www

~ ᐅ docker exec -it w1 sh

/ # nslookup w2 | awk '/^Address.* w2.*/ { print $3 ; exit }'
172.19.0.3
/ # exit

【讨论】:

  • 错误很简单:我在容器名称中有一个下划线,所以 SOMETHING_JIRA - 当然这不能被 DNS 解析.. 愚蠢的愚蠢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多