我有两个服务-一个是app,另一个是db。这是一个Docker合成文件的草图:
version: "2"
services:
company:
container_name: company-app
extends:
file: ../base-config.yml
service: company
links:
- company-db
env_file: ./company.env
extra_hosts:
- "local.company.com:127.0.0.1"
company-db:
container_name: company-db
hostname: localhost
extends:
file: ../base-config.yml
service: company-db
env_file: ../db.env
应用程序服务尝试连接到url jdbc:mysql://localhost/company_db
上的数据库
这导致在Docker容器中运行时出现Communications link failure
。
我已经附加到运行应用程序容器,并检查etc/hosts
文件,并找到下一个内容:
root@d1a4391a83f4:/# cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 local.company.com
172.18.0.3 d1a4391a83f4
据我所知,docker compose添加的最后一个条目是我可以引用db容器的ip,我还发现它可以被company-db
域引用。
另外,如您所见,我尝试向company-db服务添加hostname选项,但没有成功。
我的问题是,我是否可以通过仅更改组合配置来实现通过相同的本地主机URL引用company-db
服务的能力?
4条答案
按热度按时间nkoocmlb1#
您可以使用
extra_hosts
:缺点是你必须手动设置IP,而且它可以更改:/
rpppsulh2#
这是回答这里:https://stackoverflow.com/a/43554707/4417769
在我的用例中,将
network_mode: "host"
添加到最终与所有其他服务对话的中央应用程序就足够了。通过使用此功能,无论我的服务是从终端运行还是从Docker容器中运行,都不会有任何区别。现在,它可以通过使用localhost:port与在我的组合文件中配置的数据库等对话。dgiusagp3#
每个容器都将自己视为本地主机。Docker使用内部DNS。因此,您可以这样调用DB容器:
jdbc:mysql://公司数据库/公司数据库
并删除DB的主机名。
carvr3hs4#
您可以通过将本地主机端口Map到容器来实现这一点。