Вопрос или проблема
Когда я пытаюсь опубликовать порты контейнера на хосте, Docker не может добавить правила iptables:
$ sudo docker run --rm -p 8080:80 nginx
docker: Ошибка ответа от демона: драйвер не смог запрограммировать внешнюю
связь на конечной точке:
iptables не удалось:
iptables --wait -t nat -A DOCKER -p tcp -d 0/0
--dport 8080 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0
iptables: Нет цепочки/цели/сопоставления с таким именем. (код завершения 1)).
Меня смущает то, что цепочка DOCKER
кажется существующей:
$ sudo iptables -L
Цепочка INPUT (политика ACCEPT)
цель протокол опция источник назначение
Цепочка FORWARD (политика DROP)
цель протокол опция источник назначение
DOCKER-USER all -- везде везде
DOCKER-ISOLATION-STAGE-1 all -- везде везде
ACCEPT all -- везде везде ctstate RELATED,ESTABLISHED
DOCKER all -- везде везде
ACCEPT all -- везде везде
ACCEPT all -- везде везде
ACCEPT all -- везде везде ctstate RELATED,ESTABLISHED
DOCKER all -- везде везде
ACCEPT all -- везде везде
ACCEPT all -- везде везде
Цепочка OUTPUT (политика ACCEPT)
цель протокол опция источник назначение
Цепочка DOCKER (2 ссылки)
цель протокол опция источник назначение
Цепочка DOCKER-ISOLATION-STAGE-1 (1 ссылка)
цель протокол опция источник назначение
DOCKER-ISOLATION-STAGE-2 all -- везде везде
DOCKER-ISOLATION-STAGE-2 all -- везде везде
RETURN all -- везде везде
Цепочка DOCKER-ISOLATION-STAGE-2 (2 ссылки)
цель протокол опция источник назначение
DROP all -- везде везде
DROP all -- везде везде
RETURN all -- везде везде
Цепочка DOCKER-USER (1 ссылка)
цель протокол опция источник назначение
RETURN all -- везде везде
… и также здесь:
$ sudo iptables -L -t nat
Цепочка PREROUTING (политика ACCEPT)
цель протокол опция источник назначение
DOCKER all -- везде везде ADDRTYPE совпадение dst-type LOCAL
Цепочка INPUT (политика ACCEPT)
цель протокол опция источник назначение
Цепочка OUTPUT (политика ACCEPT)
цель протокол опция источник назначение
DOCKER all -- везде !127.0.0.0/8 ADDRTYPE совпадение dst-type LOCAL
Цепочка POSTROUTING (политика ACCEPT)
цель протокол опция источник назначение
MASQUERADE all -- 172.17.0.0/16 везде
MASQUERADE all -- 172.18.0.0/16 везде
Цепочка DOCKER (2 ссылки)
цель протокол опция источник назначение
RETURN all -- везде везде
RETURN all -- везде везде
Возможно, имеет значение: ip a
показывает, что docker0
отключен:
$ ip a
...
74: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:01:52:de:7d brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
Я пытался остановить Docker, удалить поврежденное устройство docker0
и снова запустить Docker. Та же ошибка:
sudo systemctl stop docker.service
sudo ip link del docker0
sudo systemctl start docker.service
ip a
все еще показывает, что docker0
отключен. Запуск sudo docker run --rm -p 8080:80 nginx
также приводит к идентичному сообщению об ошибке, как выше.
Информация о системе:
$ docker --version
Версия Docker 18.05.0-ce, сборка f150324782
$ uname -a
Linux amd8-arch 4.16.7-1-ARCH #1 SMP PREEMPT Wed May 2 21:12:36 UTC 2018 x86_64 GNU/Linux
Я использую Arch Linux.
Docker 18.05.0-ce — это первый релиз, в котором принято следующее сетевое улучшение,
Обновление libnetwork для улучшения масштабируемости правил изоляции сетевого моста. moby/moby#36774
В этой функции цепочка DOCKER-ISOLATION в таблице фильтров iptable заменяется на DOCKER-ISOLATION-STAGE-1 и DOCKER-ISOLATION-STAGE-2.
Смотрите журнал релиза 18.05.0-ce.
Ответ или решение
Проблема, описанная в вашем запросе, связана с работой Docker и iptables, где возникает ошибка при попытке публикации портов контейнера на хосте. Ошибка формулируется как "iptables: No chain/target/match by that name", что подразумевает, что не удалось найти нужную цепочку или цель в iptables. Давайте разберемся в этом вопросе более подробно.
Анализ ошибки
При запуске команды sudo docker run --rm -p 8080:80 nginx
Docker пытается добавить правила в цепочку iptables для маршрутизации трафика. Конкретно, возникает ошибка при выполнении следующей команды iptables:
iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0
Причина сбоя явно указана: цепочка DOCKER
существует, но для выполнения команды требуются другие цепочки, такие как DOCKER-USER
, DOCKER-ISOLATION-STAGE-1
, DOCKER-ISOLATION-STAGE-2
, которые также присутствуют, но могут быть не в том состоянии, в котором ожидает это действие Docker. Основной причиной может быть то, что интерфейс docker0
находится в состоянии "down".
Причины проблемы
-
Состояние интерфейса
docker0
: Как вы уже упомянули, интерфейсdocker0
имеет статусDOWN
. Это означает, что виртуальный мост Docker отключен, что мешает правильной работе iptables. Для функционирования Docker необходим рабочий интерфейсdocker0
, который служит связующим звеном между контейнерами и хостом. -
Версия Docker: Вы используете Docker версии 18.05.0-ce, что является первым релизом с обновленным управлением сетями и возможно, имеет свои проблемы и несовместимости с некоторыми системами, особенно если они не полностью поддерживают новую архитектуру изоляции сети.
Решения проблемы
Чтобы исправить ситуацию, вам нужно выполнить несколько шагов для перезапуска интерфейса docker0
и пересоздания конфигурации Docker:
-
Удаление интерфейса
docker0
и перезапуск Docker:sudo systemctl stop docker.service sudo ip link del docker0 sudo systemctl start docker.service
-
Проверка состояния
docker0
: Убедитесь, что после перезагрузки Docker интерфейсdocker0
снова активен.ip a show docker0
-
Перезагрузка системы: Если предыдущие шаги не помогли, попробуйте перезагрузить вашу систему. Это может помочь восстановить состояние инфраструктуры сетевого взаимодействия.
-
Проверка установленного ПО: Убедитесь, что у вас установлены все необходимые зависимости и пакеты для корректной работы Docker. Иногда проблемы могут возникать из-за несовместимости версий или отсутствующих пакетов.
-
Обновление до последней версии Docker: Попробуйте обновить Docker до более поздней стабильной версии. Новые версии могут решать известные проблемы и улучшать общую работу сетевых функций.
-
Системные журналы: Проверьте системные журналы для получения дополнительной информации о возможных ошибках, которые могут помочь в диагностике:
sudo journalctl -u docker.service
Заключение
Следуя приведенным выше рекомендациям, вы сможете устранить ошибку "iptables: No chain/target/match by that name" и восстановить работоспособность Docker на вашем хосте. Не забывайте, что состояние сетевых интерфейсов критически важно для работы контейнеров, а также следите за обновлениями Docker и Arch Linux для поддержания стабильной работы вашего окружения.