Как настроить порты в 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 шт):
Вариант с использованием 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
и контейнеров докер:
Для 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
Решение оказалось простым. Установка пакета ufw-docker настраивает iptables поверх настроек докера, и блокирует все подключения к докеру из вне по умолчанию, даже если контейнер запущен в 0.0.0.0 (как в случае в docker swarm).