
Mithilfe der folgenden Docker-Compose.yml erstelle ich zwei Container und einen Reverse-Proxy-Container.
version: '3'
services:
# SSGTM Tag Server Container
tagging_server_container:
image: gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable
ports:
- '8080:8080'
restart: always
environment:
PREVIEW_SERVER_URL: https://preview.ssgtm.dev
CONTAINER_CONFIG: aWQ9...
networks:
- ssgtm
# SSGTM Preview Server Container
preview_server_container:
image: gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable
ports:
- '8081:8080'
restart: always
environment:
RUN_AS_PREVIEW_SERVER: true
CONTAINER_CONFIG: aWQ9...
networks:
- ssgtm
proxy:
image: nginx:1.19.10-alpine
ports:
- 80:80
- 443:443
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./certs:/etc/nginx/certs
depends_on:
- preview_server_container
- tagging_server_container
networks:
- ssgtm
networks:
ssgtm:
driver: bridge
Und wird auch intern zum Erstellen von SSL-Zertifikaten und -Schlüsseln conf/nginx.conf
verwendet .mkcert -cert-file ssgtm.dev.crt -key-file ssgtm.dev.key ssgtm.dev "*.ssgtm.dev" localhost 127.0.0.1 ::1
events {
worker_connections 1024;
}
http {
upstream docker-tagging-server {
server tagging_server_container:8080;
}
upstream docker-preview-server {
server preview_server_container:8080;
}
server {
listen 443 ssl;
server_name 127.0.0.1;
ssl_certificate /etc/nginx/certs/cert.crt;
ssl_certificate_key /etc/nginx/certs/cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_buffering off;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://docker-preview-server;
}
}
server {
listen 443 ssl;
server_name ssgtm.dev;
ssl_certificate /etc/nginx/certs/cert.crt;
ssl_certificate_key /etc/nginx/certs/cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_buffering off;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://docker-tagging-server;
}
}
server {
listen 443 ssl;
server_name preview.ssgtm.dev;
ssl_certificate /etc/nginx/certs/cert.crt;
ssl_certificate_key /etc/nginx/certs/cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_buffering off;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://docker-preview-server;
}
}
}
Wo ich meine VirtualHost-Anfragen per Proxy an den Zielcontainer weiterleite.
Auch in hosts
der Datei, die ich unten hinzugefügt habe, um sie lokal aufzulösen. Das funktioniert prima ... Es wird in 127.0.0.1 aufgelöst und geht zu Nginx und zu ihrem Zielcontainer.
127.0.0.1 preview.ssgtm.dev
::1 preview.ssgtm.dev
127.0.0.1 ssgtm.dev
::1 ssgtm.dev
Das Problem, mit dem ich konfrontiert bin, ist, dass in beiden Container-Apps ein TCP an eine Domänen-IP mit Port 443 angefordert wird. Wenn also eine Anforderung an ssgtm.dev:443 erfolgt, wird daraus 127.0.0.1:443 und es wird ein Fehler zurückgegeben Message: connect ECONNREFUSED 127.0.0.1:443
. Ich kann diesen Fehler nicht verstehen. Soweit ich weiß, kann keine Verbindung zu 127.0.0.1 mit Port 443 hergestellt werden, aber ich habe das hinzugefügt! Was mache ich falsch?
Antwort1
Die Container können Nginx nicht erreichen, da sie versuchen, eine Verbindung zum lokalen Host ihres eigenen Netzwerk-Namespaces herzustellen. Wir könnten es mit dem speziellen DNS versuchen, name host.docker.internal
das die vom Host verwendete interne IP-Adresse auflöst.
Ändern Sie Ihre nginx.conf
Datei so, dass sie statt Anfragen an ssgtm.dev:443
oder 127.0.0.1:443
Anfragen an stellt host.docker.internal:443
.
server {
listen 443 ssl;
server_name host.docker.internal;
ssl_certificate /etc/nginx/certs/cert.crt;
ssl_certificate_key /etc/nginx/certs/cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_buffering off;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://docker-preview-server;
}
}