docker - docker compose 中未设置主机名

标签 docker docker-compose

我创建了简单的撰写配置来尝试 Postgres BDR 复制。 我希望容器将主机名作为我定义的服务名称,并且我希望一个容器能够使用该主机名解析并到达另一个容器。我希望这是真的,因为: https://docs.docker.com/compose/networking/

我的配置:

version: '2'

services:
  bdr1:
    image: bdr
    volumes: 
      - /var/lib/postgresql/data1:/var/lib/postgresql/data
    ports:
      - "5001:5432"
  bdr2:
    image: bdr
    volumes: 
      - /var/lib/postgresql/data2:/var/lib/postgresql/data    
    ports:  
      - "5002:5432"

但实际上,两个容器都获得垃圾主机名,并且无法通过容器名称访问:

Creating network "bdr_default" with the default driver
Creating bdr_bdr1_1
Creating bdr_bdr2_1
Attaching to bdr_bdr1_1, bdr_bdr2_1
bdr1_1 | Hostname: 938e0585fee2
bdr2_1 | Hostname: 7153165f4d5b

这是一个错误,还是我做错了什么? 我使用 Ubuntu 14.04.4 LTS,Docker 版本 1.10.1,构建 9e83765,docker-compose 版本 1.6.0,构建 d99cad6

最佳答案

docker-compose 为您提供了扩展或缩小服务的选项,这意味着您可以启动同一服务的多个实例。这至少是主机名不仅仅是服务名称的原因之一。您会注意到,如果将 bdr1 扩展到 2 个实例,您将拥有 bdr_bdr1_1 和 bdr_bdr1_2 容器。

您可以通过至少两种方式在 docker-compose 启动的容器内解决此问题:

  • 如果某个服务引用其他服务,您可以使用 links 部分,例如将 bdr1 链接到 bdr2。在这种情况下,当您位于 bdr1 内部时,您可以通过名称调用主机 bdr2。我还没有尝试过在这种情况下扩展 bdr2 时会发生什么。
  • 您可以使用 hostname 部分在内部将容器的主机名强制设置为您想要的名称。例如,如果您将 hostname: bdr1 添加到 bdr1,那么您可以在内部连接到 bdr1,即 bdr1 本身。

您可能可以使用networks部分获得类似的结果,但我自己还没有使用过它,所以我不确定。

关于docker - docker compose 中未设置主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35642956/

相关文章:

docker - 我想在远程 docker 守护进程上运行 docker-compose.yml,卷呢?

python - 无法从 docker compose env 文件访问环境变量

logging - Docker 组合不显示链接的控制台输出

docker - 如何从 Windows 中的 Docker 容器访问 "http://localhost"?

在 jenkinsfile 中找不到 mysqldump

docker - 如何在Teamcity中的Agent checkout文件夹之外设置工件路径?

linux - 什么是 .pivot_root 文件?

powershell - 该字符串缺少终止符:'。在WindowsServerCore容器中

elasticsearch - 如何连接到在 vagrant guest os 中运行 elasticsearch 的 docker box?

docker - Flask + Nginx反向代理拒绝在Docker容器中进行连接