简介:本资源为麒麟V10 X86架构下的Docker离线一键安装包,面向在国产化信创环境中部署容器服务、且无法访问外网的运维与开发人员。包内共4个文件,以2个sh安装脚本、1个tgz与1个gz压缩包为主,脚本负责自动化安装与数据库镜像导入,压缩包则承载Docker引擎及配套镜像,整体约280.67MB,可满足离线场景下快速搭建容器运行环境的需求。目前已有328人学习下载,适合需要在内网或隔离网络中完成Docker部署的技术人员参考。资源将安装流程脚本化,读者可借助一键脚本减少手动配置环节,同时结合镜像包完成数据库等组件的离线导入,便于在麒麟V10 X86平台上快速验证容器化方案,降低因网络受限带来的部署门槛。
1. 麒麟V10 X86 离线一键安装包:内网里把 Docker 装明白的那条路
在麒麟 V10 X86 桌面版或服务器版上装 Docker,联网环境下一条yum或apt命令就能解决,但真正让人头疼的是内网、涉密网、生产隔离区这类完全断网的场景。麒麟 V10 自带的软件源里 Docker 版本往往偏旧,直接yum install docker拉到的可能是 18.09 甚至更早,而业务侧又要求 Docker 26 加 docker compose v2 这套组合。所谓「离线一键安装包」,本质是把 Docker 的二进制文件、systemd 单元、compose 插件、依赖库和安装脚本打包成一个自解压目录,拷进目标机器后执行一条命令完成部署。它解决的是「没有外网、没有本地源、还要指定版本」这三重约束下的安装问题,适合运维、交付工程师和需要在麒麟 V10 X86 上跑容器化业务的人。下面按我实际交付过的路径,把包怎么做、怎么装、坑在哪讲清楚。
2. 离线包到底装了什么:Docker 26 与 compose v2 的组件拆解
2.1 为什么不用麒麟自带源里的 Docker
麒麟 V10 的官方源里 Docker 版本普遍停留在 18.09 或 19.03,这个版本区间对 cgroup v2、nftables 后端、compose v2 的支持都不完整。更麻烦的是,麒麟 V10 部分版本默认启用了 cgroup v2,老版本 Docker 在 cgroup v2 环境下会出现容器启动后资源限制不生效、docker stats读不到数据的情况。我遇到过一台麒麟 V10 SP1 服务器,用源里装的 18.09 跑 MySQL 8.0,容器能起来但内存限制形同虚设,最后 OOM 把宿主机拖垮。所以离线包的第一原则是:不依赖系统源,直接用官方静态二进制。
Docker 官方为 Linux 提供了静态编译的二进制包,包含dockerd、docker、containerd、runc、docker-proxy等全部可执行文件,不依赖发行版的 glibc 之外的库。麒麟 V10 X86 基于 glibc 2.28 左右,跑 Docker 26 的静态二进制没有问题。compose v2 则是一个独立的 Go 二进制docker-compose,放到~/.docker/cli-plugins/或/usr/libexec/docker/cli-plugins/下,Docker CLI 会自动识别为docker compose子命令。
2.2 离线包目录结构与文件清单
一个能用的离线包,目录结构我一般这样组织:
kylin-docker-offline/ ├── install.sh # 主安装脚本 ├── uninstall.sh # 卸载脚本 ├── bin/ │ ├── docker # Docker CLI 静态二进制 │ ├── dockerd # Docker 守护进程 │ ├── containerd # 容器运行时 │ ├── containerd-shim-runc-v2 │ ├── ctr # containerd CLI │ ├── runc # OCI 运行时 │ ├── docker-proxy │ └── docker-compose # compose v2 插件二进制 ├── systemd/ │ ├── docker.service │ ├── docker.socket │ └── containerd.service ├── config/ │ └── daemon.json # 默认守护进程配置 └── README.md这里每个文件都有明确用途。dockerd是守护进程本体,containerd负责容器生命周期管理,runc是真正创建容器的 OCI 运行时,docker-proxy处理端口映射。docker.socket用于 socket 激活,containerd.service必须先于docker.service启动。daemon.json里我一般预置># 下载 Docker 静态二进制包(含 dockerd、containerd、runc 等) wget https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz # 下载 compose v2 插件二进制 wget https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64 # 解压 Docker 二进制 tar -xzvf docker-26.1.4.tgz # 解压后得到 docker/ 目录,里面是全部可执行文件 ls docker/
docker-26.1.4.tgz解压出来的docker/目录里包含docker、dockerd、containerd、containerd-shim-runc-v2、ctr、runc、docker-proxy等。compose 的二进制下载后重命名为docker-compose,赋予执行权限。这一步的关键是版本对应:Docker 26.1.4 配套的 containerd 是 1.7.18,runc 是 1.1.13,都在这个 tgz 里,不用单独下。
3.2 编写 install.sh 主安装脚本
安装脚本要处理的事:停旧服务、拷贝二进制、写 systemd 单元、写 daemon.json、加载内核模块、启动服务、验证。下面是我用的脚本骨架:
#!/bin/bash set -e # 定义安装路径 BIN_DIR="/usr/bin" SYSTEMD_DIR="/usr/lib/systemd/system" CONFIG_DIR="/etc/docker" CLI_PLUGIN_DIR="/usr/libexec/docker/cli-plugins" DATA_ROOT="/var/lib/docker" # 1. 停止可能存在的旧 Docker 服务 systemctl stop docker docker.socket containerd 2>/dev/null || true # 2. 拷贝二进制文件 install -m 0755 bin/docker bin/dockerd bin/containerd \ bin/containerd-shim-runc-v2 bin/ctr bin/runc bin/docker-proxy \ ${BIN_DIR}/ # 3. 安装 compose v2 插件 mkdir -p ${CLI_PLUGIN_DIR} install -m 0755 bin/docker-compose ${CLI_PLUGIN_DIR}/docker-compose # 4. 写 daemon.json mkdir -p ${CONFIG_DIR} cat > ${CONFIG_DIR}/daemon.json <<'EOF' { "data-root": "/var/lib/docker", "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "exec-opts": ["native.cgroupdriver=systemd"], "storage-driver": "overlay2" } EOF # 5. 安装 systemd 单元 install -m 0644 systemd/containerd.service ${SYSTEMD_DIR}/ install -m 0644 systemd/docker.service ${SYSTEMD_DIR}/ install -m 0644 systemd/docker.socket ${SYSTEMD_DIR}/ # 6. 加载内核模块 modprobe overlay modprobe br_netfilter # 7. 写内核参数 cat > /etc/sysctl.d/99-docker.conf <<'EOF' net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system # 8. 重载并启动 systemctl daemon-reload systemctl enable containerd systemctl start containerd systemctl enable docker systemctl start docker # 9. 验证 docker version docker compose version脚本里每一步都有原因。第 1 步停旧服务是防止二进制被占用;第 2 步用install而不是cp,是为了同时设好权限;第 4 步的exec-opts指定 cgroupdriver 为 systemd,这是麒麟 V10 上避免 cgroup 报错的关键;第 6 步的overlay和br_netfilter模块不加载,overlay2 存储驱动和容器网络都会出问题;第 7 步的ip_forward不开,容器访问外网直接失败。
3.3 systemd 单元文件的关键字段
docker.service里几个字段不能写错:
[Unit] Description=Docker Application Container Engine After=network-online.target containerd.service Requires=containerd.service [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Restart=on-failure Delegate=yes KillMode=process [Install] WantedBy=multi-user.targetAfter和Requires都指向containerd.service,保证启动顺序。Type=notify让 systemd 等 dockerd 发就绪信号,避免误判启动完成。LimitNOFILE设成 1048576,否则容器多了会报too many open files。Delegate=yes允许容器内管理自己的 cgroup,跑 systemd 容器时必须。
3.4 打包与校验
把整个目录打成 tar.gz,并生成校验和:
# 打包 tar -czvf kylin-docker-offline-26.1.4.tar.gz kylin-docker-offline/ # 生成 SHA256 校验和 sha256sum kylin-docker-offline-26.1.4.tar.gz > kylin-docker-offline-26.1.4.tar.gz.sha256 # 目标机器上校验 sha256sum -c kylin-docker-offline-26.1.4.tar.gz.sha256校验和这一步在离线交付里不能省。U 盘拷贝、内网传输都可能损坏文件,装到一半报cannot execute binary file再回头查,成本很高。校验通过后再解压执行install.sh。
4. 在麒麟 V10 X86 上跑通安装:命令、验证与 compose 测试
4.1 目标机器上的安装步骤
把包拷到麒麟 V10 X86 机器上,假设放在/opt下:
# 解压 cd /opt tar -xzvf kylin-docker-offline-26.1.4.tar.gz cd kylin-docker-offline # 赋予脚本执行权限 chmod +x install.sh uninstall.sh # 执行安装(需要 root) sudo ./install.sh安装脚本执行完,最后会打印docker version和docker compose version的输出。如果看到 Client 和 Server 都是 26.1.4,compose 是 v2.27.1,说明装好了。如果 Server 段报Cannot connect to the Docker daemon,说明 dockerd 没起来,去看journalctl -u docker -n 50。
4.2 验证 Docker 与 compose 是否可用
装完必须做三层验证,缺一层都可能在上线后翻车:
# 第一层:守护进程状态 systemctl status docker --no-pager # 期望:active (running) # 第二层:跑一个最小容器 docker run --rm hello-world # 期望:打印 Hello from Docker! # 第三层:compose 功能验证 mkdir -p /tmp/compose-test && cd /tmp/compose-test cat > docker-compose.yml <<'EOF' services: web: image: nginx:alpine ports: - "8080:80" EOF docker compose up -d docker compose ps curl -I http://127.0.0.1:8080 docker compose down第一层看服务,第二层看运行时和镜像拉取(离线环境需要提前docker load镜像),第三层看 compose 插件和端口映射。三层都过,才算真正可用。很多离线包只验证到第二层,结果 compose 插件路径不对,docker compose命令找不到,上线才发现。
4.3 离线镜像的导入与 daemon.json 调优
离线环境没有 registry,镜像得提前docker save成 tar 再docker load:
# 有网机器上导出 docker save -o nginx-alpine.tar nginx:alpine # 目标机器导入 docker load -i nginx-alpine.tar docker images | grep nginxdaemon.json里如果配了registry-mirrors但内网访问不到,Docker 拉镜像会卡在超时。离线环境建议把registry-mirrors留空,或者配内网 registry 地址。># 检查 overlay 模块 lsmod | grep overlay # 如果没有,手动加载 modprobe overlay # 检查 br_netfilter lsmod | grep br_netfilter modprobe br_netfilter # 检查内核参数 sysctl net.ipv4.ip_forward sysctl net.bridge.bridge-nf-call-iptables
如果modprobe报Module not found,说明内核没编进这个模块,得换内核或重新编译。麒麟 V10 默认内核一般带这些模块,但定制版可能裁剪过。这一步在安装前做,比装完再排查省事得多。
5. 离线安装最容易踩的五个坑:现象、原因与解决
5.1 坑一:dockerd 启动报 cgroup 相关错误
现象:systemctl start docker失败,journalctl -u docker里看到failed to create cgroup或cgroup v2 is not supported。
原因:麒麟 V10 部分版本默认启用 cgroup v2,而 daemon.json 里没指定native.cgroupdriver=systemd,或者 containerd 配置和 Docker 不一致。
解决:在/etc/docker/daemon.json里加"exec-opts": ["native.cgroupdriver=systemd"],同时确认/etc/containerd/config.toml里SystemdCgroup = true。改完systemctl restart containerd docker。
5.2 坑二:容器网络不通,ping 外网失败
现象:容器能起来,docker exec进去 ping 宿主机 IP 通,ping 外网或别的容器不通。
原因:net.ipv4.ip_forward没开,或者br_netfilter模块没加载,iptables 规则没生效。
解决:确认/etc/sysctl.d/99-docker.conf里三项都写了,执行sysctl --system,然后systemctl restart docker。如果还不行,检查iptables -t nat -L看 Docker 链有没有生成。
5.3 坑三:compose 命令找不到
现象:docker compose version报docker: 'compose' is not a docker command。
原因:compose 二进制没放到 CLI 插件目录,或者放的位置不对。Docker CLI 只认/usr/libexec/docker/cli-plugins/、/usr/local/lib/docker/cli-plugins/和~/.docker/cli-plugins/这几个路径。
解决:把docker-compose放到/usr/libexec/docker/cli-plugins/下,权限 0755。如果还不行,检查docker info里的Docker Root Dir和 CLI 插件路径配置。
5.4 坑四:overlay2 存储驱动不可用
现象:docker info里 Storage Driver 显示vfs而不是overlay2,或者启动时报failed to mount overlay。
原因:overlay模块没加载,或者/var/lib/docker所在文件系统不支持 overlay2(比如某些网络文件系统)。
解决:modprobe overlay,确认lsmod | grep overlay有输出。如果文件系统不支持,把>#!/bin/bash # check.sh - 离线 Docker 环境自检 echo "=== 1. 服务状态 ===" systemctl is-active containerd && echo "containerd OK" || echo "containerd FAIL" systemctl is-active docker && echo "docker OK" || echo "docker FAIL" echo "=== 2. 版本一致性 ===" docker version --format '{{.Server.Version}}' 2>/dev/null || echo "docker daemon unreachable" docker compose version 2>/dev/null || echo "compose plugin missing" echo "=== 3. 内核模块 ===" lsmod | grep -q overlay && echo "overlay OK" || echo "overlay MISSING" lsmod | grep -q br_netfilter && echo "br_netfilter OK" || echo "br_netfilter MISSING" echo "=== 4. 内核参数 ===" [ "$(sysctl -n net.ipv4.ip_forward)" = "1" ] && echo "ip_forward OK" || echo "ip_forward OFF" [ "$(sysctl -n net.bridge.bridge-nf-call-iptables)" = "1" ] && echo "bridge-nf OK" || echo "bridge-nf OFF" echo "=== 5. 存储驱动 ===" docker info --format '{{.Driver}}' 2>/dev/null | grep -q overlay2 && echo "overlay2 OK" || echo "overlay2 NOT IN USE" echo "=== 6. 最小容器测试 ===" docker run --rm hello-world >/dev/null 2>&1 && echo "run OK" || echo "run FAIL"
这个脚本交付时一起给客户,出问题先跑一遍,六项里哪项 FAIL 就查哪项,比远程猜快得多。版本锁定方面,我习惯在包名里带版本号,比如kylin-docker-offline-26.1.4.tar.gz,同时包里放一个VERSION文件记录 Docker、containerd、runc、compose 四个组件的精确版本。升级时不要原地覆盖,先uninstall.sh再装新包,避免旧二进制残留。
升级路径上,Docker 26 到 27 的离线升级,核心是换二进制和 systemd 单元,daemon.json 一般兼容。但 containerd 大版本升级时,/var/lib/containerd的数据格式可能变,升级前备份这个目录。我吃过一次亏,containerd 1.6 升 1.7 没备份,升级后所有镜像元数据丢失,只能重新 load。从那以后,离线包升级流程里我强制加一步tar -czf containerd-backup.tar.gz /var/lib/containerd,不管客户催得多急都不跳过。希望帮到你。
本文还有配套的精品资源,点击获取