Мои веб-сайты работают в контейнерах докеров, как реализовать виртуальный хост?

Я запускаю два веб-сайта в двух контейнерах докеров, соответственно, в 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