докер запускает nginx в качестве прокси для другого веб-сервера (на pi)

Я как бы в моей голове с моим текущим небольшим проектом. (хотя это не должно быть так сложно)

Я пытаюсь запустить несколько веб-страниц, используя докер на моем Pi (в целях тестирования), которые должны быть доступны с использованием IP-адреса PI.

В настоящее время я запускаю minimL LIGHTTPD: (на основе образа смолы/rpi-raspbian)

docker run -d -v <testconfig>:/etc/lighttpd -p <pi-ip>:8080:80 <image name>

(этот сервер доступен через браузер на pi и на других компьютерах в сети)

Для nginx я запускаю другой контейнер с простой конфигурацией (начиная с http://nginx.org/en/docs/beginners_guide.html), содержащий веб-страницу и изображения для проверки конфигурации контейнера. этот контейнер доступен через <pi-ip>:80

затем я попытался добавить прокси в местоположения: (поигрался, так что теперь есть 3 места для одного и того же редиректа)

location /prox1/{
  proxy_pass http://<pi-ip>:8080
}
location /prox2/{
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://<pi-ip>:8080
}
location /prox3/{
  fastcgi_pass <pi-ip>:8080;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param QUERY_STRING $query_string
}

Версии 1 и 2 выдают ошибку 404 (я пытался добавить перезапись, но затем nginx перенаправил сам себя из-за вырезания /prox1/). Версия 3 дает тайм-аут.

Теперь я не уверен, нужно ли мне еще копать на стороне nginx, или мне нужно добавить соединение на стороне докера между контейнерами.

PS: на Pi работает ArchForArm (используя Xfce в качестве рабочего стола), потому что я не смог найти docker-compose в репозитории Raspberian.

-- РЕДАКТИРОВАТЬ ---: В настоящее время я запускаю все вручную. (поэтому нет файла для создания)

LIGHTTPD запускается командой:

docker run -d --name mylighttpd -v <testconfig>:/etc/lighttpd -p <pi-ip>:8080:80 <image name>

если я правильно понял, теперь он прослушивает в локальной сети (в диапазоне <pi-ip>) порт 8080, который представляет собой порт 80 тестовых веб-серверов. (Я добавил ..name, чтобы его было легче остановить.)

nginx запускается так:

docker run --name mynginx --rm -p <pi-ip>:80:80 -v <config>:/data <image name>

8080 был добавлен в экспозицию в файле Docker.

В настоящее время я думаю, что неправильно понял соединение для двух клиентов на одной машине и должен добавить виртуальную сеть, сейчас я пытаюсь найти там несколько доков.

PS: я не использую уже существующий nginx-zeroconf из репозитория, потому что он говорит мне, что не может прочитать установленную версию докера. (и единственный пример использования этого с композитором также требует другого контейнера, который кажется недоступным для моей архитектуры.)

-- edit2 --: Для простого proxy_pass проблема может заключаться в URL-адресе. Я добавил более глубокую папку prox1 в папку www, содержащую индексный файл, и она отображается, когда я запрашиваю страницу.

Похоже, что <pi-ip>:80/prox1/ перенаправляется на <pi-ip>:8080/prox1/, но если я попытаюсь переписать его (внутри местоположения /prox1/), он сначала удалит prox1, а затем решит, что теперь он является частью исходного местоположения. . <pi-ip>:80/

PS: я знаю, что может быть лучше разместить систему внутри другого соединения, чем через мост, и выставлять только прокси-сервер, но я пытаюсь изучить этот материал небольшими шагами.

-- edit3 --: Попытка написать сейчас, но, кажется, я столкнулся с другой частью, которую я не понимаю (почему я хотел, чтобы она работала без предварительного создания).

Я пытаюсь следовать http://docs.master.dockerproject.org/compose/compose-file/#ipv4-address-ipv6-address

networks:
  backbone:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 172.16.238.0/16
         gateway: 172.16.238.1
services:
  nginx:
    image: <nginx-image>
    ports: 80:80
    volumes:
     - <config>:/data
    depends_on:
     - lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.238.2
 lighttpd:
    image: <lighttpd-image>
    ports: 8080:80
    volumes:
     - <testconfig>:/etc/lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.238.3

Теперь мне нужно выяснить, почему я получаю, что IP-адрес пользователя поддерживается только при подключении к сетям с настроенными пользователем подсетями, я предполагаю, что основной блок сетей создает сеть, называемую магистралью.

-- edit4 --: Кажется, блоки ip должны быть написаны по-разному для всех доков, которые я видел, правильная форма:

...
    networks:
      backbone:
        ipv4_address: 172.16.0.2/16
...

теперь мне нужно выяснить, как удалить часть URL-адреса, и я готов к работе.


person edisn    schedule 09.10.2016    source источник
comment
Все ваши контейнеры находятся в одной сети? Какие есть варианты запуска/где для них docker-compose.yml?   -  person Chris Tanner    schedule 10.10.2016
comment
Если я правильно понял, они оба должны подключаться к локальному. У меня есть некоторые проблемы с пониманием работы с сетью/докером, и с более продвинутыми темами об этом здесь я не понимаю большинство параметров. (я пытаюсь добавить больше моего начала к Вопросу.)   -  person edisn    schedule 10.10.2016
comment
Возможно, вам нужно связать их вместе, я бы порекомендовал взглянуть на docker compose, так как он делает вещи более воспроизводимыми и четко изложенными.   -  person Chris Tanner    schedule 10.10.2016
comment
Что касается части fastcgi, возможно, проблема заключается в связывании. (Они в бридже с другим ip, чем снаружи.)   -  person edisn    schedule 11.10.2016
comment
Я уверен, что для proxy_pass требуется перезапись, но я должен найти правильный флаг для его завершения, поэтому он не пытается переоценить местоположение.   -  person edisn    schedule 11.10.2016
comment
Я взглянул на compose (и запускаю archfoarm, потому что не смог найти пакет для raspberian). После того, как мои готовые тесты потерпели неудачу, я захотел изучить функции снизу вверх.   -  person edisn    schedule 11.10.2016


Ответы (1)


Основная проблема, по-видимому, заключалась в отсутствии параметра nginx proxy_redirect, который я нашел в доках, текущий nginx.conf: (/data/www содержит index.html с относительной ссылкой на некоторые изображения в /данные/изображения)

worker_processes auto;
events {
  worker_connections 1024;
}
http {
  server {
    listen 80;
    location / {
      root /data/www;
    }
    location /images/ {
      root /data;
    }
    location /prox0/{
      proxy_pass http://lighttpd:80;
      proxy_redirect default;
      proxy_buffering off;
    }
  }
}

ручной запуск на локальном IP-адресе, кажется, работает, но docker-compose проще: (если compose не используется, замените lighttpd:80 на IP-адрес и порт, используемые для запуска сервера.)

networks:
  backbone:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 172.16.238.0/16
         gateway: 172.16.238.1
services:
  nginx:
    image: <nginx-image>
    ports: 80:80
    volumes:
     - <config>:/data
    depends_on:
     - lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.0.2
 lighttpd:
    image: <lighttpd-image>
    ports: 8080:80
    volumes:
     - <testconfig>:/etc/lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.0.3
person edisn    schedule 12.10.2016