Мои веб-сайты работают в контейнерах докеров, как реализовать виртуальный хост?
Я запускаю два веб-сайта в двух контейнерах докеров, соответственно, в vps.
например www.myblog.com и www.mybusiness.com
Как я могу реализовать virtualhost в vps, чтобы оба сайта могли использовать порт 80.
Я задал этот вопрос где-то еще, и мне было предложено взглянуть на: https://github.com/hipache/hipache и https://www.tutum.co/
Они выглядят немного изогнутыми. Я пытаюсь найти, если есть простой способ достичь этого. Спасибо!
Кроме того, забыл упомянуть, что мой vps - это поле Ubuntu 14.04.
Ответы
Ответ 1
Взгляните на проект jwilder/nginx-proxy.
Автоматизированный прокси nginx для контейнеров Docker с использованием docker-gen
Это самый простой способ проксировать ваши контейнеры докеров. Вам не нужно редактировать файл конфигурации прокси каждый раз, когда вы перезапускаете контейнер или запускаете новый. Все происходит автоматически для вас docker-gen, который генерирует обратные прокси-конфигурации для nginx и перезагружает nginx, когда контейнеры запускаются и останавливаются.
Использование
Чтобы запустить его:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock \
jwilder/nginx-proxy
Затем запустите все контейнеры, которые вы хотите проксировать с помощью env var VIRTUAL_HOST = subdomain.youdomain.com
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
При условии, что ваш DNS настроен для перенаправления foo.bar.com на хост, на котором запущен nginx-прокси, запрос будет перенаправлен в контейнер с набором VvTUAL_HOST env var.
Несколько портов
Если ваш контейнер предоставляет несколько портов, nginx-proxy будет по умолчанию использоваться службой, запущенной на порту 80. Если вам нужно указать другой порт, вы можете установить VARTUAL_PORT env var, чтобы выбрать другой. Если ваш контейнер предоставляет только один порт и у него есть VIRTUAL_HOST env var set, этот порт будет выбран.
Ответ 2
Вам нужен обратный прокси. Мы используем nginx и haproxy. Оба они работают хорошо, и их легко запустить из контейнера докеров. Хорошим способом запуска всей установки было бы использовать docker-compose (ранее fig) для создания двух контейнеров веб-сайтов без видимых внешних портов и использования, скажем, контейнера haproxy со ссылками на оба контейнера веб-сайта. Затем вся комбинация предоставляет ровно один порт (80) в сеть, а контейнер haproxy пересылает трафик в тот или иной контейнер на основе имени хоста запроса.
---
proxy:
build: proxy
ports:
- "80:80"
links:
- blog
- work
blog:
build: blog
work:
build: work
Затем конфигурация haproxy, такая как
global
log 127.0.0.1 local0
maxconn 2000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
option dontlognull
option redispatch
retries 3
timeout connect 5000s
timeout client 1200000s
timeout server 1200000s
### HTTP frontend
frontend http_proxy
mode http
bind *:80
option forwardfor except 127.0.0.0/8
option httplog
option http-server-close
acl blog_url hdr_beg(host) myblog
use_backend blog if blog_url
acl work_url hdr_beg(host) mybusiness
use_backend work if work_url
### HTTP backends
backend blog
mode http
server blog1 blog:80 check
backend work
mode http
server work1 work:80 check