我有两个服务 - 一个是应用程序,另一个是数据库。 这是 docker compose 文件的草图:
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 服务,但没有成功。
我的问题是,我是否可以通过仅更改 compose 配置来实现通过相同的 localhost url 引用
company-db
服务的能力?
每个容器都将自己视为本地主机。 Docker 使用内部 DNS。所以你可以这样调用你的数据库容器:
jdbc:mysql://company-db/company_db
并删除数据库的主机名。
您可以使用
extra_hosts
:
extra_hosts:
- localhost:${COMPANY_DB_IP}
缺点是你必须手动设置IP,而且它可以改变:/
这里回答了:https://stackoverflow.com/a/43554707/4417769
在我的用例中,将
network_mode: "host"
添加到最终与所有其他服务通信的中央应用程序就足够了。通过使用它,如果我的服务从终端运行,或者从 Docker 容器内运行,就不再有什么区别了。它现在可以使用 localhost:port 与我的撰写文件中配置的数据库等进行通信。
您可以通过将本地主机端口与容器映射来实现此目的。 对于您的公司数据库服务,请编写以下内容
ports:
- 3306:3306