Как переносить в контейнер Docker?

111
11

Я бы хотел переслать 8080 порт на 80 с iptables в контейнере Docker.
В сборке у меня есть сообщение об ошибке, как вы можете видеть ниже.


Вот файл Docker:


FROM fedora
RUN whoami && \
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

Вот результат:


[~]# docker build -t temp /home/edfromhadria/Documents/Docker/temp/.
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM fedora
---> 834629358fe2
Step 1 : RUN whoami && iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
---> Running in 95046cf959bf
root
iptables v1.4.21: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
INFO[0001] The command [/bin/sh -c whoami && iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080] returned a non-zero code: 3

Заранее благодарим за любую помощь, которую вы можете предоставить.

спросил(а) 2021-01-19T17:23:59+03:00 8 месяцев назад
1
Решение
142

Во-первых, запуск команды iptables во время процесса docker build никогда не будет иметь смысла; даже если он сработает, команда iptables изменяет только конфигурацию среды выполнения вашего ядра. Эти изменения не будут сохраняться на изображении Docker и не будут доступны при запуске контейнера.


Во-вторых, даже если вы запускаете контейнер iptables после запуска контейнера (а не при создании контейнера), он все равно будет терпеть неудачу, поскольку контейнеры Docker по умолчанию не имеют необходимых прав для изменения конфигурации iptables (или изменять сети в целом или монтировать файловые системы и т.д.). Вы можете запустить контейнер с флагом --privileged, но это, вероятно, не то, что вы хотите сделать (поскольку это дает ряд дополнительных привилегий на контейнере, которые, вероятно, не нужны, и с точки зрения безопасности это хорошая идея только предоставлять привилегии, которые абсолютно необходимы).


Обычно вы используете это с помощью параметра Docker -p для подключения портов вашего хоста к портам в вашем контейнере, например:

docker run -p 80:8080 temp

Это свяжет порт 80 на вашем хосте с портом 8080 на контейнере.


Если это не то, что вам нужно, проще всего настроить приложение в вашем контейнере для работы на нужном порту.

ответил(а) 2021-01-19T17:23:59+03:00 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема