Как использовать NGINX обратный прокси вне Docker для proxy_pass в Docker контейнеры - PullRequest
0 голосов
/ 15 октября 2018

У меня NGINX работает на сервере CentOS, и я хотел бы proxy_pass для запуска докеров-контейнеров, работающих на одном хосте.

При использовании proxy_pass с IP-адресом контейнера это работает, однако, если компьютер иногда перезагружаетсяIP-адрес контейнера изменяется, и необходимо вручную отредактировать файл nginx.conf, чтобы повторно указать новый ip контейнера.Я знаю, что NGINX можно настроить внутри собственного док-контейнера и связать с другими работающими контейнерами, но это займет много времени для настройки и тестирования.

Есть ли способ каким-либо образом использовать имя контейнера или другой идентификатор, который не изменяется непосредственно в NGINX хоста?

1 Ответ

0 голосов
/ 15 октября 2018

Я знаю, что NGINX можно настроить внутри собственного док-контейнера и связать с другими работающими контейнерами, но это займет много времени для настройки и тестирования.

Краткий ответ

Если вы не хотите запускать nginx в своем собственном контейнере, вы можете создать докерскую сеть с фиксированным диапазоном IP-адресов:

docker network create --driver=bridge --subnet=192.168.100.0/24 nginx.docker

И запустить свой контейнер с фиксированным IP

docker run --net nginx.docker --ip 192.168.100.1 ...

См. Docker Network Create и Назначение статического IP-адреса для контейнера Docker

Длинный ответ

Но я все равно предложил бы запуститьТакже nginx в контейнере, тогда Docker позаботится о разрешении DNS и маршрутизации.Это на самом деле быстро сделано и довольно просто.Вы можете либо определить все службы в одном docker-compose.yml и убедиться, что они все совместно используют одну сеть, либо:

  1. Создать сеть Docker с помощью docker network create nginx.docker
  2. Добавить сеть вdocker-compose.yml файлов ваших услуг
  3. Настройте nginx.conf

Например:

nginx

docker-compose.yml из nginx

services:
nginx:
  image: nginx:alpine
  container_name: nginx
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - type: bind
      source: ./nginx.conf
      target: /etc/nginx/nginx.conf
  networks:
    - nginx.docker

networks:
  nginx.docker:
    name: nginx.docker
    external: true

Обратите внимание, что "80:80" будет привязан ко всем интерфейсам, используйте IP-адрес интерфейса, например, "192.168.0.1:80:80" для привязки только к одному конкретному интерфейсу.

Ваш сервисный контейнер

docker-compose.yml

services:
my_service:
  image: image_name
  container_name: myservice
  networks:
    - nginx.docker

networks:
  nginx.docker:
    name: nginx.docker
    external: true

nginx config

В разделе сервера вашего nginx.conf:

server {
listen 443 ssl;
server_name your.server.name;

# Docker DNS
resolver 127.0.0.11;
set $upstream_server http://myservice:8080;          # or myservice.nginx.docker

  location  / {
     proxy_pass $upstream_server;

     # further proxy config ...
  }
}

Обратите внимание на resolver 127.0.0.11, явно говорящийnginx использовать докер DNS.Не уверен, что это все еще нужно, но у меня были проблемы раньше, когда я его не использовал.

...