Как настроить порты в Docker Swarm

У меня есть docker-compose файл, который я использую для запуска Docker Swarm

version: '3.8'
services:
frontend:
image: image:tag
deploy:
    replicas: 3
ports:
  - 127.0.0.1:8080:8080

Но при запуске docker stack deploy он выдает ошибку адреса 127.0.0.1 и запускается на 0.0.0.0 Но меня такой вариант не устраивает, потому что в таком случае подключится к контейнеру можно извне минуя nginx Настраивать iptables пытался, но Docker своими настройками в нём всё равно пропускает подключения Подскажите, какой вариант есть сделать подключение к контейнеру исключительно локальным ? И раз docker swarm заставляет делать такие костыли, проще ли будет с K8s ? p.s. я не девопс, и в делах девопсерских слабо соображаю, поэтому скорее всего чего-то не понимаю.


Ответы (2 шт):

Автор решения: tiovi

Вариант с использованием nginx:

Для начала устанавливаем его, запускаем и активируем.

sudo yum install nginx

sudo systemctl sttart nginx

sudo systemctl enable nginx

Ну, с установкой покончено, перейдем к настройке обратного прокси

Тебе нужен файл с расширением .conf, предлагаю его создавать следующим образом:

sudo nano /etc/nginx/conf.d/имя.conf

Далее в него же добавляем конфигурацию для прослушки определенного адреса:

server {
    listen 127.0.0.1:8080;

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

Думаю, у вас уже есть контейнер, но если нет, то вот:

mkdir название директории
cd назване директории

Далее создаем файл с необходимыми зависимостями, если о нужен и создаем докерфайл, делаем докер образ.

docker build -t название файла

Всё просто, теперь запускаем контейнер:

docker run -d -p адрес:5000:5000 --name имя_файла имя_файла

Вот список полезных ссылок, которые точно помогут еще более детально разобраться в настройке nginx и контейнеров докер:

nginx reverse proxy

docker nginx docs

Для Docker Swarm:

Делаем все те же действия, что я описал выше.

Устанавливаем firewalld и добавляем докер в zone=trusted:

sudo firewall-cmd --zone=trusted --add-interface=docker0 --permanent
sudo firewall-cmd --reload

Дальше блокаем доступ к порту 8080 только с локалки:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port port=8080 protocol=tcp accept' --permanent
sudo firewall-cmd --reload
→ Ссылка
Автор решения: Dalys

Решение оказалось простым. Установка пакета ufw-docker настраивает iptables поверх настроек докера, и блокирует все подключения к докеру из вне по умолчанию, даже если контейнер запущен в 0.0.0.0 (как в случае в docker swarm).

→ Ссылка