Вопрос или проблема
У меня есть старый 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.
Возможные причины и решения
-
Настройки сети Docker: Убедитесь, что система правильно настроена для работы с сетевым интерфейсом
docker0
. Запустите командуifconfig
илиip addr
для проверки состояния интерфейса. Если интерфейс не активен или отсутствует, возможно, стоит пересоздать его. -
Проблемы с маршрутизацией: Ваша ошибка может возникать из-за неправильно настроенных маршрутов. Попробуйте сбросить маршруты и пересоздать сеть с помощью следующих команд:
ip route flush table local systemctl restart docker
-
Конфликты портов: Использование параметра
--net host
позволяет контейнерам использовать порты хоста. Поскольку у вас запущен Nginx, который слушает на портах 80 и 443, в контейнере возникнет конфликт. Используйте другие порты для контейнера или настройте Nginx на использование реверсивного прокси для перенаправления трафика из контейнера на один из доступных портов. -
Проблемы с конфигурацией 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
-
Проблемы с версией ядра: Ваше ядро Linux (3.18.44-ui-qcom) может иметь ограничения, не поддерживающие определённые функции Docker. Убедитесь, что ваше оборудование и драйвера соответствуют требованиям Docker. Возможно, потребуется обновление до более свежей версии ядра или использование альтернативного устройства.
-
Настройки запуска Docker: Проверьте файл конфигурации Docker (
/etc/docker/daemon.json
) и убедитесь, что он корректен. Возможно, стоит попробовать отключить режимdebug
, если он включён, чтобы не усложнять диагностику проблемы.
Заключение
Обратите внимание на предложенные шаги, и вам, скорее всего, удастся разобраться с проблемой сетевого взаимодействия в ваших контейнерах Docker. Это не редкость для устройств с ограниченными ресурсами, таких как Unifi CloudKey Gen 2, и, следуя инструкциям, вы сможете вернуть свою систему в рабочее состояние.
Если ни одно из решений не помогло, возможно, стоит обратиться в сообщество пользователей Docker или к разработчикам Unifi для более глубокого анализа проблемы.