Sie fragen sich, wie Sie den Hostnamen in Docker Compose festlegen? Das zeige ich dir.
Sie können es unter dem Dienst wie folgt definieren:
...
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
hostname: ledocker
...
Aber braucht man das wirklich? Das allgemeine Ziel des Hostnamens ist, dass Computer im Netzwerk einander kennen und somit untereinander kommunizieren.
Ebenso geht es hier vor allem darum sicherzustellen, dass Container innerhalb eines Docker-Netzwerks erfolgreich miteinander kommunizieren können.
Ich werde zwei Möglichkeiten diskutieren, wie dies möglich gemacht werden kann:
Methode 1:Nicht-explizite Kommunikation
Innerhalb eines Docker-Netzwerks können Dienstnamen, die in einer Docker-Compose-Datei definiert sind, verwendet werden, um zu testen, ob Container miteinander kommunizieren können.
Nehmen Sie zum Beispiel die folgende Reverse-Proxy-Konfiguration:
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
Beachten Sie, dass die beiden Dienstnamen nginx-proxy
sind und letsencrypt
. Mit diesen Namen können Sie testen, ob Container miteinander kommunizieren können oder nicht. Dies kann bei der Fehlersuche sehr hilfreich sein.
Installieren Sie zuerst ping im Nginx Reverse Proxy-Container:
[email protected]:~/nginx-proxy$ docker-compose exec nginx-proxy bash -c "apt update && apt install -y iputils-ping"
Jetzt können Sie den Ping-Befehl innerhalb dieses Containers verwenden, um zu prüfen, ob er mit dem Let's Encrypt-Container (verwendet für SSL) kommunizieren kann.
[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
Wie Sie oben sehen können, „sieht“ der Reverse-Proxy-Container den zweiten SSL-Container, der eine Antwort zurücksendet! In nginx-proxy_letsencrypt_1.net
, nginx-proxy_letsencrypt_1
ist der Name des SSL-Containers und net
ist unser benutzerdefiniertes Netzwerk.
Lassen Sie es uns schnell überprüfen:
[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
Um das Netzwerk zu überprüfen, können Sie das docker network ls
verwenden Befehl.
[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
Methode 2:Explizite Kommunikation
Angenommen, Sie möchten aus irgendeinem Grund explizit einen Hostnamen für einen Container angeben. Mit Docker Compose können Sie das auch!
Unter Verwendung des hostname
Konfigurationsoption können Sie jedem Dienst, der in einer Docker-Compose-Datei definiert ist, einen anderen Hostnamen zuweisen, wie ich es unten für den Let's Encrypt-Dienst getan habe:
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
Beachten Sie hier, dass ich ausdrücklich hostname: ledocker
hinzugefügt habe innerhalb der Dienstdefinition von Let's Encrypt. Ich möchte ledocker
verwenden als Hostname für den SSL-Container.
Aber warten Sie, können wir es mit dem Ping-Befehl noch einmal überprüfen?
[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
In der Tat, ja. Es funktioniert!
Hungrig nach mehr Wissen in dieser Hinsicht? Sehen Sie sich diesen äußerst informativen GitHub-Thread an.
Ich hoffe, Ihnen hat dieser schnelle Tipp gefallen! Sie können Fragen, Zweifel oder Vorschläge im Kommentarbereich unten hinterlassen.