Jak udostępnić port jedynie dla bridge network, nie udostępniając go dla hosta?

0

Mam tu pewien problem nad którym siedzę od wczoraj - mam utworzoną sieć wewnętrzną dla kontenerów dockera w ramach której działa aplikacja napisana w Go oraz serwer http nginx. O ile za pomocą ports: 8080:8080 udało mi się sprawić, że serwer będzie wystawiony na zewnątrz to chciałbym aby serwer ten nie był wystawiony bezpośrednio na zewnątrz tylko poprzez nginx. Dopóki udostępniam port na zewnątrz aplikacja działa (tzn nginx zauważa ją i przekierowuje tam ruch ze swoich portów 80 i 443). Gdy próbuję schować kontener w bridge network okazuje się już że nginx nie widzi aplikacji. Załączam mój plik docker-compose.yml (zakomentowałem problematyczną sekcję która sprawia że kontener jest widoczny, ale także na zewnątrz)

version: '3'

networks:
  backend:
    name: backend

services:
  golang-baseapp:
    container_name: go
    build:
      dockerfile: Dockerfile
      context: .
#    ports:
#      - 8080:8080
    tty: true
    volumes:
      - ./certbot/conf/:$HOME/certbot/conf/:ro
    networks:
      - backend
  nginx-webserver:
    container_name: web
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx/conf/:/etc/nginx/conf.d/:ro
      - ./certbot/www:/var/www/certbot/:ro
      - ./certbot/conf/:/etc/nginx/ssl/:ro
    networks:
      - backend
2

Jak rozumiem, chcesz tutaj zastosować reverse proxy, żeby kontener nginx-webserver wystawiony na świat ukrywał kontener golang-baseapp, którego rezultaty ma zobaczyć użytkownik?

Spodziewany diagram

0

Pokaż jeszcze plik nginx.conf jak masz tam coś skonfigurowane

0

A dlaczego miałby ją widzieć przy takiej konfiguracji? musiałbyś się raczej po IP odwoływać. Chcesz to prosto ogarnąć, to postaw przed tym router z natem, udostępnij przekierowanie jednego portu, tego dla nginxa, ewentualnie jakieś reguły dodatkowe i tyle w zasadzie by rozwiązywało sprawę. Mało napisałeś o swojej sieci, więc to trochę takie zgadywanie.

0
Ferdynand Lipski napisał(a):

Jak rozumiem, chcesz tutaj zastosować reverse proxy, żeby kontener nginx-webserver wystawiony na świat ukrywał kontener golang-baseapp, którego rezultaty ma zobaczyć użytkownik?

Dokładnie!

0

@jurek1980:

server {
    listen 80;
    listen [::]:80;

    server_name mojadomena.pl www.mojadomena.pl;
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        proxy_pass http://mojadomena.pl:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

server {
    listen 443 default_server ssl http2;
    listen [::]:443 ssl http2;

    server_name mojadomena.pl;

    ssl_certificate /etc/nginx/ssl/live/mojadomena.pl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/mojadomena.pl/privkey.pem;

    location / {
        proxy_pass http://mojadomena.pl:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
1

Powinno być proxy_pass golang-baseapp:8080;

Albo nawet jakieś

upstream goapp {
  server golang-baseapp:8080;
}

location {
  proxy_pass http://goapp;
}
0

dzięki @tumor udało mi się znaleźć rozwiązanie

upstream goapp {
  server golang-baseapp:8080;
}

server {
    listen 80;
    listen [::]:80;

    location / {
        proxy_pass http://goapp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

server {
    listen 443 default_server ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate /etc/nginx/ssl/live/filmbox-test.pl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/filmbox-test.pl/privkey.pem;

    location / {
        proxy_pass http://goapp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
0

To jeszcze zastanów się czy nie skonfigurować sobie "redirecta" z http na https, żebyś miał zawsze komunikację szyfrowaną.

1

Tak poza głównym pytaniem, z czystej ciekawości, czego spodziewasz się w nagłówkach i dlaczego?

 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Jak nie masz jakiejś dodatkowej warstwy przed kontenerami, to dość prawdopodobne, że będziesz miał tam dane hosta, a nie klienta, który do hosta się odwołuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1