Хоствайте множество поддомейни/приложения на един хост с помощта на Docker
Docker става все по-подходящ за лични среди, особено с частни сървъри, които могат да се мигрират много често.
Програмистът обикновено има повече от едно приложение, живеещо на негов собствен частен сървър, като например блог, някои приложения за разработка като Jenkins, GitLab и т.н. Тези приложения вероятно ще използват стандартния уеб порт 80. Тъй като този порт вече е обвързан с основния ви сайт например, вашите екземпляри на Docker няма да бъдат достъпни през целия този.
Тази публикация ще ви покаже един начин да хоствате множество приложения, като например блог, личен уебсайт и много други, на един хост с помощта на Docker контейнери.
Идеалната архитектура за хостване на множество приложения в рамките на специален сървър би била всяко приложение да бъде изложено на порт 80 през конкретен поддомейн (blog.domain.com, jenkins.domain.com , gitlab.domain.com).
Тези изисквания могат да бъдат постигнати с помощта на прокси (наричан още обратен прокси). Ето диаграма:
Тази класическа архитектура може да се реализира с помощта на Nginx като обратен прокси, но това решение идва с неудобства:
необходимост от писане на конфигурационен файл за всяко приложение/контейнер за презареждане на прокси Nginx всеки път, когато приложение или контейнер се добавят към архитектурата.Nginx-прокси се състои от прост Nginx сървър и докер-ген. Docker-gen е малък инструмент, написан на Go, който може да се използва за генериране на конфигурационни файлове на Nginx/HAProxy с помощта на метаданни на Docker контейнери (получени чрез Docker API).
Тези две приложения се изпълняват като Docker контейнер и така лесно се стартират. Веднъж стартиран, nginx-proxy ще действа като обратен прокси между вашия хост и всичките ви поддомейни (blog.domain.com, jenkins.domain.com и т.н.), като ефективно насочва входящите заявки с помощта на променливата на средата VIRTUAL_HOST (ако е зададена , за всеки Docker контейнер).
За да проксиирате Docker контейнер, вие основно трябва да разкриете порта, който приложенията използват (например 80 за WordPress) и да добавите променливата на средата VIRTUAL_HOST към контейнера:
Използване на docker run команда:docker run -d --expose 80 -e VIRTUAL_HOST=blog.domain.com wordpress
Чрез файла docker-compose.yml:
wordpress:image: wordpresslinks:- db:mysqlexpose:- 80environment:- "VIRTUAL_HOST=blog.domain.com"db:image: mariadbenvironment:MYSQL_ROOT_PASSWORD: примерСледната конфигурация може да бъде представена така:
Както можете да видите по-горе, Nginx-проксито слуша http стандартен порт (80) и препраща входящите заявки към съответния контейнер. По-късно ще видим как се прави това маршрутизиране.
За да стартирате nginx-прокси, въведете следната команда:
shell docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy
Използване на синтаксис на docker-compose:
nginx-proxy:image: jwilder/nginx-proxyports:- "80:80"volumes:- /var/run/docker.sock:/tmp/docker.sockАктуализация: Както Moon предложи в своя коментар, можете добавете част от допълнителна сигурност, за да скриете версията на сървъра на Nginx, като използвате персонализиран конфигурационен файл:
server_tokens off;За да накарате nginx-proxy да използва вашия персонализиран конфигурационен файл на Nginx, стартирайте го с този флаг:
-v /path/to/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro
Както можете да се досетите с последната команда, контейнерът nginx-proxy слуша на порт 80 и има достъп до хост Docker сокета. Чрез предоставяне на сокета на хоста на Docker, контейнерът на nginx-proxy ще може да получава събития на Docker (т.е. създаване на контейнер, изключване и т.н.) и да реагира на тях.
При стартирането си контейнерът nginx-proxy ще търси контейнери с набор от променливи на средата VIRTUAL_HOST и ще създаде подходящ основен конфигурационен файл на Nginx за всеки от тях. Тези конфигурационни файлове ще кажат на Nginx как да препраща входящи заявки към основните контейнери.
След това при всяко стартиране на контейнер nginx-проксито ще получи събитие и ще създаде подходяща Nginx конфигурация, необходима за обслужване на контейнерното приложение и презареждане на Nginx.
Nginx-прокси ще насочва заявки към контейнери според променливата на средата VIRTUAL_HOST на всеки контейнер. Това означава, че ако искате даден контейнер да бъде обслужван с конкретен домейн или поддомейн, трябва да стартирате този с желаната променлива на средата VIRTUAL_HOST.
Ето един пример:
# Стартирайте WordPress (db частта е пропусната за яснота) docker run -d --name blog --expose 80 -e VIRTUAL_HOST=blog.domain.com wordpress# Стартирайте Jenkinsdocker run -d --name jenkinsci --expose 8080 -e VIRTUAL_HOST= jenkins.domain.com -e VIRTUAL_PORT=8080 jenkinsОтново, тук е еквивалентната конфигурация за екземпляра на Jenkins, използвайки синтаксис за съставяне на докер:
jenkins:image: jenkinsexpose:- 8080- 50000environment:- "VIRTUAL_HOST=jenkins.domain.com"- "VIRTUAL_PORT=8080"volumes:- "/your/home:/var/jenkins_home"Забележка: портът, използван от приложението вътре в контейнера трябва да бъде изложено, за да може nginx-proxy да го види. Ако приложението излага множество портове, трябва да кажете на nginx-proxy кой порт да проксира чрез променливата на средата VIRTUAL_PORT.
В този пример nginx-proxy ще препрати всички заявки, съвпадащи с url на blog.domain.com, към контейнера на WordPress. Въпреки това всички заявки, започващи с url jenkins.domain.com, ще бъдат препратени към контейнера на Jenkins.
Този инструмент е наистина прост и дава голяма гъвкавост. Позволява стартирането на множество Docker контейнери в един и същи специален сървър, без да се пише много конфигурация.
Съвет: Насочете контейнер към множество домейни: Често срещано изискване е използването на множество домейни за даден контейнер. За да направите това, просто добавете хостове към променливата VIRTUAL_HOST по следния начин: VIRTUAL_HOST=domain.com,www.domain.com,home.domain.com
Допълнителна документация може да бъде намерена на следния URL адрес: https://github.com/jwilder/nginx-proxy.
PREV: Виртуализация на сървъра - javatpoint
NEXT: 5 предимства и недостатъци на виртуализацията | Недостатъци...