【问题标题】:Docker-compose: how to use a hostname for a docker instance valid both from inside and outside?Docker-compose:如何为从内部和外部都有效的 docker 实例使用主机名?
【发布时间】:2021-08-14 22:26:16
【问题描述】:

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

在第一种情况下,后端需要在 localhost 端口 1433 上找到数据库。在第二种情况下,后端需要在我分配给与 localhost 不同的 docker 容器的主机名上找到数据库。这意味着无法共享配置,直到现在我通过不同的配置文件解决了这一问题。

不幸的是,我现在需要将主机名放入无法执行此操作的数据库(用于动态查找)中。

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

【问题讨论】:

  • 最简单的方法是修改'hosts'文件,添加一条容器名称指向127.0.0.1的记录。
  • @anemyte 这也是我最后做的。一个实用的 hack - 我希望有一个开箱即用的解决方案,并且不需要未来用户的管理员访问权限,但现在它很好。谢谢。如果你想要分数写一个答案。
  • 你的评论让我想起了我忘了说的话,我会写一个答案。

标签: c# docker-compose windows-10 docker-desktop


【解决方案1】:

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

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

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

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

错误:服务“客户端”使用不存在的容器“some_unique_container_name”的网络堆栈。

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

这是一个例子:

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 2019-05-12
    • 2018-10-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多