这次我们来看一个在龙芯 3B6000 平台上,使用 AnolisOS 23.4 系统时,通过默认仓库安装 Docker 后,容器无法创建的具体问题。对于国产化平台的开发者或运维人员来说,在龙芯架构上顺利运行 Docker 是进行应用容器化部署的关键一步。然而,直接使用系统默认仓库安装的 Docker 版本,可能会遇到容器引擎启动失败、镜像拉取错误或容器创建进程卡住等一系列问题,导致容器化工作流中断。

本文将直接切入主题,先分析问题现象与核心原因,再提供一套从环境检查、问题定位到最终解决的完整实操方案。重点不是复述通用的 Docker 安装命令,而是聚焦于龙芯 3B6000 + AnolisOS 23.4 这一特定组合下的兼容性陷阱和解决方案。如果你正在或计划在龙芯平台上部署容器服务,这篇文章提供的排查思路和修复步骤可以直接应用。

1. 核心问题速览

在深入操作之前,我们先快速了解问题的全貌。下表概括了在龙芯 3B6000 + AnolisOS 23.4 环境下,使用默认仓库安装 Docker 时可能遇到的核心障碍:

问题环节 典型现象 核心原因
Docker 服务启动 执行 systemctl start docker 失败,提示 Failed to start Docker Application Container Engine. 默认安装的 Docker 版本(如 20.10.24 )与当前内核或系统库存在兼容性问题,或 containerd 配置异常。
容器创建与运行 执行 docker run hello-world 命令卡住无输出,或报错 docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: ... 容器运行时(如 runc )与龙芯架构的适配问题,或 seccomp 安全配置不支持。
镜像拉取与运行 拉取镜像成功,但运行时报错 exec format error 拉取的镜像架构(如 amd64 )与宿主机的 loongarch64 架构不匹配。
网络与存储 容器内部网络不通,或卷挂载失败 网络驱动(如 bridge )初始化问题,或文件系统特性(如 overlay2 )支持不完整。

本文将围绕上述问题,提供从验证到解决的一站式指南。

2. 环境准备与现状确认

在开始修复之前,必须明确你的系统环境。请依次执行以下命令,收集关键信息。

1. 确认系统与内核版本:

cat /etc/os-release
uname -a

对于 AnolisOS 23.4 on 龙芯 3B6000,输出应类似:

NAME="Anolis OS"
VERSION="23.4"
ID="anolis"
...
Linux localhost 5.10.xxx-loongarch64 #1 SMP ... loongarch64 loongarch64 loongarch64 GNU/Linux

请记录下完整的内核版本号。

2. 确认当前 Docker 安装状态与版本:

# 检查Docker是否已安装及其版本
docker --version
# 或使用更详细的命令
docker version

# 检查Docker服务状态
systemctl status docker

如果通过默认仓库安装,版本可能为 20.10.24 或类似。服务状态很可能显示为 failed 或 inactive (dead) 。

3. 检查 containerd 状态: Docker 依赖 containerd 作为底层运行时。

systemctl status containerd

如果 containerd 也未正常运行,那么问题可能出在更底层。

4. 查看 Docker 服务启动日志: 这是定位启动失败原因的最直接方法。

sudo journalctl -u docker.service --no-pager -n 50

仔细查看日志末尾的 error 信息,常见的错误线索包括:

  • failed to start daemon: Error initializing network controller: ... (网络控制器初始化失败)
  • error starting containerd: ... (containerd启动错误)
  • seccomp is not supported (安全计算模块不支持)
  • 与 runc 或 cgroup 相关的错误。

完成以上信息收集后,你已经对问题有了初步定位。接下来,我们进入具体的排查与解决流程。

3. 彻底卸载旧版本 Docker

如果 Docker 服务无法正常启动,建议先进行彻底卸载,清理可能存在的配置冲突。 注意:此操作会删除所有本地镜像、容器、卷和网络,请务必先备份重要数据。

# 1. 停止Docker相关服务
sudo systemctl stop docker
sudo systemctl stop containerd

# 2. 卸载Docker引擎及相关软件包
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  containerd.io \
                  runc

# 3. 删除Docker相关数据和目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

# 4. 删除残留的配置文件(谨慎操作,确保无自定义配置)
sudo rm -rf /etc/docker
sudo rm -rf /etc/containerd

4. 安装适配龙芯架构的 Docker 版本

默认的 yum install docker 命令安装的版本可能未经充分适配。我们需要寻找或确认一个能在龙芯 3B6000 (loongarch64) 上稳定运行的 Docker 版本。有以下几个途径:

途径一:使用 AnolisOS 官方或社区提供的适配版本 访问 Anolis OS 的官方镜像站或社区仓库,查看是否有针对 loongarch64 架构的、经过测试的 Docker 软件包。安装命令可能类似:

# 示例,具体仓库地址需根据实际情况查找
sudo yum install docker-ce-<适配版本> docker-ce-cli-<适配版本> containerd.io

途径二:从源码编译安装(适用于高级用户) 如果找不到预编译包,可以考虑从 Docker 或 containerd 的源码进行编译。此过程复杂,需要完整的开发环境和较长时间。

  1. 准备编译环境:安装 gcc , make , git 等。
  2. 获取源码:从 GitHub 克隆 moby/docker , containerd/containerd , opencontainers/runc 等仓库。
  3. 针对 loongarch64 架构进行交叉编译或本地编译。
  4. 手动安装编译产物。

途径三:采用容器化方式安装(如使用 systemd-nspawn 或第三方工具) 这不是主流方案,仅作为备选思路。

对于大多数用户,建议优先尝试途径一。 如果官方仓库没有明确标识,可以尝试安装较新的稳定版,例如 Docker CE 24.0.x 或 25.0.x 系列,这些版本对新型架构的支持可能更好。安装命令示例如下(需要先配置正确的仓库源):

# 添加Docker官方CE仓库(注意:官方可能不直接提供loongarch64包,此处为示例流程)
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装指定版本,例如 24.0.9
sudo yum install docker-ce-24.0.9 docker-ce-cli-24.0.9 containerd.io docker-buildx-plugin docker-compose-plugin

5. 关键配置调整

安装完成后,直接启动可能依然失败,需要对 Docker 和 containerd 的配置进行针对性调整。

1. 配置 Docker 守护进程 (daemon.json) 创建或编辑 /etc/docker/daemon.json 文件:

{
  “exec-opts”: [“native.cgroupdriver=systemd”],
  “log-driver”: “json-file”,
  “log-opts”: {
    “max-size”: “100m”
  },
  “storage-driver”: “overlay2”,
  “storage-opts”: [
    “overlay2.override_kernel_check=true”
  ],
  “default-runtime”: “runc”,
  “runtimes”: {
    “runc”: {
      “path”: “runc”
    }
  },
  “registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn”]
}

重点说明:

  • “storage-driver”: “overlay2” :这是推荐的文件系统驱动。
  • “overlay2.override_kernel_check=true” : 这个选项有时至关重要 。它让 Docker 忽略内核对于 overlay2 的某些严格检查,在龙芯内核可能未完全暴露某些特性时,允许驱动继续工作。
  • “registry-mirrors” :配置国内镜像加速器,可以极大提升拉取镜像的速度。

2. 配置 containerd 编辑 /etc/containerd/config.toml 文件。如果文件不存在,可以先生成默认配置:

sudo containerd config default | sudo tee /etc/containerd/config.toml

然后,需要修改其中与沙箱(sandbox)相关的配置。找到 [plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options] 部分,确保或添加 SystemdCgroup = true 。同时,检查 sandbox_image 是否指向一个可拉取的、支持 loongarch64 的暂停容器镜像,例如:

sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.9”

3. 处理 seccomp 问题 龙芯架构的内核对 seccomp 的支持可能不完整。如果日志中出现 seccomp 相关错误,可以尝试在启动容器时全局禁用 seccomp( 注意:这会降低安全性,仅用于测试和问题定位 )。 在 /etc/docker/daemon.json 中添加:

{
  …,
  “seccomp-profile”: “”
}

或者在运行单个容器时使用 –security-opt seccomp=unconfined 参数。

6. 启动服务与验证基础功能

完成配置后,启动服务并验证。

# 1. 重新加载systemd配置并启动服务
sudo systemctl daemon-reload
sudo systemctl start containerd
sudo systemctl start docker

# 2. 设置开机自启
sudo systemctl enable containerd docker

# 3. 检查服务状态
sudo systemctl status docker
sudo systemctl status containerd

此时,两个服务的状态应为 active (running) 。

4. 运行测试容器 现在尝试运行一个最简单的容器。 关键点:必须使用支持 loongarch64 架构的镜像。 直接运行 docker run hello-world 很可能会失败,因为 Docker Hub 上的官方 hello-world 镜像可能没有 loongarch64 的版本。

我们可以运行一个架构无关的、极简的容器来测试 Docker 引擎本身是否工作:

# 使用busybox镜像,它通常提供多架构支持
docker run --rm busybox echo “Hello, LoongArch!”

如果命令成功执行并输出了 “Hello, LoongArch!”,恭喜你,Docker 引擎已经可以正常创建和运行容器了。

如果 busybox 也失败,可以尝试显式指定一个已知支持 loongarch64 的镜像,或者自己构建一个。例如,使用一个基础的 alpine 镜像(需确认有 loongarch64 标签):

docker run --rm alpine:edge uname -a

7. 解决“exec format error”与镜像架构问题

当 Docker 服务本身运行正常,但运行特定镜像报错 exec format error 时,这几乎 100% 是镜像架构与宿主机不匹配造成的。龙芯 3B6000 是 loongarch64 架构,而 Docker Hub 上大多数镜像默认是 linux/amd64 。

解决方案:

  1. 寻找多架构镜像 :在拉取镜像时,使用明确支持 linux/loongarch64 的标签。例如,一些官方镜像(如 nginx 、 redis )和社区维护的镜像已经开始提供多架构支持。

    # 拉取时,可以尝试指定标签,如 `-alpine` 版本有时更早支持新架构
    docker pull nginx:alpine
    # 拉取后检查镜像架构
    docker image inspect nginx:alpine | grep Architecture
    
  2. 使用 docker buildx 构建自己的镜像 :这是最根本的解决方案。 docker buildx 支持跨平台构建。你可以在 x86_64 的机器上,为 loongarch64 构建镜像。

    • 首先确保安装了 buildx 插件。
    • 创建一个新的构建器实例,支持多平台:
      docker buildx create --name mybuilder --use
      docker buildx inspect --bootstrap
      
    • 编写 Dockerfile ,然后使用 buildx 构建并推送到镜像仓库:
      docker buildx build --platform linux/loongarch64 -t your-image:tag . --push
      
    • 在龙芯机器上,直接拉取 your-image:tag 即可。
  3. 使用 QEMU 用户态模拟(不推荐用于生产) :可以安装 qemu-user-static 来模拟运行 amd64 或 arm64 的镜像。但这会带来显著的性能开销和兼容性问题,仅作为临时测试手段。

    # 在宿主机上注册QEMU模拟器
    docker run --privileged --rm tonistiigi/binfmt --install all
    # 之后尝试运行为其他架构构建的镜像,Docker会自动调用QEMU
    

8. 网络与存储高级问题排查

如果基础容器能运行,但自定义容器出现网络不通或存储问题,请按以下步骤排查。

网络问题排查:

  1. 检查 Docker 网络接口:
    ip addr show docker0
    docker network ls
    docker network inspect bridge
    
    如果 docker0 网桥不存在,可以尝试重启 Docker 服务或手动创建。
  2. 检查 iptables / nftables 规则。Docker 会管理大量网络规则,有时与现有防火墙规则冲突。可以暂时停止防火墙服务 ( systemctl stop firewalld ) 测试是否为防火墙问题。
  3. 检查容器内部 DNS 配置。在运行容器时,可以指定 DNS 服务器:
    docker run --dns 8.8.8.8 --dns 114.114.114.114 --rm busybox nslookup baidu.com
    

存储问题排查:

  1. 确认内核支持 overlay2 :
    grep overlay /proc/filesystems
    
    应看到 nodev overlay 。
  2. 检查 overlay2 所需的内核模块是否加载:
    lsmod | grep overlay
    
  3. 如果使用 devicemapper 等其它存储驱动,在龙芯平台上可能遇到更多问题,强烈建议使用 overlay2 。

9. 完整安装与验证流程示例

假设我们从一个干净的 AnolisOS 23.4 系统开始,以下是一个综合性的步骤示例:

# 步骤1:更新系统并安装基础工具
sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 步骤2:添加可靠的Docker CE仓库(这里以阿里云镜像为例,需确认支持loongarch64)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 步骤3:安装Docker引擎和命令行工具
# 先搜索可用版本,选择较新的稳定版,例如 25.0.x
sudo yum list docker-ce --showduplicates | sort -r
sudo yum install -y docker-ce-25.0.3 docker-ce-cli-25.0.3 containerd.io docker-buildx-plugin docker-compose-plugin

# 步骤4:配置Docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
  “exec-opts”: [“native.cgroupdriver=systemd”],
  “log-driver”: “json-file”,
  “log-opts”: {
    “max-size”: “100m”
  },
  “storage-driver”: “overlay2”,
  “storage-opts”: [
    “overlay2.override_kernel_check=true”
  ],
  “registry-mirrors”: [“https://<你的镜像加速器地址>.mirror.aliyuncs.com”]
}
EOF

# 步骤5:配置containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# 重启containerd使配置生效
sudo systemctl restart containerd

# 步骤6:启动并启用Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 步骤7:验证安装
sudo docker --version
sudo systemctl status docker
sudo docker run --rm hello-world  # 如果此步失败,参考第6、7节使用busybox测试

10. 常见问题与排查方法总结

下表将常见问题、现象、可能原因和解决方案进行了归纳,便于快速查阅:

问题现象 可能原因 排查命令/位置 解决方案
Failed to start Docker Application Container Engine 1. 版本不兼容
2. containerd 故障
3. 存储驱动问题
sudo journalctl -u docker.service -n 50 1. 更换Docker版本
2. 检查并配置 /etc/containerd/config.toml
3. 在 daemon.json 中添加 “overlay2.override_kernel_check=true”
OCI runtime create failed 1. runc 执行失败
2. seccomp 配置问题
docker info 查看默认运行时 1. 确保 runc 已正确安装
2. 在 daemon.json 中设置 “seccomp-profile”: “” 或容器启动时加 –security-opt seccomp=unconfined
exec format error 镜像架构 ( amd64 ) 与宿主机 ( loongarch64 ) 不匹配 `docker image inspect <镜像名> grep Architecture`
容器内网络不通 1. docker0 网桥未创建
2. iptables 规则冲突
3. DNS解析失败
ip addr show docker0
sudo iptables -L -n
容器内 cat /etc/resolv.conf
1. 重启Docker服务
2. 调整或停止防火墙
3. 运行容器时指定 –dns
端口绑定失败 宿主机端口已被占用 `sudo ss -tlnp grep :<端口号>`
启动容器后立即退出 1. 容器内主进程执行完毕
2. 镜像默认命令不适用于当前架构
docker logs <容器ID> 1. 使用 -it 交互模式运行
2. 检查镜像的 CMD 或 ENTRYPOINT ,确保命令存在且可执行

在龙芯 3B6000 平台上部署 Docker 的核心挑战在于软件生态的适配。成功的关键在于三点:一是选择或编译一个与 loongarch64 架构及当前内核兼容的 Docker/containerd/runc 版本组合;二是进行正确的配置,特别是 overlay2 驱动和 seccomp 的调整;三是始终使用与目标架构匹配的容器镜像。

建议将稳定的配置(如有效的 daemon.json 、 config.toml 和安装的软件包版本)进行备份。在进行生产部署前,务必对网络、存储、应用性能进行充分测试。随着龙芯生态的快速发展,相信官方仓库的兼容性和软件包的丰富度会持续提升,届时安装过程将会更加顺畅。

更多推荐