Docker-compose:如何将主机名用于 docker 实例,在内部和外部均有效?

Docker-compose: how to use a hostname for a docker instance valid both from inside and outside?

我有这样一种情况,我们使用 docker-compose 来 运行 一个在开发过程中填充了测试数据的数据库。后端程序员(我)运行 只是数据库。前端程序员 运行s 数据库 + 具有不同配置文件的后端。

在第一个场景中,后端需要在本地主机端口 1433 上找到数据库。在第二个场景中,后端需要在我分配给 docker 容器的主机名上找到数据库,这与本地主机。这意味着无法共享配置,我现在已经通过使用不同的配置文件解决了这个问题。

不幸的是,我现在需要将主机名放入数据库中(用于动态查找),但我无法这样做。

有没有办法让 Windows 上的本地管理员在 Docker 桌面下使用 docker-compose 来获得在这两种情况下都能正常工作的主机名?

问题的根源在于,如果没有额外的主机配置,就不可能使容器名称对主机可见。因此,它要么编辑 hosts 文件以获取额外记录(或者甚至调出您自己的 DNS,运行ning in Docker),要么使用 localhost.

可以通过使用 network_mode 参数(在 swarm 中忽略)使一个容器使用另一个容器的网络堆栈。这应该使两个容器都能够通过 localhost 相互通信,并且开发人员也可以从主机使用 localhost

不幸的是,此方法有一些限制:

  • 服务必须用不同的docker-compose文件分隔,否则会出现错误:

ERROR: Service 'client' uses the network stack of container 'some_unique_container_name' which does not exist.

  • 您要使用的网络堆栈容器(在本例中为数据库)必须存在。
  • 您需要 运行 两个命令来启动堆栈。
  • 不适用于群。如果您在生产中需要它,Kubernetes pods 中的容器默认启用此行为。

这是一个例子:

# server.yml
version: "3"
services:
  server:
    image: nginx
    container_name: some_unique_container_name
---
# client.yml
version: "3"
services:
  client:
    image: curlimages/curl
    network_mode: container:some_unique_container_name
    command: curl localhost

要提出来,先运行docker-compose -f server.yml up -d,然后docker-compose -f client.yml up