Вы можете определить его в рамках службы следующим образом:
... letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion hostname: ledocker ...
Но действительно ли вам это нужно? Общая цель имени хоста состоит в том, чтобы компьютеры в сети знали друг друга и, таким образом, обменивались данными между собой.
Точно так же основная цель здесь – гарантировать, что контейнеры могут успешно взаимодействовать друг с другом в сети Docker.
Мы собираемся обсудить два способа сделать это возможным:
Метод 1: неявное общение
В сети Docker имена служб, определенные в файле 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 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-proxy и letsencrypt. Вы можете использовать эти имена, чтобы проверить, могут ли контейнеры взаимодействовать друг с другом или нет. Это может стать очень полезным при поиске и устранении неисправностей.
Сначала установите ping внутри контейнера обратного прокси Nginx :
andreyex@destr-desktop:~/nginx-proxy$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"
Теперь вы можете использовать команду ping внутри этого контейнера, чтобы проверить, может ли он взаимодействовать с контейнером Let’s Encrypt (используется для SSL).
andreyex@destr-desktop:~/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 наша обычная сеть.
Давайте быстро это проверим:
andreyex@destr-desktop:~/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.
andreyex@destr-desktop:~/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
Метод 2: явное общение
Скажем, по какой-то причине вы хотите явно указать имя хоста для контейнера. Docker Compose тоже позволяет это делать!
Используя параметр конфигурации hostname, вы можете установить другое имя хоста для любой службы, определенной в файле Docker Compose, как я сделал для службы Let’s Encrypt ниже:
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?
andreyex@destr-desktop:~/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
Определенно да. Оно работает!
Надеемся, вам понравился этот быстрый совет! Вы можете оставить любые вопросы, сомнения или предложения в разделе комментариев ниже.