Добавить в корзинуПозвонить
Найти в Дзене

Как запустить несколько доменов на одном IP, привязав их к разным Docker-контейнерам

Когда на сервере есть только один IP-адрес, но нужно обслуживать несколько доменов, направленных на разные приложения (контейнеры Docker), на помощь приходит reverse proxy. Это мощный инструмент, который позволяет перенаправлять запросы на соответствующие контейнеры в зависимости от домена. Рассмотрим, как это сделать с использованием NGINX или Traefik. У вас есть сервер с IP-адресом, например, 192.168.0.1, и два домена: Каждое приложение должно быть доступно через соответствующий домен. Убедитесь, что оба домена настроены в DNS с A-записью, указывающей на ваш сервер: ДоменТипЗначениеexample1.comA192.168.0.1example2.comA192.168.0.1 Создайте Docker Compose файл для каждого приложения: version: '3.9'
services:
app1:
image: your-app1-image
container_name: app1
ports:
- "8001:80" version: '3.9'
services:
app2:
image: your-app2-image
container_name: app2
ports:
- "8002:80" Запустите оба контейнера: docker-compose -f docker-compose-app1.yml up -d
docke
Оглавление

Когда на сервере есть только один IP-адрес, но нужно обслуживать несколько доменов, направленных на разные приложения (контейнеры Docker), на помощь приходит reverse proxy. Это мощный инструмент, который позволяет перенаправлять запросы на соответствующие контейнеры в зависимости от домена. Рассмотрим, как это сделать с использованием NGINX или Traefik.

Задача

У вас есть сервер с IP-адресом, например, 192.168.0.1, и два домена:

  • example1.com — привязан к приложению в контейнере app1.
  • example2.com — привязан к приложению в контейнере app2.

Каждое приложение должно быть доступно через соответствующий домен.

Решение

1. Настройка DNS

Убедитесь, что оба домена настроены в DNS с A-записью, указывающей на ваш сервер:

ДоменТипЗначениеexample1.comA192.168.0.1example2.comA192.168.0.1

2. Настройка Docker-контейнеров

Создайте Docker Compose файл для каждого приложения:

App1 (docker-compose-app1.yml):

version: '3.9'
services:
app1:
image: your-app1-image
container_name: app1
ports:
- "8001:80"

App2 (docker-compose-app2.yml):

version: '3.9'
services:
app2:
image: your-app2-image
container_name: app2
ports:
- "8002:80"

Запустите оба контейнера:

docker-compose -f docker-compose-app1.yml up -d
docker-compose -f docker-compose-app2.yml up -d

Проверьте доступность:

  • http://192.168.0.1:8001 — приложение app1.
  • http://192.168.0.1:8002 — приложение app2.

3. Настройка Reverse Proxy с NGINX

Установка NGINX

sudo apt update
sudo apt install nginx

Конфигурация NGINX

Создайте конфигурацию для каждого домена:

Файл /etc/nginx/sites-available/example1.com:

server {
server_name example1.com;

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

Файл /etc/nginx/sites-available/example2.com:

server {
server_name example2.com;

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

Активация конфигураций

sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Теперь:

  • example1.com отправляет запросы на контейнер app1.
  • example2.com отправляет запросы на контейнер app2.

4. Альтернатива: Используем Traefik

Если вы хотите минимизировать ручную настройку, используйте Traefik. Это современный reverse proxy с автоматическим обнаружением сервисов.

Пример настройки контейнера с Traefik:

labels:
- "traefik.enable=true"
- "traefik.http.routers.app1.rule=Host(`example1.com`)"
- "traefik.http.services.app1.loadbalancer.server.port=80"

Итог

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

NGINX подойдет для статичных приложений. Traefik удобен для часто обновляемых проектов. Выбирайте то, что подходит вашему проекту! 🚀