国产麒麟系统(arm64)离线部署Docker全家桶:从下载到启动的保姆级避坑记录
国产麒麟系统(arm64)离线部署Docker全家桶实战指南
在国产化替代浪潮中,麒麟操作系统凭借其安全可靠的特性,正逐步成为企业级应用的新选择。然而,当我们将目光投向实际生产环境,尤其是那些对网络隔离有严格要求的场景时,如何在arm64架构的麒麟系统上离线部署Docker生态,就成了许多运维团队面临的现实挑战。
不同于常见的x86环境,arm64架构下的软件生态存在诸多特殊性——从依赖库的版本匹配到系统服务的配置细节,稍有不慎就会陷入"依赖地狱"。本文将基于真实的企业级部署经验,带你系统性地攻克麒麟系统离线部署Docker全家桶的各个技术难点,避开那些耗费我们团队大量调试时间的"深坑"。
1. 环境准备与架构确认
在开始部署前,我们需要对目标服务器进行全面的环境检查。不同于常规的x86服务器,arm64架构的麒麟系统在软件兼容性方面有其特殊性。通过以下命令可以获取系统关键信息:
# 查看内核版本与系统信息 uname -a # 确认处理器架构 uname -m # 检查操作系统发行版 cat /etc/os-release典型的输出结果可能如下:
Linux kylin-server 4.19.90-24.4.v2101.ky10.aarch64 #1 SMP Mon May 24 14:45:37 CST 2021 aarch64 aarch64 aarch64 GNU/Linux aarch64 NAME="Kylin Linux Advanced Server" VERSION="V10 (Tercel)" ID="kylin" VERSION_ID="V10" PRETTY_NAME="Kylin Linux Advanced Server V10 (Tercel)"特别注意:麒麟系统存在多个衍生版本(如银河麒麟、中标麒麟等),不同版本的基础库可能存在差异。建议在测试环境验证通过后再部署到生产环境。
离线部署需要预先准备以下资源包:
| 资源类型 | 推荐版本 | 下载来源 |
|---|---|---|
| Docker二进制包 | 20.10.7 | 官方静态二进制发布页 |
| Docker-compose | v2.17.2 | GitHub官方Release |
| 依赖库合集 | 根据系统版本 | 麒麟软件仓库 |
提示:建议在可联网环境中预先下载所有依赖包,并使用
sha256sum校验文件完整性,避免因下载不完整导致的安装失败。
2. Docker核心组件离线安装
2.1 Docker引擎部署
将准备好的Docker二进制包(如docker-20.10.7.tgz)上传至服务器后,执行以下步骤:
# 解压安装包 tar -xvf docker-20.10.7.tgz # 将二进制文件复制到系统路径 cp docker/* /usr/bin/ # 验证可执行权限 ls -l /usr/bin/dockerd此时直接运行docker version可能会遇到依赖缺失的错误。在麒麟系统上,常见的缺失依赖包括:
- libseccomp.so.2
- libltdl.so.7
- libdevmapper.so.1.02
可以通过以下方式解决依赖问题:
# 查找系统现有库文件 find / -name "libseccomp*" 2>/dev/null # 手动创建软链接(示例) ln -s /usr/lib64/libseccomp.so.2.4.1 /usr/lib64/libseccomp.so.22.2 Systemd服务配置
创建/etc/systemd/system/docker.service文件,内容如下:
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target关键配置说明:
Type=notify:确保systemd能正确监控服务状态Delegate=yes:解决cgroups权限问题TimeoutStartSec=0:避免长时间等待超时
激活服务并启动:
systemctl daemon-reload systemctl enable docker systemctl start docker3. Docker-compose离线部署
针对arm64架构,需要特别注意选择正确的二进制版本:
# 安装docker-compose cp docker-compose-linux-aarch64 /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose version常见问题处理:
GLIBC版本不兼容:
/usr/local/bin/docker-compose: /lib64/libc.so.6: version `GLIBC_2.28' not found解决方案:使用静态编译版本或从麒麟软件源安装兼容版本
动态链接库缺失:
error while loading shared libraries: libz.so.1: cannot open shared object file解决方案:
yum install -y zlib # 在线环境 或手动部署离线rpm包
4. 离线镜像仓库搭建与使用
在完全离线的环境中,常规的docker pull无法使用,需要预先准备镜像归档文件:
# 在联网环境导出镜像 docker save -o nginx.tar nginx:alpine # 在离线环境加载镜像 docker load -i nginx.tar对于多服务组合的场景,推荐使用离线仓库方案:
简易仓库部署:
docker run -d -p 5000:5000 --restart always --name registry registry:2镜像推送与拉取:
# 标记镜像 docker tag nginx:alpine localhost:5000/nginx # 推送镜像 docker push localhost:5000/nginx
注意:麒麟系统默认的防火墙规则可能会阻止仓库访问,需适当配置:
firewall-cmd --permanent --add-port=5000/tcp firewall-cmd --reload
5. 典型问题排查指南
5.1 服务启动失败排查
当systemctl start docker失败时,按以下步骤诊断:
# 查看详细日志 journalctl -xe -u docker # 手动运行dockerd查看输出 /usr/bin/dockerd --debug常见错误及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| Failed to start Docker Application Container Engine | 内核模块缺失 | 加载overlay模块:modprobe overlay |
| Cannot connect to the Docker daemon | 权限配置错误 | 将用户加入docker组:usermod -aG docker $USER |
| iptables failed | 防火墙冲突 | 禁用firewalld或配置规则 |
5.2 容器网络异常处理
在arm64架构下,某些网络驱动可能需要额外配置:
# 检查网络插件状态 docker network inspect bridge # 明确指定网络驱动 docker run --network bridge --rm alpine ping www.example.com对于自定义网络,建议在docker-compose.yml中明确指定:
version: '3' services: web: image: nginx:alpine networks: - mynet networks: mynet: driver: bridge driver_opts: com.docker.network.bridge.name: mynet6. 生产环境优化建议
经过多次实际部署验证,我们总结出以下优化配置:
内核参数调整:
# 增加最大文件描述符 echo "fs.file-max = 1000000" >> /etc/sysctl.conf # 容器日志大小限制 echo "{\"log-driver\":\"json-file\",\"log-opts\":{\"max-size\":\"10m\",\"max-file\":\"3\"}}" > /etc/docker/daemon.json存储驱动选择: 在麒麟系统上,推荐使用overlay2存储驱动:
# 确认内核支持 lsmod | grep overlay # 配置daemon.json { "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] }资源限制配置: 对于多容器共存的场景,建议通过cgroups限制资源:
# 内存限制示例 docker run -it --memory 512m --memory-swap 1g alpine sh在docker-compose中可配置:
services: redis: image: redis:alpine deploy: resources: limits: cpus: '0.5' memory: 512M经过这些优化后,我们的生产环境容器稳定性显著提升,系统资源利用率也更加均衡。特别是在高密度部署场景下,避免了因单个容器异常导致的系统级故障。
