Docker-compose:将主机名设置为容器运行所在的主机名

问题描述 投票:0回答:3

现在,我的 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 龙卷风 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 文件中指定它?

docker docker-compose docker-swarm
3个回答
10
投票

如果你至少运行 Docker

17.10
那么你可以使用这样的东西:

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

请参阅了解更多信息。


3
投票

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

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

version: '3'

reverse-proxy:
  hostname: $HOSTNAME

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


1
投票

我尝试过 Constantin Galbenu 的解决方案仅适用于群体设置,而 Brandonsimpkins 的解决方案缺乏

HOSTNAME
定义。

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

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

如果像我一样,您的主机名与您的用户名相同,请跳过第 1 步,仅执行此操作

my-container:
  hostname: ${USER}
© www.soinside.com 2019 - 2024. All rights reserved.