докер завершает работу с ошибкой “iptables: Нет цепочки/цели/сопоставления с таким именем”

Вопрос или проблема

Когда я пытаюсь опубликовать порты контейнера на хосте, 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".

Причины проблемы

  1. Состояние интерфейса docker0: Как вы уже упомянули, интерфейс docker0 имеет статус DOWN. Это означает, что виртуальный мост Docker отключен, что мешает правильной работе iptables. Для функционирования Docker необходим рабочий интерфейс docker0, который служит связующим звеном между контейнерами и хостом.

  2. Версия Docker: Вы используете Docker версии 18.05.0-ce, что является первым релизом с обновленным управлением сетями и возможно, имеет свои проблемы и несовместимости с некоторыми системами, особенно если они не полностью поддерживают новую архитектуру изоляции сети.

Решения проблемы

Чтобы исправить ситуацию, вам нужно выполнить несколько шагов для перезапуска интерфейса docker0 и пересоздания конфигурации Docker:

  1. Удаление интерфейса docker0 и перезапуск Docker:

    sudo systemctl stop docker.service
    sudo ip link del docker0
    sudo systemctl start docker.service
  2. Проверка состояния docker0: Убедитесь, что после перезагрузки Docker интерфейс docker0 снова активен.

    ip a show docker0
  3. Перезагрузка системы: Если предыдущие шаги не помогли, попробуйте перезагрузить вашу систему. Это может помочь восстановить состояние инфраструктуры сетевого взаимодействия.

  4. Проверка установленного ПО: Убедитесь, что у вас установлены все необходимые зависимости и пакеты для корректной работы Docker. Иногда проблемы могут возникать из-за несовместимости версий или отсутствующих пакетов.

  5. Обновление до последней версии Docker: Попробуйте обновить Docker до более поздней стабильной версии. Новые версии могут решать известные проблемы и улучшать общую работу сетевых функций.

  6. Системные журналы: Проверьте системные журналы для получения дополнительной информации о возможных ошибках, которые могут помочь в диагностике:

    sudo journalctl -u docker.service

Заключение

Следуя приведенным выше рекомендациям, вы сможете устранить ошибку "iptables: No chain/target/match by that name" и восстановить работоспособность Docker на вашем хосте. Не забывайте, что состояние сетевых интерфейсов критически важно для работы контейнеров, а также следите за обновлениями Docker и Arch Linux для поддержания стабильной работы вашего окружения.

Оцените материал
Добавить комментарий

Капча загружается...