通过主机名发现 Docker 容器不起作用

2023-12-20

我使用以下 docker compose 文件位于/tmp/compose.yml对于docker堆栈部署:

version: "3.6"

services:
  service-A:
    image: service-A
    networks:
      - net
    hostname: "service-A-{{.Task.Slot}}"
    deploy:
      replicas: 2

  service-B:
    image: service-B
    networks:
      - net
    hostname: "service-B-{{.Task.Slot}}"
    deploy:
      replicas: 2

networks:

  net:

运行命令:

docker network create -d overlay net
docker stack deploy -c /tmp/compose.yml my

我的期望是service-A各个容器将能够发现service-B容器按容器预定义的主机名:service-B-1, service-B-2。 然而,ping service-B-1从任何内部service-A容器失败。

Docs https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/ state:

hostname设置容器通过其识别自身的主机名。这是写的 进入/etc/hostname,进入/etc/hosts作为容器的名称 面向主机的 IP 地址,是 /bin/bash 中的名称 容器将显示在其提示符中。但主机名并不容易 从容器外部看到。它不会出现在 docker ps 中,也不会出现 在任何其他容器的 /etc/hosts 文件中。

如何通过容器预定义的主机名实现docker swarm服务容器到服务容器的通信?

唯一有效的方法是添加条目,例如:

[service_B_container_1_virtual_ip] service-B-1
[service_B_container_2_virtual_ip] service-B-2

to /etc/hosts of service-A容器。

也很有趣的是,如果hostname没有设置在docker-composes文件,但由 docker 生成,ping [container_id]即使跨多主机 docker swarm 也能成功。

我期望预定义的主机名具有相同的行为。


我认为没有任何直接的方法可以做到这一点。我想得越多,就越有道理不应该有一种做你所要求的事情的方法,按设计.

堆栈服务的基本属性之一是它应该以 Docker 能够互换地处理该服务中的所有副本的方式进行部署。如果您需要连接到单个实例,建议首先不要将这些容器创建为服务副本,因为某物这使他们与众不同。适当的堆栈服务应该能够将每个副本视为可以随时销毁和重建的短暂实体,并且该操作应该对外部不可见。

你什么can从 Docker 网络内部做的是使用服务名称引用服务实体。所以在你的例子中,ping Service-A应该在堆栈中的任何容器中工作,因此将ping Service-B.

服务中各个容器的名称类似于

my_stack_redis.1.y1pwzeg8239yb6n6ynefs78br
my_stack_webserver.1.d6cxx8nlg7db9m2poy9wfjdyd

如果您绝对必须从容器内访问这些名称,我能想到的唯一方法就是公开/var/run/docker.sock启动时通过绑定安装在容器内。然后,chmod 750作为一部分的插座上CMD / ENTRYPOINT脚本,以便非 root 用户可以读取它。现在您应该能够安装 Docker CLI 并使用docker network inspect发现实际服务成员的姓名,以及jq解析它们(您可能需要将两个包添加到图像中)。但到那时,更好的选择可能是将这些不可替代的容器分离到它们自己的服务组中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过主机名发现 Docker 容器不起作用 的相关文章

随机推荐

  • Excel 多行条件格式

    我试图突出显示超出预期值范围 仅较高或较低 的单元格 每行对应一个不同的行 该行有两个带有最大值和最小值的单元格 有没有办法让 Excel 计算出来 例如 第 7 行的单元格仅当其值超出 B31 的最小值或 B32 的最大值时才应突出显示
  • 角度异步事件的问题

    我的代码循环遍历数组中的 10 个项目 对每个项目发出请求 然后将返回的数据推送到数组中 一切都运行良好 直到 q all line details getDetails function idSet pageNum var page id
  • python 2.7小写

    当我使用 lower 在Python 2 7中 字符串不会将字母转换为小写 我从字典中读取数据 我尝试使用str tt code lower tt code lower 有什么建议 使用 unicode 字符串 drostie signy
  • 如何通过 Python 使用 GeckoDriver 和 Selenium 启动使用默认 Firefox 到 68.9.0esr 的 Tor 浏览器 9.5

    我正在尝试通过以下方式启动 Tor 浏览会话托尔浏览器 9 5它使用默认的火狐浏览器 v68 9 0esr using Gecko驱动程序 https stackoverflow com questions 43660195 why fir
  • 什么时候应该将translatesAutoresizingMaskIntoConstraints设置为true?

    我读过文档 https developer apple com documentation uikit uiview 1622572 translatesautoresizingmaskintoco 但我仍然不确定什么时候不需要将其设置为f
  • 获取SD卡路径

    请在投反对票和 或将其标记为重复之前阅读整篇文章 我正在开发一款应用程序 它可以从用户手机上的特定文件夹中读取文件 从 SD 卡 如果有的话 或从内置存储中读取 是的 清单中提到了 READ EXTERNAL STORAGE 我还在处理 A
  • android(单点触控)绘图应用程序撤消方法无法正常工作

    我正在开发一个绘图应用程序 但面临一些撤消问题 编码如下 public class DoodleView extends View Context context new private static final float TOUCH T
  • 有没有办法使用 ODI 场景重新创建 ODI 包?

    我错误地从我的项目中删除了一个非常大的 ODI 包 如果我之前为同一项目导出过场景 是否可以重新创建相同的包 不幸的是 没有任何方法可以直接从场景中生成已删除的包 您可以将其视为包的编译版本 以下是一些需要检查的事项 以确定您是否可以检索某
  • 该进程无法访问文件“ ”,因为该文件正在被另一个进程使用

    我正在尝试删除使用文件对话框上传的图像文件的本地副本 在计算机上 它抛出进程无法访问文件 C Documents and Settings 用户名 我的文档 我的图片 1220 bmp 因为它正在被另一个进程使用 private void
  • mvc3编辑表单中的下拉菜单

    这可能很简单 但我似乎无法自己解决 我创建了一个简单的数据库和实体模式 如下所示 我正在尝试创建一个创建表单 该表单允许我添加新订单 我总共有 3 个表 所以我想要做的是拥有一个允许用户输入订单日期的表单 并且还有一个下拉列表 允许我从产品
  • R:使用包“rgdal”和“raster”裁剪 GeoTiff 栅格

    我想使用提到的两个包 rgdal 和 raster 裁剪 GeoTiff 光栅文件 一切工作正常 除了生成的输出 tif 的质量非常差并且是灰度而不是彩色 原始数据是来自瑞士联邦地形局的高质量栅格地图 示例文件可以下载here http w
  • 按日期对 ArrayList 中的对象进行排序?

    我找到的每个示例都是按字母顺序执行此操作 而我需要按日期对元素进行排序 我的 ArrayList 包含其中一个数据成员是 DateTime 对象的对象 在 DateTime 上我可以调用函数 lt less than lteq less t
  • Angular 2:没有提供(注入)服务的提供者

    我的应用程序中有两个服务 MainService 和 RightClickService 应用程序中只有MainService可以全局访问 RightClickService被注入到MainService中 因此 我将以下文件定义为 应用程
  • 在 TypeScript 中将值与枚举进行比较并不明显

    我有非常简单的代码 enum Color BLUE RED class Brush color Color constructor values this color values color let JSON RESPONSE color
  • 使用 Python 的 Matplotlib 绘制 C++ 程序中生成的数据

    我目前正在使用 Qt 开发一个 C 应用程序 我必须绘制一些由 C 生成的数据 矢量场 时间信号相关矩阵等 我发现 Python 中的 Matplotlib 非常好 这就是为什么我想将数据从 C 程序传递到将进行绘图的 Python 函数
  • Visual Studio 2015 update 3 在“获取数据提示文本...”后崩溃

    在 Visual Studio 2015 中调试 C 应用程序时 我常常将鼠标悬停在变量上时收到此消息 此后它会冻结并重新启动 从而无法进行调试 有人有任何线索吗 与 duDE 共享的线程一样 请在 工具 gt 选项 gt 调试 gt 常规
  • 如何将jar发布到本地存储库?

    我有一个编译为 jar 的库 不是 sbt 项目 没有源代码 只有 jar 文件 该库在存储库中不可用 有没有办法在本地发布 jar 以便我可以使用添加依赖项libraryDependencies org xxx xxx 1 0 符号 我已
  • 如何调试或查看 Elastic Beanstalk 中部署的 .NET Core 应用程序的输出?

    具体来说 我对能够通过他们的界面查看输出感兴趣 例如 有没有办法获得ILogger LogFoo方法或Console WriteLine出现在监控 or Logs标签还是其他地方 我试图避免使用专有的 AWS 方式来查看输出 以防应用程序需
  • 如何使用 phpseclib 从我的 php 服务器 -> 其他服务器上传文件?

    我正在尝试将文件从我的 php 服务器上传到其他服务器 我的工作场所非常蹩脚 足以阻止 ssh 流量 不管怎样 这就是我想做的 位于 public html manage php
  • 通过主机名发现 Docker 容器不起作用

    我使用以下 docker compose 文件位于 tmp compose yml对于docker堆栈部署 version 3 6 services service A image service A networks net hostna