
아래 docker compose.yml을 사용하여 2개의 컨테이너와 역방향 프록시 컨테이너를 만들고 있습니다.
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
또한 SSL 인증서 및 키를 생성하는 데 conf/nginx.conf
에도 사용됩니다 .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;
}
}
}
VirtualHost 요청을 대상 컨테이너로 프록시하는 곳입니다.
또한 hosts
로컬에서 해결하기 위해 아래 파일을 추가했습니다. 잘 작동합니다... 127.0.0.1로 확인되고 Nginx로 이동하여 대상 컨테이너로 이동합니다.
127.0.0.1 preview.ssgtm.dev
::1 preview.ssgtm.dev
127.0.0.1 ssgtm.dev
::1 ssgtm.dev
내가 직면한 문제는... 두 컨테이너 앱 내부에서 443 포트가 있는 도메인 IP에 대한 TCP를 요청한다는 것입니다. 따라서 ssgtm.dev:443에 요청하면 127.0.0.1:443이 되고 오류를 반환합니다. Message: connect ECONNREFUSED 127.0.0.1:443
그리고 저는 이 오류를 이해할 수 없습니다. 내가 이해하는 한 포트 443을 사용하여 127.0.0.1에 연결할 수 없지만 이를 추가했습니다! 내가 뭘 잘못하고 있는 걸까요?
답변1
컨테이너는 자체 네트워크 네임스페이스의 로컬 호스트에 연결하려고 하기 때문에 Nginx에 연결할 수 없습니다. name host.docker.internal
호스트에서 사용하는 내부 IP 주소를 확인하는 특수 DNS를 사용해 볼 수 있습니다.
또는 nginx.conf
에 요청하는 대신 에 요청하도록 파일을 수정하세요 .ssgtm.dev:443
127.0.0.1:443
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;
}
}