Docker 组成:如何将其他服务引用为localhost

rbpvctlc  于 2023-03-17  发布在  Docker
关注(0)|答案(4)|浏览(139)

我有两个服务-一个是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服务的能力?

nkoocmlb

nkoocmlb1#

您可以使用extra_hosts

extra_hosts:
  - localhost:${COMPANY_DB_IP}

缺点是你必须手动设置IP,而且它可以更改:/

rpppsulh

rpppsulh2#

这是回答这里:https://stackoverflow.com/a/43554707/4417769
在我的用例中,将network_mode: "host"添加到最终与所有其他服务对话的中央应用程序就足够了。通过使用此功能,无论我的服务是从终端运行还是从Docker容器中运行,都不会有任何区别。现在,它可以通过使用localhost:port与在我的组合文件中配置的数据库等对话。

dgiusagp

dgiusagp3#

每个容器都将自己视为本地主机。Docker使用内部DNS。因此,您可以这样调用DB容器:
jdbc:mysql://公司数据库/公司数据库
并删除DB的主机名。

carvr3hs

carvr3hs4#

您可以通过将本地主机端口Map到容器来实现这一点。

ports:
    - 3306:3306

相关问题