В современном мире контейнеров Docker стал популярным решением для развертывания и управления приложениями.
Одним из распространенных вариантов использования является перенаправление сетевого трафика с определенного порта на хост-машине на порт внутри контейнера Docker.
Это может быть особенно полезно, когда необходимо открыть внешний доступ к службе, работающей внутри контейнера, или настроить обратный прокси-сервер для балансировки нагрузки.
В этой статье мы рассмотрим шаги, необходимые для перенаправления порта в контейнер Docker с помощью iptables, мощной и гибкой утилиты межсетевого экрана, доступной в большинстве дистрибутивов Linux.
Продолжение статьи по взаимодействию Docker и UFW
Шаг 1: Определите IP-адрес контейнера Docker
Выполните следующую команду, чтобы узнать IP-адрес контейнера Docker:
Замените имя или ID вашего контейнера.
Запишите IP-адрес, отображаемый в выходных данных.
Шаг 2: Перенаправление портов на контейнеры Docker
Использование Iptables
Чтобы перенаправить порт в контейнер Docker с помощью iptables, выполните следующие действия:
Добавьте правила iptables для переадресации: Теперь настройте правила iptables для перенаправления нужного порта в контейнер Docker.
Замените <HOST_PORT> номером порта на хост-машине, <CONTAINER_IP> IP-адресом вашего контейнера, а <CONTAINER_PORT> – номером порта внутри контейнера.
Например, если необходимо перенаправить порт 8080 с хост-машины на порт 80 контейнера Docker, имеющего IP-адрес 172.21.0.7, то необходимо выполнить указанные команды:
Сохраните правила iptables: Для того чтобы правила iptables сохранялись при перезагрузке, их можно сохранить с помощью команды iptables-save:
Обратите внимание, что путь к файлу правил может отличаться в зависимости от дистрибутива Linux.
Сделайте правила iptables постоянными: Если вы используете дистрибутив на базе Debian/Ubuntu, вы можете установить пакет iptables-persistent, чтобы правила сохранялись при перезагрузке:
Использование firewall-cmd
Чтобы перенаправить порт в контейнер Docker с помощью firewall-cmd, входящего в состав утилиты firewalld в системах на базе RHEL/CentOS/Fedora, выполните следующие действия:
Добавьте правила firewall-cmd для переадресации: Теперь настройте правила firewall-cmd для перенаправления нужного порта в ваш Docker-контейнер.
Замените <HOST_PORT> номером порта на хост-машине, <CONTAINER_IP> – IP-адресом вашего контейнера, а <CONTAINER_PORT> – номером порта внутри контейнера.
Сначала включите маскарад в зоне active:
Далее создайте правило переадресации портов:
Например, чтобы перенаправить порт 8080 на хост-машине на порт 80 контейнера Docker с IP-адресом 172.17.0.7, нужно выполнить следующую команду:
Перезагрузите правила межсетевого экрана:
После добавления правил необходимо перезагрузить конфигурацию firewalld, чтобы изменения вступили в силу:
Теперь проброс портов должен работать, и любой трафик, приходящий на <HOST_PORT> на хост-машине, будет перенаправляться на <CONTAINER_PORT> в контейнере Docker.
Заключение
В заключение следует отметить, что перенаправление порта на контейнер Docker с помощью iptables – это простой процесс, который включает в себя определение IP-адреса контейнера, добавление необходимых правил iptables и обеспечение сохранения правил при перезагрузке.
Выполнив описанные в этой статье действия, можно добиться того, что трафик, отправляемый на определенный порт хост-машины, будет перенаправлен на соответствующий порт контейнера.
Такой подход позволяет открывать сервисы, работающие внутри контейнеров, устанавливать обратные прокси-серверы, реализовывать балансировку нагрузки и т.д., повышая гибкость и эффективность контейнерной инфраструктуры.
см. также:
- 🐳 Использование if-else в Dockerfile
- 🐳 Как проверить, работает ли ваше приложение в Docker или Kubernetes
- 🐳 Разница между ENTRYPOINT и CMD в Dockerfile
- 🐳 Как перезапустить службу docker, не затрагивая запущенные контейнеры
- 🐳 Как проверить версию Docker приложения
- 🐳 Docker system prune: Подробное руководство по удалению неиспользуемых объектов
- 🐳 Остановка и удаление всех Docker-контейнеров
Ну сначала все заработало, а через какое-то время остался снаружи только ssh, который был настроен до установки iptables и наружу ping, да и тот только по ip…