Проблема сетевого взаимодействия контейнера Docker на Unifi CloudKey Gen 2: не работает без –net host

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

У меня есть старый Unifi CloudKey Gen 2, который я переоборудовал просто под Linux. Он очень быстрый и поддерживает PoE, так что это идеальная одноплатная система для любого проекта. Я установил Docker, и он может запускать контейнеры, НО когда я пытаюсь запустить контейнер, который требует сеть, он не запускается с следующей ошибкой, ПОКРАЙНЕЕ я не укажу –net host, что больше не позволяет мне перенаправлять порты из контейнера -> хост.

Если я отключу nginx, который запускает интерфейс администрирования Unifi и использует порты 80/443, контейнер Docker запускается нормально с –net host.

Я не могу найти какую-либо информацию об этой ошибке. Есть идеи?

Вывод docker info:

root@DockerPen:~# docker info
Client: Docker Engine - Community
 Version:    27.3.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.17.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.7
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 6
  Running: 1
  Paused: 0
  Stopped: 5
 Images: 2
 Server Version: 27.3.1
 Storage Driver: vfs
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2
Default Runtime: runc
 Init Binary: docker-init
 containerd version: 57f17b0a6295a39009d861b89e3b3b87b005ca27
 runc version: v1.1.14-0-g2c9f560
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.18.44-ui-qcom
 Operating System: Debian GNU/Linux 11 (bullseye)
 OSType: linux
 Architecture: aarch64
 CPUs: 8
 Total Memory: 1.929GiB
 Name: DockerPen
 ID: e9bb9d23-8563-4003-96f4-7b1ca0cacf2f
 Docker Root Dir: /srv/var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

запуск контейнера Docker без опции –net host: <– Это проблема, которую я пытаюсь решить.

root@DockerPen:~# docker run -d -p 8080:80 httpd
497c3faf43c3c691b6231bf6973282c0c3c0f34f90bd8ea7c783e6d59051bf34
docker: Ошибка ответа от демона: не удалось создать задачу для контейнера: не удалось создать задачу shim: OCI runtime create failed: runc create failed: невозможно запустить процесс контейнера: ошибка во время инициализации контейнера: ошибка запуска хука #0: ошибка запуска хука: код выхода 1, stdout: , stderr: не удалось установить шлюз при обновлении шлюза: маршрут для шлюза 172.17.0.1 не был найден: ошибка декодирования: буфер слишком мал (4 байта): неизвестно.

Даже без контейнера, который требует сеть, эта ошибка сохраняется:

root@DockerPen:~# docker run hello-world
docker: Ошибка ответа от демона: не удалось создать задачу для контейнера: не удалось создать задачу shim: OCI runtime create failed: runc create failed: невозможно запустить процесс контейнера: ошибка во время инициализации контейнера: ошибка запуска хука #0: ошибка запуска хука: код выхода 1, stdout: , stderr: не удалось установить шлюз при обновлении шлюза: маршрут для шлюза 172.17.0.1 не был найден: ошибка декодирования: буфер слишком мал (4 байта): неизвестно.

Система БУДЕТ запускать контейнер Docker с опцией –net host, однако для http в частности, порт 80 занят веб-интерфейсом администрирования Unifi, поэтому он не запускается по этой причине:

root@DockerPen:~# docker run -d --net host httpd
61a6dd20b2b8276b040b4c7b7ee72c88e48b9aadcb51a279607bba76264e15cd
root@DockerPen:~# docker logs 61
AH00558: httpd: Не удалось надежно определить полное доменное имя сервера, используется 127.0.1.1. Установите директиву 'ServerName' глобально, чтобы подавить это сообщение
(98)Адрес уже используется: AH00072: make_sock: не удалось привязать адрес [::]:80
(98)Адрес уже используется: AH00072: make_sock: не удалось привязать адрес 0.0.0.0:80
нет доступных сокетов для прослушивания, отключение
AH00015: Не удалось открыть журналы

Контейнер, который не требует сеть, теперь запускается нормально с опцией –net host:

root@DockerPen:~# docker run --net host hello-world

Hello from Docker!
Это сообщение показывает, что ваша установка, похоже, работает корректно.

Чтобы сгенерировать это сообщение, Docker выполнил следующие шаги:
 1. Клиент Docker связался с демоном Docker.
 2. Демон Docker загрузил образ "hello-world" из Docker Hub.
    (arm64v8)
 3. Демон Docker создал новый контейнер из этого образа, который запускает
    исполняемый файл, который производит вывод, который вы сейчас читаете.
 4. Демон Docker передал этот вывод клиенту Docker, который отправил его
    на ваш терминал.

Чтобы попробовать что-то более амбициозное, вы можете запустить контейнер Ubuntu с:
 $ docker run -it ubuntu bash

Делитесь образами, автоматизируйте рабочие процессы и многое другое с бесплатным идентификатором Docker:
 https://hub.docker.com/

Для получения дополнительных примеров и идей посетите:
 https://docs.docker.com/get-started/

Я пытался удалить и переустановить Docker. Также для контекста, Docker настроил сетевой интерфейс:

root@DockerPen:~# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:7ff:fec6:fd56  prefixlen 64  scopeid 0x20<link>
        ether 02:42:07:c6:fd:56  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 1005 (1005.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Также для контекста, вывод инспекции сети bridge:

root@DockerPen:~# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "374161cbed7e81b64f1beb9c8864de46f7b2b122044e87bfa34e45e3d9e5a0a8",
        "Created": "2024-11-25T20:02:23.112345724-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

Также, если я отключу nginx, который запускает интерфейс администрирования Unifi и использует порты 80/443, контейнер Docker запускается нормально с –net host… Должно быть что-то простое, что я упускаю.

Ответ или решение

Проблема сетевого взаимодействия с контейнерами Docker на Unifi CloudKey Gen 2: Не удается запустить без –net host

Ваша проблема с запуском контейнеров Docker на Unifi CloudKey Gen 2, когда требуется сетевое взаимодействие, является распространённой для устройств с ограниченными ресурсами и специфическими конфигурациями. Давайте рассмотрим основные аспекты, которые могут помочь в решении возникшей ситуации.

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

Вы сталкиваетесь с ошибкой при запуске контейнеров Docker, которые требуют сетевые настройки, без использования параметра --net host. Ошибка указывает на проблему с созданием задач в Docker, в частности с установкой шлюза для создания виртуальной сети:

failed to set gateway while updating gateway: route for the gateway 172.17.0.1 could not be found: decoding failed: buffer too small (4 bytes): unknown.

Это говорит о том, что Docker не может создать маршрут для шлюза, принадлежащего виртуальной сети docker0 с IP-адресом 172.17.0.1.

Возможные причины и решения

  1. Настройки сети Docker: Убедитесь, что система правильно настроена для работы с сетевым интерфейсом docker0. Запустите команду ifconfig или ip addr для проверки состояния интерфейса. Если интерфейс не активен или отсутствует, возможно, стоит пересоздать его.

  2. Проблемы с маршрутизацией: Ваша ошибка может возникать из-за неправильно настроенных маршрутов. Попробуйте сбросить маршруты и пересоздать сеть с помощью следующих команд:

    ip route flush table local
    systemctl restart docker
  3. Конфликты портов: Использование параметра --net host позволяет контейнерам использовать порты хоста. Поскольку у вас запущен Nginx, который слушает на портах 80 и 443, в контейнере возникнет конфликт. Используйте другие порты для контейнера или настройте Nginx на использование реверсивного прокси для перенаправления трафика из контейнера на один из доступных портов.

  4. Проблемы с конфигурацией iptables: Docker зависит от iptables для настройки правил маршрутизации. Убедитесь, что параметры bridge-nf-call-iptables и bridge-nf-call-ip6tables включены. Для этого выполните следующие команды:

    echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
  5. Проблемы с версией ядра: Ваше ядро Linux (3.18.44-ui-qcom) может иметь ограничения, не поддерживающие определённые функции Docker. Убедитесь, что ваше оборудование и драйвера соответствуют требованиям Docker. Возможно, потребуется обновление до более свежей версии ядра или использование альтернативного устройства.

  6. Настройки запуска Docker: Проверьте файл конфигурации Docker (/etc/docker/daemon.json) и убедитесь, что он корректен. Возможно, стоит попробовать отключить режим debug, если он включён, чтобы не усложнять диагностику проблемы.

Заключение

Обратите внимание на предложенные шаги, и вам, скорее всего, удастся разобраться с проблемой сетевого взаимодействия в ваших контейнерах Docker. Это не редкость для устройств с ограниченными ресурсами, таких как Unifi CloudKey Gen 2, и, следуя инструкциям, вы сможете вернуть свою систему в рабочее состояние.

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

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

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