30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度最近在龙芯 3B6000 平台上部署 AnolisOS 23.4 时遇到了一个典型问题通过系统默认仓库安装 Docker 后容器无法正常创建。这并非个例而是国产化平台迁移中可能遇到的兼容性挑战。本文将系统性地拆解此问题的完整解决方案从环境准备、Docker 安装、问题诊断到最终修复提供一套可复现的操作流程。无论你是初次接触龙芯平台的开发者还是正在将应用向国产化环境迁移的运维人员都能从中找到清晰的指引和避坑指南。1. 背景与核心概念在深入问题之前我们有必要理解几个关键概念及其在当前场景下的意义。1.1 龙芯 3B6000 与 AnolisOS龙芯 3B6000是龙芯中科推出的新一代通用处理器采用自主指令系统架构 LoongArch。其意义在于提供了从底层芯片到上层应用的全国产化技术栈选择。对于开发者而言在龙芯平台上进行开发意味着需要关注其特有的指令集和软件生态兼容性。AnolisOS是由阿里云发起的开源操作系统项目属于 CentOS 的替代分支之一旨在提供一个稳定、高性能、可定制的 Linux 服务器操作系统。AnolisOS 23.4 是其一个特定版本提供了对多种硬件架构的支持包括对龙芯 LoongArch 架构的适配。选择 AnolisOS 而非其他发行版通常是因为其良好的企业级支持、与 CentOS/RHEL 的高度兼容性以及活跃的社区。1.2 Docker 与容器技术Docker是一种应用容器引擎它允许开发者将应用及其依赖打包到一个可移植的容器中。容器技术实现了进程级别的隔离使得应用可以在任何支持 Docker 的环境中以一致的方式运行极大地简化了开发、测试和部署的流程。在国产化环境中部署 Docker核心价值在于利用其“一次构建到处运行”的特性将复杂的应用环境封装降低在异构硬件和操作系统上部署应用的难度。然而Docker 本身依赖于 Linux 内核的特定功能如 cgroups、namespaces并且其官方发布的二进制包通常是针对 x86_64 或 ARM64 架构编译的。对于龙芯的 LoongArch 架构我们需要寻找或构建与之兼容的 Docker 版本。1.3 问题场景默认仓库安装与容器创建失败“默认仓库安装”指的是直接使用操作系统自带的软件包管理器如dnf或yum和其配置的官方软件源来安装 Docker。这种方式最简便但软件源的维护方需要确保软件包与当前系统架构和内核版本完全兼容。“容器无法创建”是一个表象其背后可能的原因错综复杂包括但不限于内核模块缺失或未加载Docker 需要特定的内核模块如overlay、br_netfilter。存储驱动不兼容Docker 使用的存储驱动如overlay2与当前内核或文件系统不匹配。SELinux/AppArmor 安全策略限制安全模块阻止了容器进程的某些操作。用户权限问题非 root 用户未加入docker组或docker.sock权限不正确。架构相关的运行时问题在龙芯平台上可能与runc容器运行时的二进制兼容性或内核参数有关。本文将聚焦于在龙芯 3B6000 AnolisOS 23.4这一特定组合下通过默认仓库安装 Docker 后遇到的容器创建问题并提供一套从诊断到解决的完整方案。2. 环境准备与版本说明在进行任何操作之前请确保你拥有一个稳定的操作环境并记录下关键版本信息这对于后续排查问题至关重要。2.1 基础环境确认首先通过 SSH 或本地终端登录到你的龙芯 3B6000 服务器执行以下命令来确认系统环境# 1. 查看操作系统及内核信息 cat /etc/os-release uname -a # 2. 查看系统架构 arch # 或 uname -m # 3. 查看内核版本 cat /proc/version在龙芯 3B6000 的 AnolisOS 23.4 系统上预期输出类似如下uname -m应显示loongarch64确认是龙芯架构。/etc/os-release应显示NAMEAnolis OSVERSION23.4。2.2 网络与软件源配置确保你的服务器可以访问互联网或内部软件源。检查网络连通性并更新系统包缓存# 测试网络连通性例如测试连接到一个公共域名 ping -c 4 openanolis.cn # 更新 DNF 包管理器的元数据缓存 sudo dnf makecache如果使用内部源请确保/etc/yum.repos.d/目录下的 repo 文件已正确配置了针对loongarch64架构的仓库地址。2.3 关键软件版本规划本文操作基于以下软件环境你的实际版本可能略有差异但解决思路相通操作系统Anolis OS 23.4 (LoongArch64)内核版本Linux 5.x 系列AnolisOS 23.4 默认内核Docker 版本通过默认仓库安装的版本例如docker-ce-24.0.x容器运行时runc通常随 Docker 一起安装存储驱动目标为overlay2请记录下你安装前的初始状态以便对比。3. 通过默认仓库安装 DockerAnolisOS 23.4 的默认仓库通常已经包含了 Docker 社区版 (Docker CE) 的软件包。安装过程与在 CentOS/RHEL 上类似。3.1 安装 Docker 引擎执行以下命令组来完成 Docker 的安装# 步骤1安装必要的依赖包 sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 # 步骤2添加 Docker 官方仓库可选但AnolisOS默认源可能已包含 # 注意Docker官方不一定提供loongarch64的包这里我们优先使用系统默认源。 # 通常不需要执行以下命令除非默认源没有。 # sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 步骤3安装 Docker CE、CLI 和 Containerd sudo dnf install -y docker-ce docker-ce-cli containerd.io # 步骤4启动 Docker 服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 步骤5验证 Docker 引擎是否安装成功 sudo docker --version如果安装成功docker --version会输出类似Docker version 24.0.7, build afdd53b的信息。3.2 配置用户权限可选但推荐为了避免每次使用docker命令都需要sudo可以将当前用户加入docker组# 将当前用户加入 docker 组 sudo usermod -aG docker $USER # 重要注销并重新登录或者开启新的shell会话以使组权限生效。 # 你可以执行 newgrp docker 在当前会话临时生效但重新登录更彻底。重新登录后运行docker ps测试是否可以不使用sudo。4. 问题复现与诊断容器无法创建安装完成后我们尝试运行一个最简单的容器来测试功能。4.1 复现问题运行一个 Hello-World 容器或一个简单的 BusyBox 容器# 尝试拉取并运行 hello-world 镜像 docker run hello-world # 或者尝试运行一个交互式的 busybox 容器 docker run -it --rm busybox /bin/sh问题现象命令执行后可能会长时间卡住最终报错退出。错误信息可能多种多样但核心是容器创建失败。常见的错误信息包括docker: Error response from daemon: failed to create shim task: OCI runtime create failed: ...docker: Error response from daemon: failed to start shim: fork/exec /usr/bin/containerd-shim-runc-v2: no such file or directorydocker: Error response from daemon: failed to create shim: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/moby/container-id/log.json: no such file or directory): runc did not terminate successfully: unknown.命令直接卡住无响应使用docker ps -a查看容器状态为Created而非Up。4.2 系统性诊断步骤当容器创建失败时不要盲目尝试应按照以下顺序进行诊断步骤1检查 Docker 服务状态和日志# 查看 Docker 服务是否正常运行 sudo systemctl status docker # 查看 Docker 引擎的实时日志在一个独立的终端窗口执行 sudo journalctl -fu docker.service # 尝试运行一个容器同时观察上面日志窗口的输出 docker run --rm hello-world关注日志中是否有ERROR、failed等关键词特别是与runc、shim、start相关的错误。步骤2检查容器运行时和存储驱动# 查看 Docker 的详细信息重点关注 Runtimes 和 Storage Driver docker info # 单独检查存储驱动 docker info | grep -i storage确保Storage Driver是overlay2推荐。在 AnolisOS 23.4 上这通常是默认值。步骤3检查内核模块Docker 依赖一些内核模块。检查它们是否已加载# 检查 overlay、br_netfilter 等模块 lsmod | grep -E “overlay|br_netfilter” # 如果未加载尝试手动加载需要root权限 sudo modprobe overlay sudo modprobe br_netfilter步骤4检查 SELinux 状态SELinux 可能会阻止容器进程。检查其状态# 查看 SELinux 当前状态和模式 getenforce # 输出应为 Enforcing、Permissive 或 Disabled sestatus如果状态是Enforcing可以尝试临时将其设置为Permissive模式进行测试sudo setenforce 0然后再次尝试运行容器。如果问题解决则说明是 SELinux 策略问题。注意生产环境不建议长期使用Permissive应配置正确的 SELinux 策略。步骤5检查 Cgroups 配置确保系统使用cgroups v1。虽然 Docker 也支持cgroups v2但在某些旧版本或特定配置下可能存在兼容性问题。检查方法# 查看当前挂载的 cgroup 版本 mount | grep cgroup # 或者查看文件系统类型 stat -fc %T /sys/fs/cgroup/如果显示cgroup2fs则是 v2如果显示tmpfs并有多个cgroup子目录则是 v1。Docker 通常能自适应但若怀疑是此问题可以通过内核引导参数systemd.unified_cgroup_hierarchy0来强制使用 v1。步骤6检查runc二进制文件确认runc容器运行时是否存在且可执行# 查找 runc 位置 which runc # 通常位于 /usr/bin/runc 或 /usr/local/bin/runc # 检查其权限和架构 ls -lh /usr/bin/runc file /usr/bin/runcfile命令应显示其为ELF 64-bit LSB executable, LoongArch。如果它是为其他架构如 x86_64编译的则无法在龙芯上运行这就是根本原因。5. 核心问题分析与解决方案根据在龙芯平台上的实践经验通过默认仓库安装 Docker 后容器创建失败一个极高概率的原因是安装的runc或其他相关组件是错误架构的二进制包。AnolisOS 的默认仓库可能在某些情况下没有为loongarch64架构提供完全兼容的 Docker 套件或者依赖关系解析错误安装了 x86_64 的包。5.1 解决方案重新安装或编译正确架构的 runc方案A从源码编译 runc推荐确保兼容性安装编译依赖sudo dnf install -y make gcc libseccomp-devel git下载 runc 源码git clone https://github.com/opencontainers/runc.git cd runc编译 runcmake这个过程会在当前目录生成runc二进制文件。备份并替换系统 runc# 备份原有的 runc如果存在 sudo mv /usr/bin/runc /usr/bin/runc.bak # 安装新编译的 runc sudo cp runc /usr/bin/runc sudo chmod 755 /usr/bin/runc验证 runc 架构file /usr/bin/runc现在应该显示为 LoongArch 架构。重启 Docker 服务并测试sudo systemctl restart docker docker run --rm hello-world方案B寻找预编译的 LoongArch64 架构 runc 包你可以尝试从 AnolisOS 的社区仓库、龙芯的软件源或第三方可信源寻找专门为loongarch64编译的runc或完整的 Docker 包。安装方法取决于具体的软件包格式rpm或deb。例如如果找到了runc的 rpm 包sudo rpm -ivh --force runc-loongarch64-*.rpm # 或者使用 dnf localinstall sudo dnf localinstall runc-loongarch64-*.rpm方案C使用 containerd 的集成运行时较新版本的 Docker 使用containerd作为默认容器运行时。有时问题可能出在containerd与runc的交互上。可以尝试完全卸载 Docker 后安装一个明确支持 LoongArch 的containerd版本再安装 Docker。彻底卸载现有 Dockersudo dnf remove -y docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd安装指定版本的 containerd 从可靠来源获取loongarch64架构的containerdrpm 包并安装。sudo dnf install -y containerd.io-version.loongarch64.rpm配置 containerdsudo containerd config default | sudo tee /etc/containerd/config.toml # 编辑 /etc/containerd/config.toml确保 runc 路径正确 # 通常不需要修改除非你将 runc 安装在了非标准路径。启动 containerd 并安装 Dockersudo systemctl enable --now containerd sudo dnf install -y docker-ce docker-ce-cli # 此时 docker-ce 会依赖已安装的 containerd而不会安装 x86_64 版本。5.2 验证问题是否解决执行最简单的测试命令docker run --rm hello-world如果看到类似以下的输出则表明容器已能成功创建和运行Hello from Docker! This message shows that your installation appears to be working correctly. ...也可以运行一个更实用的测试docker run -it --rm alpine:latest /bin/sh # 进入容器后执行 cat /etc/os-release uname -m在龙芯主机上容器内uname -m可能仍然显示x86_64或aarch64这取决于你拉取的镜像架构。你需要寻找或构建loongarch64架构的镜像。例如可以尝试# 拉取一个多架构镜像Docker会自动选择适合主机的版本如果仓库支持 docker run --rm -it busybox:latest uname -m如果仓库有loongarch64的 busybox 镜像则会输出loongarch64。6. 最佳实践与工程建议在龙芯等国产化平台上使用 Docker除了解决基本的安装问题还需要遵循一些最佳实践以确保环境的稳定和安全。6.1 镜像与架构管理使用多架构镜像在 Docker Hub 或私有仓库中寻找支持linux/loongarch64平台的镜像。你可以使用docker manifest inspect命令来查看一个镜像是否支持多架构。docker manifest inspect alpine:latest | grep architecture自行构建镜像对于没有 LoongArch 版本的基础镜像或应用镜像你需要在自己的龙芯机器上使用Dockerfile进行构建。确保FROM指令的基础镜像是兼容的例如使用 AnolisOS 官方基础镜像。# 示例 Dockerfile基于 AnolisOS FROM anolisos/anolisos:8.8-loongarch64 RUN yum install -y your-package CMD [/bin/bash]构建命令docker build -t my-app:loongarch64 .6.2 存储与性能优化使用 Overlay2 存储驱动这是最稳定、性能最好的选择。确保/etc/docker/daemon.json中配置正确通常默认即可。{ “storage-driver”: “overlay2” }数据持久化对于数据库等有状态服务务必使用volumes或bind mounts将数据存储在宿主机上避免容器销毁后数据丢失。docker run -d -v /path/on/host:/path/in/container my-db-image6.3 安全配置非 Root 用户运行尽管方便但让容器内的进程以 root 运行存在风险。在Dockerfile中使用USER指令指定非 root 用户。限制资源使用--cpus、--memory、--pids-limit等参数限制容器资源使用防止单个容器耗尽主机资源。docker run -d --name my-app --cpus“1.5” --memory“512m” my-app-image定期更新定期更新 Docker 引擎、容器镜像和宿主机系统以修复安全漏洞。6.4 网络与编排自定义网络对于多容器应用使用自定义的 Docker 网络docker network create来隔离和管理容器间的通信这比默认的bridge网络更灵活。考虑 Docker Compose对于复杂的多服务应用使用docker-compose.yml文件来定义和运行所有服务能极大简化管理。确保安装的docker-compose版本兼容你的 Docker 引擎和架构。7. 常见问题与排查思路即使成功安装并运行了第一个容器后续仍可能遇到其他问题。这里汇总一个快速排查清单。问题现象可能原因排查步骤与解决方案docker pull速度慢或失败1. 网络问题2. 镜像仓库地址不可达3. 没有该架构的镜像1. 检查网络连通性 (ping 8.8.8.8)。2. 配置国内镜像加速器如中科大、阿里云镜像。修改/etc/docker/daemon.json。3. 使用docker pull --platform linux/loongarch64 image明确指定架构。容器启动后立即退出1. 容器内主进程执行完毕退出。2. 启动命令错误。3. 缺少必要的环境变量或卷。1. 使用docker logs container-id查看退出前的日志。2. 检查Dockerfile中的CMD或ENTRYPOINT。3. 使用docker run -it image /bin/sh交互式进入容器排查。容器内无法解析域名Docker 容器默认使用宿主机的 DNS 配置可能有问题。1. 检查宿主机的/etc/resolv.conf。2. 在docker run时指定 DNS--dns 8.8.8.8。3. 在/etc/docker/daemon.json中配置dns。Permission denied错误1. 用户不在docker组。2.docker.sock权限问题。3. SELinux 限制。1. 执行groups确认当前用户是否在docker组。2. 检查/var/run/docker.sock的权限应为rw给docker组。3. 临时setenforce 0测试或配置 SELinux 策略。磁盘空间不足Docker 镜像、容器、卷占用过多空间。1. 使用docker system df查看磁盘使用情况。2. 清理无用资源docker system prune -a谨慎使用会删除所有未使用的镜像、容器、网络、卷。8. 总结在龙芯 3B6000 平台上部署 AnolisOS 23.4 并运行 Docker是一次典型的国产化软硬件环境适配实践。核心挑战往往来自于软件生态的架构兼容性尤其是像runc这样的底层运行时组件。本文的解决路径可以概括为确认环境 - 常规安装 - 遇错诊断 - 锁定架构兼容性 - 编译/替换正确架构的 runc - 验证成功。这个思路不仅适用于 Docker也适用于在龙芯等其他非 x86 架构上部署任何复杂软件。成功运行 Docker 只是第一步。接下来你可以为你的应用构建loongarch64架构的 Docker 镜像。探索使用 Docker Compose 编排多容器应用。研究如何将现有的 CI/CD 流水线适配到龙芯平台。关注容器安全实践如镜像漏洞扫描、最小化基础镜像等。国产化平台的软件生态建设需要社区和开发者的共同参与。遇到问题时的排查、解决和经验分享正是推动生态完善的重要过程。希望这篇详细的指南能帮助你在龙芯平台上顺利开启容器化之旅。如果在实践中遇到新的问题欢迎在社区交流探讨共同积累在自主可控技术栈上的宝贵经验。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度