¿Se pregunta cómo configurar el nombre de host en Docker Compose? Te mostraré eso.
Puede definirlo en el servicio de esta manera:
...
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
hostname: ledocker
...
¿Pero realmente necesitas eso? El objetivo general del nombre de host es que las computadoras en la red se conozcan entre sí y, por lo tanto, se comuniquen entre sí.
De manera similar, el objetivo principal aquí es garantizar que los contenedores puedan comunicarse entre sí con éxito dentro de una red Docker.
Voy a discutir dos formas de hacer esto posible:
Método 1:Comunicación no explícita
Dentro de una red Docker, los nombres de servicio definidos dentro de un archivo Docker Compose se pueden usar para probar si los contenedores pueden comunicarse entre sí.
Tomemos, por ejemplo, la siguiente configuración de 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
Tenga en cuenta que los dos nombres de servicio son nginx-proxy
y letsencrypt
. Puede usar estos nombres para probar si los contenedores pueden comunicarse entre sí o no. Esto puede ser muy útil durante situaciones de resolución de problemas.
Primero, instale ping dentro del contenedor de Nginx Reverse Proxy:
[email protected]:~/nginx-proxy$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"
Ahora, puede usar el comando ping dentro de este contenedor para verificar si puede comunicarse con el contenedor Let's Encrypt (usado para 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
Como puede ver arriba, el contenedor de proxy inverso "ve" el segundo contenedor SSL que envía una respuesta. En nginx-proxy_letsencrypt_1.net
, nginx-proxy_letsencrypt_1
es el nombre del contenedor SSL y net
es nuestra red personalizada.
Verifiquemos rápidamente:
[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
Para verificar la red, puede usar 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
Método 2:Comunicación Explícita
Digamos que, por algún motivo, desea especificar explícitamente un nombre de host para un contenedor. ¡Docker Compose te permite hacer eso también!
Usando el hostname
opción de configuración, puede establecer un nombre de host diferente para cualquier servicio definido dentro de un archivo Docker Compose, como lo he hecho para el servicio Let's Encrypt a continuación:
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
Aquí, tenga en cuenta que agregué explícitamente hostname: ledocker
dentro de la definición del servicio Let's Encrypt. Quiero usar ledocker
como nombre de host para el contenedor SSL.
Pero espera, ¿podemos volver a verificar usando el 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
De hecho si. ¡Funciona!
Hambre de más conocimiento en este sentido? Echa un vistazo a este hilo de GitHub extremadamente informativo.
¡Espero que hayas disfrutado este consejo rápido! Puedes dejar cualquier consulta, duda o sugerencia en la sección de comentarios a continuación.