6

Я создаю контейнер из изображения с опубликованным портом (3000). Я хочу опубликовать новый порт (3030) и только этот, если я использую --publish 3030:3030 я получаю оба опубликованных порта (3000 и 3030).

Можно ли как-то отменить публикацию порта в работающем контейнере или мне нужно запустить мой образ с нуля?

3 ответа3

8

Чистый способ - создать новое изображение: обычно вы всегда хотите, чтобы ваш контейнер докера и изображения были воспроизводимыми. Если вы вручную изменяете что-то, отклоняющееся от вашего изображения, вы лишаете себя такого поведения (чего-то, чего ожидают другие, управляющие инфраструктурой, в которой вы работаете).

В настоящее время нет простого способа сделать это через Docker API, но обязательно проверьте, есть ли новая разработка в их документации.

В частности, есть отчет об ошибках (изменяемые / редактируемые тома / порты на github), к которым вы можете захотеть прокомментировать / подписаться, если вас это интересует.

Прямо сейчас прямое управление DNAT с помощью iptables. Это все равно, как это делает docker, но имейте в виду, что помимо вашего желаемого эффекта я не уверен, есть ли какие-либо побочные эффекты (например, Docker пытается повторно добавить эти правила и т.д.)

Сначала вам нужно найти перенаправленный порт в следующем списке:

iptables -t nat --line-numbers --numeric --list

который производит вывод как это:

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
num  target     prot opt source               destination
1    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.1.1:80
2    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8081 to:172.17.1.2:80
3    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8082 to:172.17.1.3:80

затем вы можете удалить соответствующие правила, используя

iptables -t nat -D DOCKER $num
Например, чтобы заменить правило, соответствующее порту 8081, вы должны использовать
iptables -t nat -D DOCKER 2

Наслаждайтесь!

0

Я запустил небольшой скрипт для удаления зарегистрированных томов из образа докера. Он использует обходной путь, используя « docker save » в tarball со слоями, редактируя метаданные и « docker load » обратно, включая историю. Добавление опции для удаления открытых портов было просто еще одной хитростью, которую может выполнить скрипт.

Взгляните на docker-copyedit - это может помочь, если эти неэкспонированные порты будут происходить регулярно.

0

docker create -p 127.0.0.1:0:3000 выставит порт 3000 на случайный хост-порт, связанный только с интерфейсом localhost. Не лучшее решение, но гарантирует, что порт не будет доступен из сети.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .