Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

简介: Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

在尝试在基于 Rockchip RK3568 的设备上,运行 Ubuntu 22.04 rootfs 并安装 Docker 时,我遇到了一系列问题。本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

# 我的设备环境:
root@btf:/$ docker --version
Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1
root@btf:/$ uname -a
Linux btf 4.19.219 #7 SMP Fri Mar 22 10:46:23 CST 2024 aarch64 aarch64 aarch64 GNU/Linux
root@btf:/$ cat /etc/issue
Ubuntu 22.04 LTS \n \l

1. Docker 服务无法启动

root@btf:/$ systemctl status docker
○ docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
root@btf:/$  dockerd --debug
INFO[2024-03-21T02:22:22.162686036Z] Starting up
DEBU[2024-03-21T02:22:22.165772744Z] Listener created for HTTP on unix (/var/run/docker.sock)
DEBU[2024-03-21T02:22:22.172340495Z] Golang's threads limit set to 14040
DEBU[2024-03-21T02:22:22.176763037Z] metrics API listening on /var/run/docker/metrics.sock
DEBU[2024-03-21T02:22:22.190162497Z] Using default logging driver json-file
DEBU[2024-03-21T02:22:22.193045622Z] No quota support for local volumes in /var/lib/docker/volumes: Filesystem does not support, or has not enabled quotas
DEBU[2024-03-21T02:22:22.196496331Z] processing event stream                       module=libcontainerd namespace=plugins.moby
INFO[2024-03-21T02:22:22.207613790Z] [graphdriver] trying configured driver: vfs
DEBU[2024-03-21T02:22:22.208240873Z] Initialized graph driver vfs
DEBU[2024-03-21T02:22:22.209004165Z] Max Concurrent Downloads: 3
DEBU[2024-03-21T02:22:22.209079415Z] Max Concurrent Uploads: 5
DEBU[2024-03-21T02:22:22.209110915Z] Max Download Attempts: 5
INFO[2024-03-21T02:22:22.209228749Z] Loading containers: start.
DEBU[2024-03-21T02:22:22.209483665Z] Option DefaultDriver: bridge
DEBU[2024-03-21T02:22:22.209541124Z] Option DefaultNetwork: bridge
DEBU[2024-03-21T02:22:22.209575249Z] Network Control Plane MTU: 1500
DEBU[2024-03-21T02:22:22.210205832Z] processing event stream                       module=libcontainerd namespace=moby
INFO[2024-03-21T02:22:22.230569417Z] unable to detect if iptables supports xlock: 'iptables --wait -L -n': `iptables/1.8.7 Failed to initialize nft: Protocol not supported`  error="exit status 1"
DEBU[2024-03-21T02:22:22.230980959Z] /usr/sbin/iptables, [-t filter -C FORWARD -j DOCKER-ISOLATION]
DEBU[2024-03-21T02:22:22.240452543Z] /usr/sbin/iptables, [-t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER]
DEBU[2024-03-21T02:22:22.252465128Z] /usr/sbin/iptables, [-t nat -D OUTPUT -m addrtype --dst-type LOCAL ! --dst 127.0.0.0/8 -j DOCKER]
DEBU[2024-03-21T02:22:22.264647171Z] /usr/sbin/iptables, [-t nat -D OUTPUT -m addrtype --dst-type LOCAL -j DOCKER]
DEBU[2024-03-21T02:22:22.278666714Z] /usr/sbin/iptables, [-t nat -D PREROUTING]
DEBU[2024-03-21T02:22:22.288415965Z] /usr/sbin/iptables, [-t nat -D OUTPUT]
DEBU[2024-03-21T02:22:22.298152966Z] /usr/sbin/iptables, [-t nat -F DOCKER]
DEBU[2024-03-21T02:22:22.308048342Z] /usr/sbin/iptables, [-t nat -X DOCKER]
DEBU[2024-03-21T02:22:22.317894426Z] /usr/sbin/iptables, [-t filter -F DOCKER]
DEBU[2024-03-21T02:22:22.327381177Z] /usr/sbin/iptables, [-t filter -X DOCKER]
DEBU[2024-03-21T02:22:22.337190220Z] /usr/sbin/iptables, [-t filter -F DOCKER-ISOLATION-STAGE-1]
DEBU[2024-03-21T02:22:22.348203846Z] /usr/sbin/iptables, [-t filter -X DOCKER-ISOLATION-STAGE-1]
DEBU[2024-03-21T02:22:22.360229555Z] /usr/sbin/iptables, [-t filter -F DOCKER-ISOLATION-STAGE-2]
DEBU[2024-03-21T02:22:22.374536390Z] /usr/sbin/iptables, [-t filter -X DOCKER-ISOLATION-STAGE-2]
DEBU[2024-03-21T02:22:22.385013058Z] /usr/sbin/iptables, [-t filter -F DOCKER-ISOLATION]
DEBU[2024-03-21T02:22:22.394474434Z] /usr/sbin/iptables, [-t filter -X DOCKER-ISOLATION]
DEBU[2024-03-21T02:22:22.404029435Z] /usr/sbin/iptables, [-t nat -n -L DOCKER]
DEBU[2024-03-21T02:22:22.413653269Z] /usr/sbin/iptables, [-t nat -N DOCKER]
DEBU[2024-03-21T02:22:22.423293145Z] daemon configured with a 15 seconds minimum shutdown timeout
DEBU[2024-03-21T02:22:22.423441020Z] start clean shutdown of all containers with a 15 seconds timeout...
DEBU[2024-03-21T02:22:22.425325770Z] Cleaning up old mountid : start.
INFO[2024-03-21T02:22:22.425624437Z] stopping event stream following graceful shutdown  error="<nil>" module=libcontainerd namespace=moby
DEBU[2024-03-21T02:22:22.426692812Z] Cleaning up old mountid : done.
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables/1.8.7 Failed to initialize nft: Protocol not supported
 (exit status 1)
问题描述

在尝试启动 Docker 服务时,通过 systemctl status docker 命令发现服务处于 inactive (dead) 状态,无法启动。

解决方案

系统已经配置为使用 iptables-nft 作为默认的 iptables 实现。Docker 启动时仍然提示 iptables/1.8.7 Failed to initialize nft: Protocol not supported 错误,就算在kernel打开了正确的 iptables 版本,但 Docker 与 nftables 的集成仍然存在问题。

CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_IPV4=y
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_NF_NAT_IPV4=y
CONFIG_NF_NAT_MASQUERADE_IPV4=y
CONFIG_IP_NF_IPTABLES=y

2. Docker 守护进程启动问题

问题描述

在手动启动 Docker 守护进程 (dockerd) 时,遇到了与 iptablesnftables 相关的错误,提示无法初始化网络控制器。

解决方案

确认系统中 iptablesnftables 的配置和版本兼容性。我记得Ubuntu20.04 Docker 默认使用 iptables 管理网络规则,如果系统使用 nftables,可能需要进行额外的配置。

这个问题死活解决不了,因为我在RK3399 碰到过iptables的问题,后面是增加了许多kernel 宏才解决的,但是在RK3568失效了。 最后查到这篇帖子链接: ubuntu 22.04 iptables 运行失败解决方法

ubuntu 22.04默认使用nftables作为防火墙,而非iptables。

如果系统使用 nftables 作为默认的防火墙管理工具,可以尝试将 iptables 配置为使用 legacy 模式,通过执行 update-alternatives --set iptables /usr/sbin/iptables-legacyupdate-alternatives --set ip6tables /usr/sbin/ip6tables-legacy 命令来实现。

  • 重新启动 Docker 守护进程并检查是否能够成功启动。

3. 系统服务 nftables 启动失败

root@btf:/$ systemctl status nftables
× nftables.service - nftables
     Loaded: loaded (/lib/systemd/system/nftables.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2024-03-21 02:21:09 UTC; 3min 37s ago
       Docs: man:nft(8)
             http://wiki.nftables.org
    Process: 341 ExecStart=/usr/sbin/nft -f /etc/nftables.conf (code=exited, status=3)
   Main PID: 341 (code=exited, status=3)
        CPU: 82ms
3月 21 02:21:09 btf systemd[1]: Starting nftables...
3月 21 02:21:09 btf nft[341]: mnl.c:60: Unable to initialize Netlink sock…orted
3月 21 02:21:09 btf systemd[1]: nftables.service: Main process exited, co…ENTED
3月 21 02:21:09 btf systemd[1]: nftables.service: Failed with result 'exi…ode'.
3月 21 02:21:09 btf systemd[1]: Failed to start nftables.
Hint: Some lines were ellipsized, use -l to show in full.
问题描述

在检查 nftables 服务状态时,发现服务启动失败,提示 Failed to start nftables

解决方案

检查 nftables 配置文件 /etc/nftables.conf 的语法是否正确。可以使用 nft list ruleset 命令来测试配置文件的语法。确认内核是否支持 nftables,并且所有必要的 nftables 模块都已加载。可以通过 lsmod | grep nft 命令来检查。如果问题依旧存在,查看系统日志 journalctl -u nftables 以获取更多错误信息再继续调试,反正就是宏没打开。

4. Docker 容器运行时错误

root@btf:/root$ docker run -it ubuntu:18.04 bash
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting cgroup config for procHooks process: bpf_prog_query(BPF_CGROUP_DEVICE) failed: function not implemented: unknown.
ERRO[0002] error waiting for container:
问题描述

尝试运行 Docker 容器时遇到 OCI runtime create failed 错误,提示与 cgroup 配置相关的问题,具体为 bpf_prog_query(BPF_CGROUP_DEVICE) failed: function not implemented

解决方案

到这个问题基本上docker 已经能run、pull了,但是 Docker 容器运行时(如 runc)与宿主机的 cgroup 配置不兼容有关。这个问题折腾死我了 一度怀疑配置有问题,确保 Docker 和宿主机的 Linux内核cgroup 配置兼容。

容器初始化过程中,设置 cgroup 配置时遇到了问题,特别是与 BPF相关的功能。

最开始,我先用过check脚本检查docker环境,发现少打开了CGROUP_BPF ,打开之后也死活不行,最后看代码 kernel/init/Kconfig 里面有CGROUP_BPF , 但是这个依赖BPFBPF_SYSCAL

问题的根源在于内核配置中缺少了几个关键的 BPF 和 cgroup 相关的配置项。通过修改内核配置并启用以下选项,成功解决了问题:

  • CONFIG_CGROUP_BPF=y
  • CONFIG_BPF=y
  • CONFIG_BPF_SYSCALL=y

5. Docker 镜像拉取问题

btf@btf:/$ ls -l /var/run/docker.sock
ls: 无法访问 '/var/run/docker.sock': 没有那个文件或目录
btf@btf:/$ sudo docker pull ubuntu:18.04
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
问题描述

尝试使用 docker pull ubuntu:18.04 拉取 Ubuntu 镜像时,遇到连接 Docker 守护进程失败的问题,提示 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

解决方案

确认 Docker 服务是否正在运行:使用 systemctl status docker 检查 Docker 服务的状态。如果服务未运行,使用 systemctl start docker 启动服务。

检查当前用户是否有权限访问 Docker 守护进程。通常,需要将用户添加到 docker 组:sudo usermod -aG docker $USER。之后,重新登录或重启系统以应用更改。

确认 Docker 守护进程的 socket 文件 /var/run/docker.sock 存在且具有正确的权限设置。

最后我重复部署几次之后好像这个问题,是因为安装docker-ce 而不是docker.io ?


希望这些详细的解决方案能够帮助有遇到相同问题的兄弟解决在 Rockchip RK3568 设备上部署 Docker 时遇到的问题。

相关文章
|
23小时前
|
Ubuntu Linux Docker
如何在Ubuntu 20.04系统中安装Docker
安装 Docker 引擎的步骤如下:首先更新系统包索引 (`sudo apt update`),安装必要依赖包 (`apt-transport-https` 等),添加 Docker 官方 GPG 密钥及 APT 仓库。接着再次更新包索引并安装 Docker 引擎及相关工具 (`docker-ce` 等)。最后启动 Docker 服务并设置开机自启,通过 `docker --version` 和运行测试容器 (`sudo docker run hello-world`) 验证安装是否成功。
14 0
|
7天前
|
Linux 网络安全 虚拟化
linux怎么把文件传到docker里面
在现代应用开发中,Docker作为流行的虚拟化工具,广泛应用于微服务架构。文件传输到Docker容器是常见需求。常用方法包括:1) `docker cp`命令直接复制文件;2) 使用`-v`选项挂载宿主机目录,实现数据持久化和实时同步;3) 通过SCP/FTP协议传输文件;4) 在Dockerfile中构建镜像时添加文件。选择合适的方法并确保网络安全是关键。
87 1
|
8天前
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
52 1
|
16天前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
48 19
|
19天前
|
人工智能 文字识别 安全
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
Stirling-PDF 是一款基于 Docker 的本地化 PDF 编辑工具,支持 50 多种 PDF 操作,包括合并、拆分、转换、压缩等,同时提供多语言支持和企业级功能,满足个人和企业用户的多样化需求。
74 6
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
|
1月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
225 91
|
1月前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
344 15
|
1月前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
65 23
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
285 93
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
78 17