2014-11-08 4 views
9

Я в настоящее время пытается построил мой собственный веб-сервер/службы и хотел создать что-то вроде этого:Nginx в качестве обратного прокси для Docker ВХосты

  • Wordpress для основной «блог»
  • Gitlab для моего Git репозиториев
  • OwnCloud для моего хранения данных

Я использую Docker для получения миленький gitlab ход, который работает прекрасно, отображение в порт: 81 на моем веб-сервере с моим доменом.

Что меня раздражает бит, что Докер изображения всегда связаны с конкретным номер_порта и, таким образом, не очень легко запомнить, так что я хотел бы сделать что-то вроде этого:

git.mydomain.com for gitlab 
mydomain.com (no subdomain) for my blog 
owncloud.mydomain.com for owncloud 

Что касается как я понял, мне нужен обратный прокси для этого, который я решил использовать для nginx. Поэтому я вещи, как это:

http { 
include  mime.types; 
default_type application/octet-stream; 

sendfile  on; 

keepalive_timeout 65; 

server { 
    listen  80; 
    server_name mydomain.com; 
    location/{ 
      proxy_pass http://localhost:84; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 
server { 
    listen 80; 
    server_name git.mydomain.com; 

    location/{ 
     proxy_pass http://localhost:81; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
} 

Таким образом, у меня есть git.mydomain.com и работает безупречно, но мой WordPress просто показывает мне пустой веб-страницы. Мой DNS настроен следующим образом:

Host Type MX Destination 
*  A  IP 
@  A  IP 
www CNAME @ 

Я просто слишком глуп или что здесь происходит?

+0

Выполняете ли вы каждую службу в своем собственном контейнере? Какой контейнер контейнера может работать nginx? Помните, что локальный хост внутри контейнера не является локальным узлом вне контейнера. Либо соедините контейнеры, либо используйте env, чтобы найти IP-адреса или использовать общедоступный IP-адрес хоста. –

+0

Это когда jwilder/nginx-proxy сохраняет ваше здравомыслие и дает вам все, что вам нужно. Прокси-контейнер прослушивает демон Docker и реконфигурирует себя каждый раз, когда на одном и том же хосте запускается другой контейнер веб-приложения. – Devvyn

+0

Возможный дубликат [Присвоение vhosts портам Docker] (http://stackoverflow.com/questions/18497564/assigning-vhosts-to-docker-ports) – Devvyn

ответ

1

Ваша конфигурация nginx выглядит разумно, однако вы попадаете в localhost:xx, что неверно. Он должен быть либо gatewayip:xx, либо лучше target_private_ip:80.

Простой способ справиться с этим состоит в том, чтобы запустить ваши контейнеры с помощью --link и «ввести» ip через скрипт оболочки: иметь «исходную» конфигурацию nginx с помощью заполнителя вместо ip, затем sed -i со значением из окружающей среды.

6

Я знаю, что ваш вопрос более конкретно касается вашей конфигурации прокси-сервера Nginx, но я подумал, что было бы полезно дать вам this link, в котором подробно описывается, как настроить контейнер докеров Nginx, который автоматически развертывает конфигурации для обратного проксирования этих контейнеров-докеров. Другими словами, вы запускаете обратный прокси-сервер, а затем ваши другие контейнеры, а контейнер Nginx направляет трафик другим пользователям на основе имени хоста.

В принципе, вы тянете контейнер-посредник и запускаете его с несколькими параметрами, установленными в команде docker run, а затем вы вызываете другие контейнеры, которые вы хотите проксировать. После того, как вы получили докер установлен и вытащил Nginx прокси изображение, конкретные команды я использую для запуска прокси:

docker run -d --name="nginx-proxy" --restart="always" -p 80:80 \ -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

И теперь прокси-сервер работает. Вы можете проверить, указав браузер по своему адресу, который должен вернуть ошибку Nginx 502 или 503. Вы получите ошибки, потому что пока ничего не слышно. Для запуска других контейнеров, это супер просто, как это:

docker run -d --name="example.com" --restart="always" \ -e "VIRTUAL_HOST=example.com" w3b1x/mywebcontainer

Это -e "VIRTUAL_HOST=example.com" все, что нужно, чтобы получить Nginx трафика прокси-маршрутизации контейнера вы начинаете.

Я использовал этот метод, так как начал с Docker, и это очень удобно для такого рода ситуаций. Связанная мной статья дает вам пошаговые инструкции и всю необходимую информацию. Если вам нужна дополнительная информация (в частности, об использовании SSL в этой настройке), вы можете проверить это the git repository.

+1

Я могу поручиться за это. Использование его в производстве в течение нескольких месяцев, и это буквально дало мне лучшее качество жизни из-за простоты, которую он предлагает, в отличие от ручной переконфигурации прокси для каждого развертывания приложения. – Devvyn

Смежные вопросы