Docker-compose:设置主机名等于容器所在的主机名运行
Docker-compose: setting hostname equal to its hostname of where the container is running
现在,我在 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 网络服务器
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 17.10
那么你可以使用这样的东西:
services:
daggr:
hostname: '{{.Node.Hostname}}'
有关详细信息,请参阅 this。
上面选择的答案对我不起作用(大概是因为我不是 运行 docker/docker-compose 集群模式)。
我能够通过执行以下操作为我的反向代理设置容器主机名以匹配 docker 主机 FQDN:
version: '3'
reverse-proxy:
hostname: $HOSTNAME
这使我能够轻松地配置 Nginx 以在启动之前选择正确的服务器证书/密钥对。
我试过 Constantin Galbenu 的解决方案只适用于集群设置,而 brandonsimpkins 的解决方案缺少 HOSTNAME
定义。
解决方法是为您的主机名设置一个环境变量:
export HOSTNAME="$(cat /etc/hostname)"
my-container:
hostname: ${HOSTNAME}
如果像我一样,您的主机名与您的用户名相同,请跳过第 1 步,只执行
my-container:
hostname: ${USER}
现在,我在 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 网络服务器
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 17.10
那么你可以使用这样的东西:
services:
daggr:
hostname: '{{.Node.Hostname}}'
有关详细信息,请参阅 this。
上面选择的答案对我不起作用(大概是因为我不是 运行 docker/docker-compose 集群模式)。
我能够通过执行以下操作为我的反向代理设置容器主机名以匹配 docker 主机 FQDN:
version: '3'
reverse-proxy:
hostname: $HOSTNAME
这使我能够轻松地配置 Nginx 以在启动之前选择正确的服务器证书/密钥对。
我试过 Constantin Galbenu 的解决方案只适用于集群设置,而 brandonsimpkins 的解决方案缺少 HOSTNAME
定义。
解决方法是为您的主机名设置一个环境变量:
export HOSTNAME="$(cat /etc/hostname)"
my-container:
hostname: ${HOSTNAME}
如果像我一样,您的主机名与您的用户名相同,请跳过第 1 步,只执行
my-container:
hostname: ${USER}