在 Docker Compose 中设置主机名

想知道如何在 Docker Compose 中设置主机名? 我会告诉你的。

您可以像这样在服务下定义它:

...
letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    hostname: ledocker
    ...

但你真的需要吗? 主机名的一般目标是网络上的计算机相互认识,从而在它们之间进行通信。

同样,这里的主要目标是确保容器可以在 Docker 网络中成功地相互通信。

我将讨论如何使这成为可能的两种方法:

方法一:非显式沟通

在 Docker 网络中,在 Docker Compose 文件中定义的服务名称可用于测试容器是否可以相互通信。

采取 example 以下反向代理配置:

version: '3.7'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./dhparam:/etc/nginx/dhparam
      - ./vhost:/etc/nginx/vhost.d
      - ./certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    env_file:
      - ./letsencrypt.env
    depends_on:
      - nginx-proxy
    volumes:
      - ./certs:/etc/nginx/certs:rw
      - ./vhost:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always
    networks:
      - net

networks:
  net:
    external: true

请注意,这两个服务名称是 nginx-proxyletsencrypt. 您可以使用这些名称来测试容器是否可以相互通信。 这在故障排除情况下会变得非常有用。

首先,在里面安装ping Nginx 反向代理 容器:

[email protected]:~/nginx-proxy$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"

现在,您可以在此容器内使用 ping 命令检查它是否可以与 让我们加密 容器(用于 SSL)。

[email protected]:~/nginx-proxy$ sudo docker-compose exec nginx-proxy ping letsencrypt
PING letsencrypt (172.18.0.3) 56(84) bytes of data.
64 bytes from nginx-proxy_letsencrypt_1.net (172.18.0.3): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from nginx-proxy_letsencrypt_1.net (172.18.0.3): icmp_seq=2 ttl=64 time=0.057 ms
^C
--- letsencrypt ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 37ms

正如您在上面看到的,反向代理容器“看到”第二个发送响应的 SSL 容器! 在 nginx-proxy_letsencrypt_1.net, nginx-proxy_letsencrypt_1 是 SSL 容器名称和 net 是我们的自定义网络。

让我们快速验证一下:

[email protected]:~/nginx-proxy$ sudo docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED         STATUS         PORTS     NAMES
a9ef56e22f58   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   7 minutes ago   Up 7 minutes             nginx-proxy_letsencrypt_1
563133f5d039   jwilder/nginx-proxy                      "/app/docker-entrypo…"   7 minutes ago   Up 7 minutes             nginx-proxy_nginx-proxy_1

要验证网络,您可以使用 docker network ls 命令。

[email protected]:~/nginx-proxy$ sudo docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
018c50dc4fdc   bridge              bridge    local
27fd2370e735   net                 bridge    local
38ce8d11227b   host                host      local
2440210d0fc5   none                null      local

方法二:显式沟通

比如说,出于某种原因,您想为容器显式指定主机名。 Docker Compose 也可以让你做到这一点!

使用 hostname 配置选项,您可以为 Docker Compose 文件中定义的任何服务设置不同的主机名,就像我为 让我们加密 以下服务:

version: '3.7'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./dhparam:/etc/nginx/dhparam
      - ./vhost:/etc/nginx/vhost.d
      - ./certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    hostname: ledocker
    env_file:
      - ./letsencrypt.env
    depends_on:
      - nginx-proxy
    volumes:
      - ./certs:/etc/nginx/certs:rw
      - ./vhost:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always
    networks:
      - net

networks:
  net:
    external: true

在这里,请注意,我已明确添加 hostname: ledocker 在 Let’s Encrypt 服务定义中。 我想用 ledocker 作为 SSL 容器的主机名。

但是等等,我们可以使用 ping 命令再次检查吗?

[email protected]:~/nextcloud$ sudo docker-compose exec nginx-proxy ping ledocker
PING ledocker (172.18.0.3) 56(84) bytes of data.
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=4 ttl=64 time=0.093 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=5 ttl=64 time=0.078 ms
64 bytes from nginx-proxy_nginx-proxy_1.net (172.18.0.3): icmp_seq=6 ttl=64 time=0.075 ms
^C
--- ledocker ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 129ms
rtt min/avg/max/mdev = 0.034/0.070/0.093/0.018 ms

完全同意。 有用!

渴望了解更多这方面的知识? 查看 这个信息非常丰富的 GitHub 线程.

希望你喜欢这个快速提示! 您可以在下面的评论部分留下任何疑问、疑问或建议。