【问题标题】:How to get long hostname of a docker container inside a container?如何在容器内获取 docker 容器的长主机名?
【发布时间】:2020-01-27 08:48:36
【问题描述】:

我们的应用程序在 traefik 反向代理之后。我们管理许多子域,并使用 traefik 的监视文件功能来动态设置新的子域以进行代理。 所以我们的应用程序会生成一个 traefik .yaml 动态配置文件。

同一个 traefik 将管理同一个应用程序的许多实例。

为此,我们需要向 traefik 指明如何在其自己的网络中访问我们的应用程序。 我们知道我们可以使用简单的主机名,即容器名称。 但这仅适用于应用实例的默认 docker-compose 网络,而不是与 traefik 共享的外部网络。

这个需要长主机名版本,所以我们确信它可以到达正确的应用程序实例。 (<compose_name>_<container_name>_1 或取决于 docker-compose 版本 (<compose_name>_<container_name>_1_<hash>)

您知道一种方法可以在同一 docker-compose 默认网络的另一个容器中获取 docker-compose 容器的主机名的长版本吗?

为了更好的上下文,这里有一个简单的 docker-compose.yaml 文件

version: "3"

services:
  app:
    image: app_image
    networks:
      - app_network
    restart: unless-stopped

  nginx:
    image: nginx
    links:
      - app
    networks:
      - app_network
      - traefik_traefik
    restart: unless-stopped

networks:
  traefik_traefik:
      external: true
  app_network:
      driver: bridge

我们希望从 app 容器中获取 nginx 长主机名版本,以便我们可以使用它来生成 traefik 的动态配置。

感谢您的帮助。

【问题讨论】:

    标签: docker-compose traefik


    【解决方案1】:

    我们认为已经找到了解决方案。查询短名称主机名的 FQDN 给出所需的长主机名。

    dig +short -x `dig +short nginx`
    

    返回composename_app_1.composename.app_network.

    在我们的 python 应用程序中,我们可以使用

    获得相同的结果
    import socket
    socket.getfqdn('nginx')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多