Отобразить http запросы от nginx на докер - PullRequest
1 голос
/ 09 мая 2019

У меня есть разные версии моего веб-приложения, работающие в контейнерах Docker.И nginx работает на моей машине.Можно ли получить доступ к требуемой развернутой версии моего веб-приложения с помощью субдомена, такого как v1.myapp.io, v2.myapp.io, без перенастройки и перезапуска nginx?Я также хочу получить доступ к будущим версиям таким же образом?

Может кто-нибудь сказать мне, если есть какой-либо способ достичь этого?

Пожалуйста, сочтите меня новичком в мире Docker / nginx.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Да, хотя это может быть сделано, но его очень трудно достичь только с помощью докера.kubernetes сделает это очень легко, и все, как днс, отображение сервиса предоставляется из коробки.Я включу подходы docker и kubernetes:

Подход Docker: первый черновик будет выглядеть следующим образом, используйте регулярное выражение в nginx server_name и задайте имена контейнеров docker с шаблоном.Создайте запись / etc / hosts для разных контейнеров, например: 172.16.0.1 v1.docker.container 172.16.0.2 v2.docker.container

И сервер nginx conf выглядит так:

server {
    listen 80;

    server_name "~^(?<ns>[a-z]+.+)\.myapp\.io";

    resolver 127.0.0.1:53 valid=30s;

    # make sure $ns.docker.container is resolved to container IP
    set $proxyserver "$ns.docker.container";

    location / {
        try_files $uri @clusterproxy;
    }

    location @clusterproxy {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-IP $clientip;
        proxy_set_header X-Forwarded-For $clientip;
        proxy_set_header X-Real-IP $clientip;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-FORWARDED-PROTO 80;
        proxy_pass http://$proxyserver:80;
    }
}

Подход Kubernetes: создание разных служб и развертываний для разных версий в пространстве имен.Допустим, пространство имен - это «пространство имен приложения».Имена сервисов не требуют пояснений: версия приложения v1: v1-app-service версия приложения v2: v2-app-service

Чтобы сделать nginx более гибким, вы можете добавить имя сервиса в качестве пространства имен в $proxyserver

Правило Nginx:

server {
    listen 80;

    server_name "~^(?<version>[a-z]+.+)\.myapp\.io";

    # you can replace this with kubernetes dns server IP
    resolver 127.0.0.1:53 valid=30s;

    # make sure $ns.docker.container is resolved to container IP
    set $proxyserver "$version.app-namespace.svc.kubernetes";

    location / {
        try_files $uri @clusterproxy;
    }

    location @clusterproxy {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-IP $clientip;
        proxy_set_header X-Forwarded-For $clientip;
        proxy_set_header X-Real-IP $clientip;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-FORWARDED-PROTO 80;
        proxy_pass http://$proxyserver:80;
    }
}
0 голосов
/ 14 мая 2019

Я нашел другое решение этой проблемы после много копания.Это легко сделать с помощью автоматического обратного прокси-сервера Nginx для Docker .Когда-то на моей системе был запущен Docker-контейнер для ngninx.Я развернул два док-контейнера моего веб-приложения (разные версии) с помощью следующей команды:

  1. Docker run -e VIRTUAL_HOST = v1.myapp.io - имя versionOne -d myapp.io:v1
  2. docker run -e VIRTUAL_HOST = v2.myapp.io - имя версииTwo -d myapp.io:v2

, и это сработало для меня.

Дополнительные примечания: 1. Я использую dnsmasq для обработки всех запросов DNS

...