В процессе эксплуатации и обслуживания вы можете столкнуться с такой проблемой, то есть когда Docker-контейнер уже запущен, я надеюсь, что программы вне хоста, например клиент базы данных, смогут подключиться к порту внутри контейнера, например базы данных. порт.
В принципе, после запуска Docker-контейнера вы не можете напрямую изменить конфигурацию контейнера, чтобы добавить новый порт. Сопоставление портов контейнера Docker задается с помощью параметра -p или --publish при запуске контейнера. После установки и запуска контейнера эти параметры фиксируются.
Однако, если вам нужно предоставить новый порт внешнему миру в уже работающем контейнере, вы можете попробовать несколько косвенных методов:
Вот конкретный метод метода 2: как использовать iptables на хосте для установки правил переадресации портов для перенаправления внешних запросов на порт контейнера Docker.
Основные шаги:
1. Убедитесь, что переадресация IP включена. Чтобы разрешить iptables выполнять переадресацию портов, вам необходимо подтвердить, что хост включил функцию переадресации IP. Посмотреть и открыть его можно следующими командами:
Проверьте, включена ли переадресация IP:
sysctl net.ipv4.ip_forward
Если результат равен 0, это означает, что функция IP-переадресации не включена. Временно включить IP-переадресацию можно с помощью следующей команды:
sudo sysctl -w net.ipv4.ip_forward=1
Чтобы навсегда включить пересылку IP, установите net.ipv4.ip_forward=1 в файле /etc/sysctl.conf и перезагрузите конфигурацию:
sudo sysctl -p /etc/sysctl.conf
2. Установите правила переадресации NAT. Используйте команду iptables, чтобы установить правила переадресации NAT и перенаправить порт хоста на порт контейнера. Ниже приведен пример команды iptables:
sudo iptables -t nat -A PREROUTING -p tcp --dport < хост-порт > -j DNAT --to-destination < контейнер IP>:< контейнерпорт >
Например, если вы хотите перенаправить порт 8080 хоста на порт 80 контейнера, а IP-адрес контейнера — 172.17.0.2, вы можете использовать следующую команду:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
3. Установите правила фильтрации. Чтобы обеспечить правильную обработку пересылаемых пакетов данных, вам также может потребоваться добавить правило, разрешающее пересылаемый трафик через хост:
sudo iptables -A FORWARD -p tcp -d < контейнер IP> --dport < контейнерпорт > -j ACCEPT
Используя приведенный выше пример, команда будет такой:
sudo iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 80 -j ACCEPT
4. Сохранение правил. В некоторых дистрибутивах Linux правила iptables не сохраняются автоматически после перезапуска. Вы можете сохранять и перезагружать правила с помощью команд iptables-save и iptables-restore. Для систем Debian/Ubuntu вы можете установить пакет iptables-persistent для сохранения правил.
Будьте предельно осторожны при выполнении этих команд, поскольку неправильная настройка iptables может привести к сбою в работе сетевых служб. Если вы новичок в iptables, рекомендуется сначала поэкспериментировать в тестовой среде.
Если вы не против, вы также можете скачать gost с GitHub для переадресации портов. Я думаю, что этот инструмент — самый мощный инструмент переадресации.
Вышеописанный метод реализуется не напрямую путем изменения существующего работающего контейнера, а посредством некоторых внешних операций или реконструкции контейнера для достижения цели раскрытия порта. Если вы хотите предоставить доступ к порту внешнему миру, рекомендуется заранее спланировать сопоставление портов при проектировании контейнера Docker.
Наконец, я давно не обновлял ее. Если эта статья оказалась полезной, добавьте ее в закладки, подписывайтесь и пересылайте.