1. 在openEuler 22.03 LTS (aarch64)系统离线安装Docker 26.1.3全记录
作为长期在ARM架构服务器上部署容器化服务的运维工程师,我经常需要在无外网访问的生产环境中安装Docker。最近在openEuler 22.03 LTS (aarch64)系统上部署Docker 26.1.3时,遇到了一些值得记录的细节问题。本文将完整呈现从环境准备到服务验证的全过程,特别针对离线环境的特点提供解决方案。
2. 环境准备与旧版本清理
2.1 系统环境确认
首先需要确认系统架构和版本是否匹配:
bash复制cat /etc/openEuler-release
uname -m
openEuler 22.03 LTS是为ARM架构优化的国产操作系统,其软件仓库中的Docker版本往往较旧。我实测发现官方源提供的Docker版本为19.03,无法满足新特性需求。
2.2 彻底卸载旧版Docker
在安装新版前,必须完全清理旧版本,避免残留配置冲突。执行以下完整清理流程:
bash复制# 停止所有运行中的容器
docker stop $(docker ps -aq)
# 停止Docker服务
systemctl stop docker
systemctl disable docker
# 移除软件包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 清理残留文件和目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker
# 清理依赖包
sudo yum autoremove
注意:/var/lib/docker目录可能包含重要的镜像和容器数据,清理前请确认已备份必要数据。生产环境中建议先执行
docker ps -a和docker images确认无重要内容。
3. 离线安装包获取与部署
3.1 获取ARM架构的Docker静态二进制包
在有网络的环境中访问Docker官方仓库:
bash复制wget https://download.docker.com/linux/static/stable/aarch64/docker-26.1.3.tgz
这个静态包包含dockerd、docker-cli等所有必要组件,无需额外依赖。相比RPM包,静态二进制方式更适合离线环境,避免了复杂的依赖关系处理。
3.2 传输安装包到目标机器
使用scp将包传输到目标服务器:
bash复制scp docker-26.1.3.tgz root@target_ip:/opt/
如果目标机完全隔离,可通过U盘等物理介质拷贝。传输后验证文件完整性:
bash复制sha256sum docker-26.1.3.tgz
对比官网提供的校验值,确保文件未损坏。
3.3 解压并部署二进制文件
bash复制mkdir -p /opt/docker
tar -xzvf docker-26.1.3.tgz -C /opt/docker
sudo cp /opt/docker/docker/* /usr/bin/
sudo chmod +x /usr/bin/docker*
sudo chmod +x /usr/bin/containerd*
sudo chmod +x /usr/bin/runc
关键点说明:
- 创建/opt/docker目录作为工作目录,避免污染系统默认路径
- 所有二进制文件复制到/usr/bin/保证全局可用
- 显式设置可执行权限,避免权限问题导致服务启动失败
4. 服务配置与优化
4.1 配置systemd单元文件
创建/etc/systemd/system/docker.service文件:
ini复制[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=containerd.service
[Service]
Type=notify
Environment="TMPDIR=/home/docker/tmp"
ExecStart=/usr/bin/dockerd --data-root=/home/docker --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
关键配置解析:
--data-root=/home/docker:将镜像和容器数据存储到指定目录,避免默认的/var/lib/docker空间不足Type=notify:使用systemd通知机制,优化服务状态管理- 资源限制设置为infinity:避免容器运行时遇到资源限制问题
4.2 配置containerd服务
创建/etc/systemd/system/containerd.service文件:
ini复制[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
重要提示:containerd是Docker的底层运行时组件,必须正确配置才能保证Docker正常工作。在ARM架构上尤其要注意内核模块加载情况。
5. 服务启动与验证
5.1 加载配置并启动服务
bash复制# 重载systemd配置
sudo systemctl daemon-reload
# 启动containerd并设置开机自启
sudo systemctl enable --now containerd
# 启动Docker服务
sudo systemctl start docker
# 验证服务状态
sudo systemctl status containerd docker
正常输出应显示两个服务均为active (running)状态。如果containerd启动失败,常见原因是内核模块未加载:
bash复制# 检查overlay模块
lsmod | grep overlay
# 手动加载模块
sudo modprobe overlay
5.2 基本功能测试
bash复制# 验证Docker版本
docker version
# 运行测试容器
docker run --rm hello-world
在ARM架构上运行x86镜像会遇到平台不匹配错误,应使用ARM兼容的镜像:
bash复制docker run --rm arm64v8/hello-world
6. 常见问题与解决方案
6.1 存储路径配置问题
问题现象:Docker启动失败,日志显示"failed to start daemon: error initializing graphdriver"
解决方案:
- 确保--data-root指向的目录存在且可写
- 检查文件系统类型,推荐使用XFS或ext4
- 确认SELinux状态,临时禁用测试:
bash复制
setenforce 0
6.2 容器网络异常
问题现象:容器无法访问外部网络
排查步骤:
bash复制# 检查iptables规则
sudo iptables -L
# 检查bridge网络
docker network inspect bridge
# 重启Docker服务
sudo systemctl restart docker
6.3 性能调优建议
针对ARM架构的优化建议:
- 调整swappiness值减少交换内存使用:
bash复制echo 'vm.swappiness=10' >> /etc/sysctl.conf sysctl -p - 为Docker分配单独的磁盘,避免IO竞争
- 使用
--cgroupdriver=systemd参数保持与系统一致
7. 后续维护建议
-
日志管理:配置日志轮转防止磁盘占满
bash复制sudo mkdir -p /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF -
离线镜像加载:将预先导出的镜像传输到目标机后加载
bash复制
docker load -i saved_image.tar -
版本升级:下载新版静态包后,重复安装流程即可。建议先测试再升级生产环境。
通过这套完整的离线安装方案,我在多个openEuler aarch64环境中成功部署了Docker 26.1.3。相比在线安装方式,静态二进制部署更加可控,特别适合对安全隔离要求高的生产环境。