【问题标题】:Docker-compose: setting hostname equal to its hostname of where the container is runningDocker-compose:设置主机名等于容器运行位置的主机名
【发布时间】:2018-04-05 06:14:25
【问题描述】:

现在,我在 swarm 集群中有两个节点

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
yey1njv9uz8adf33m7oz0h80f *   redis2              Ready               Active              Leader
lbo91v2l15h24isfd5jegoxu1     redis3              Ready               Active   

这是 docker-compose.yml 文件

version: "3"
services:
  daggr:
    # replace username/repo:tag with your name and image details
    image: daggr
    hostname: examplehostname
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
        - "8080:8080"
    volumes:
        - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
        placement:
            constraints: [node.role == manager]
    networks:
        - webnet
  redis:
    image: redis
    networks:
        - webnet
networks:
  webnet:

如您所见,我正在为 daggr 服务设置主机名

daggr 容器基本上运行一个 python tornado web 服务器

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('Hello from daggr running on %s\n' % socket.gethostname())

我已经测试了如下

$ curl redis2:4000
Hello from daggr running on examplehostname

现在,我希望它动态匹配容器运行位置的主机名,而不是静态设置主机名。 IE。如果 daggr 容器在 redis2 上运行,则应显示为 redis2,在 redis3 上应显示为 redis3。

如何从 docker-compose.yml 文件中指定?

【问题讨论】:

  • 你为什么需要这个?
  • @ConstantinGalbenu 这是用户设定的要求,他们需要能够知道 daggr 容器正在运行哪个主机,因为 daggr 容器可以在 swarm 集群中的任何位置运行。例如,如果 docker host 挂载而 daggr web 挂起,他们需要能够知道哪个主机是

标签: docker docker-compose docker-swarm


【解决方案1】:

如果您至少在运行 Docker 17.10,那么您可以使用如下内容:

services:
  daggr:
    hostname: '{{.Node.Hostname}}'

更多信息请参见this

【讨论】:

  • 我使用的是 Docker 19.03.5,并且这种语法在 docker-compose 中根本不起作用,它只是被解释为去掉了花括号的字符串文字。我做错了吗?
  • 这是一个集群功能。 Node 仅在 swarm 的上下文中才有意义。看看我几周前的问题。 stackoverflow.com/questions/64620078/…
  • 这对我在最新的 docker 集群模式下不起作用。
【解决方案2】:

上面选择的答案对我不起作用(大概是因为我没有在 swarm 模式下运行 docker/docker-compose)。

通过执行以下操作,我能够为我的反向代理设置容器主机名以匹配 docker 主机 FQDN:

version: '3'

reverse-proxy:
  hostname: $HOSTNAME

这让我可以轻松配置 Nginx,以便在启动之前选择正确的服务器证书/密钥对。

【讨论】:

  • $HOSTNAME 定义在哪里?
  • 注意:插值发生在运行变量替换的机器上。这个问题特别提到了作为一个群体的一部分,所以这个答案会将服务的主机名设置为为每个创建的任务运行的节点的主机名。
【解决方案3】:

我尝试了 Constantin Galbenu 的解决方案仅适用于群设置,而 Brandonsimpkins 的解决方案缺少 HOSTNAME 定义。

解决方法是将环境变量设置为您的主机名:

export HOSTNAME="$(cat /etc/hostname)"
my-container:
  hostname: ${HOSTNAME}

如果和我一样,你的主机名和你的用户名一样,跳过第 1 步,只做

my-container:
  hostname: ${USER}

【讨论】:

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