docker compose:如何将其他服务引用为本地主机

问题描述 投票:0回答:4

我有两个服务 - 一个是应用程序,另一个是数据库。 这是 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 docker-compose docker-networking
4个回答
0
投票

每个容器都将自己视为本地主机。 Docker 使用内部 DNS。所以你可以这样调用你的数据库容器:

jdbc:mysql://company-db/company_db

并删除数据库的主机名。


0
投票

您可以使用

extra_hosts

extra_hosts:
  - localhost:${COMPANY_DB_IP}

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


0
投票

这里回答了:https://stackoverflow.com/a/43554707/4417769

在我的用例中,将

network_mode: "host"
添加到最终与所有其他服务通信的中央应用程序就足够了。通过使用它,如果我的服务从终端运行,或者从 Docker 容器内运行,就不再有什么区别了。它现在可以使用 localhost:port 与我的撰写文件中配置的数据库等进行通信。


-3
投票

您可以通过将本地主机端口与容器映射来实现此目的。 对于您的公司数据库服务,请编写以下内容

ports:
    - 3306:3306
© www.soinside.com 2019 - 2024. All rights reserved.