Ti chiedi come impostare il nome host in Docker Compose? Te lo mostro.
Puoi definirlo sotto il servizio in questo modo:
...
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
hostname: ledocker
...
Ma ne hai davvero bisogno? L'obiettivo generale del nome host è che i computer sulla rete si conoscano e quindi comunichino tra loro.
Allo stesso modo, l'obiettivo principale in questo caso è garantire che i container possano comunicare tra loro con successo all'interno di una rete Docker.
Discuterò due modi per renderlo possibile:
Metodo 1:comunicazione non esplicita
All'interno di una rete Docker, i nomi dei servizi definiti all'interno di un file Docker Compose possono essere utilizzati per verificare se i container possono comunicare tra loro.
Prendi ad esempio la seguente configurazione del proxy inverso:
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
Nota che i due nomi di servizio sono nginx-proxy
e letsencrypt
. È possibile utilizzare questi nomi per verificare se i contenitori possono comunicare tra loro o meno. Questo può rivelarsi molto utile durante le situazioni di risoluzione dei problemi.
Innanzitutto, installa ping all'interno del contenitore Nginx Reverse Proxy:
[email protected]:~/nginx-proxy$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"
Ora puoi utilizzare il comando ping all'interno di questo contenitore per verificare se può comunicare con Let's Encrypt Container (usato per 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
Come puoi vedere sopra, il container proxy inverso "vede" il secondo container SSL che invia una risposta indietro! In nginx-proxy_letsencrypt_1.net
, nginx-proxy_letsencrypt_1
è il nome del contenitore SSL e net
è la nostra rete personalizzata.
Verifichiamolo velocemente:
[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
Per verificare la rete, puoi utilizzare docker network ls
comando.
[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
Metodo 2:comunicazione esplicita
Supponiamo, per qualche motivo, di voler specificare esplicitamente un nome host in un contenitore. Docker Compose ti consente di farlo anche tu!
Usando il hostname
opzione di configurazione, puoi impostare un nome host diverso per qualsiasi servizio definito all'interno di un file Docker Compose, come ho fatto per il servizio Let's Encrypt di seguito:
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
Qui, nota che ho aggiunto esplicitamente hostname: ledocker
all'interno della definizione del servizio Let's Encrypt. Voglio usare ledocker
come nome host per il contenitore SSL.
Ma aspetta, possiamo ricontrollare di nuovo usando il comando 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
Si, certo. Funziona!
Vuoi saperne di più su questo argomento? Dai un'occhiata a questo thread GitHub estremamente informativo.
Spero che questo suggerimento rapido ti sia piaciuto! Puoi lasciare qualsiasi domanda, dubbio o suggerimento nella sezione commenti qui sotto.