ARM服务器离线部署Docker:从二进制包到生产级配置的深度实践
最近在几个边缘计算和国产化替代的项目里,频繁遇到ARM架构服务器离线部署Docker的需求。这些场景往往是在内网环境、安全隔离区或者网络受限的边缘节点,无法直接访问外部软件仓库。传统的在线安装方式完全失效,而二进制包安装虽然看似简单,实际操作中却会遇到各种意想不到的坑——从权限问题到存储驱动配置,从服务启动失败到镜像拉取超时。
如果你也正在为ARM服务器上的Docker离线部署而头疼,这篇文章或许能帮你少走弯路。我会基于最近在鲲鹏920、飞腾2000+等ARM平台上的实战经验,详细拆解从二进制包获取到生产级配置的全过程,并分享那些官方文档里不会告诉你的细节和解决方案。
1. 环境准备与架构适配
在开始安装之前,我们需要对目标环境有清晰的了解。ARM架构虽然统称为ARM,但实际上有着不同的变体和实现,这直接影响到二进制包的选择和后续的兼容性。
1.1 识别系统架构与内核版本
首先通过几个关键命令确认你的服务器环境:
# 查看CPU架构信息
uname -m
# 查看详细系统信息
cat /etc/os-release
# 查看内核版本
uname -r
常见的ARM架构标识包括:
- aarch64:64位ARM架构,目前主流服务器采用
- armv7l:32位ARMv7架构,多见于旧设备
- armv8l:64位ARMv8架构的32位兼容模式
注意:虽然
aarch64和arm64在大多数情况下是等价的,但某些发行版的包管理器可能会有细微区别。Docker官方仓库通常使用aarch64作为标识。
1.2 系统依赖检查与配置
离线环境意味着所有依赖都需要预先准备。以下是必须检查的系统组件:
| 组件 | 最低要求 | 检查命令 | 备注 |
|---|---|---|---|
| 内核版本 | ≥ 3.10 | uname -r | 建议4.14+以获得更好的容器支持 |
| cgroup支持 | 已启用 | grep cgroup /proc/filesystems | 容器资源隔离的基础 |
| overlay2 | 已启用 | grep overlay /proc/filesystems | Docker推荐的文件系统驱动 |
| iptables | ≥ 1.4 | iptables --version | 容器网络管理 |
| systemd | ≥ 219 | systemctl --version | 服务管理(非必须但推荐) |
如果发现缺少某些内核模块,可能需要重新编译内核或加载模块:
# 临时加载overlay模块
modprobe overlay
# 永久生效(添加到/etc/modules-load.d/)
echo "overlay" >> /etc/modules-load.d/docker.conf
1.3 存储规划与分区建议
在离线环境中,存储配置尤为重要。Docker默认使用/var/lib/docker作为数据目录,但考虑到:
- 系统盘空间通常有限
- 容器镜像和运行时数据可能快速增长
- 备份和迁移的需求
我建议将Docker数据目录独立挂载到专用分区:
# 假设有独立数据盘/dev/sdb
mkfs.ext4 /dev/sdb
mkdir -p /data/docker
# 修改/etc/fstab实现自动挂载
echo "/dev/sdb /data/docker ext4 defaults 0 0" >> /etc/fstab
mount -a
这样不仅避免了系统盘被占满的风险,也便于后续的备份和迁移操作。
2. 二进制包获取与离线部署
2.1 选择合适的Docker版本
Docker官方提供了静态二进制包的下载地址,但版本选择有讲究。不是越新越好,而是要考虑:
- 稳定性优先:生产环境建议选择稳定版而非最新版
- 内核兼容性:较新的Docker版本可能需要更新的内核特性
- 功能需求:是否需要BuildKit、containerd等新特性
官方下载地址结构如下:
https://download.docker.com/linux/static/stable/aarch64/
这里有一个实用的版本选择策略表格:
| Docker版本 | 发布时间 | 推荐场景 | 注意事项 |
|---|---|---|---|
| 20.10.x | 2020-2021 | 稳定生产环境 | 兼容性好,社区支持充分 |
| 23.0.x | 2023 | 新功能需求 | 需要较新内核(≥5.4) |
| 24.0.x | 2023-2024 | 前沿测试 | 可能有不稳定因素 |
2.2 完整离线包获取流程
在有网络的环境中准备离线安装包时,我习惯使用以下脚本一次性获取所有必要组件:
#!/bin/bash
# 准备Docker离线安装包
DOCKER_VERSION="20.10.24"
ARCH="aarch64"
DOWNLOAD_DIR="./docker-offline-${DOCKER_VERSION}"
# 创建下载目录
mkdir -p ${DOWNLOAD_DIR}
# 下载Docker二进制包
wget -P ${DOWNLOAD_DIR} \
"https://download.docker.com/linux/static/stable/${ARCH}/docker-${DOCKER_VERSION}.tgz"
# 下载docker-compose(如果需要)
DOCKER_COMPOSE_VERSION="2.20.3"
wget -P ${DOWNLOAD_DIR} \
"https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-${ARCH}"
# 下载containerd(独立版本,可选)
CONTAINERD_VERSION="1.6.21"
wget -P ${DOWNLOAD_DIR} \
"https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz"
# 创建安装脚本
cat > ${DOWNLOAD_DIR}/install.sh << 'EOF'
#!/bin/bash
set -e
echo "开始安装Docker ${DOCKER_VERSION}..."
# 解压Docker
tar -xzf docker-${DOCKER_VERSION}.tgz
sudo cp docker/* /usr/bin/
# 创建docker用户组
sudo groupadd docker 2>/dev/null || true
# 配置systemd服务
sudo tee /etc/systemd/system/docker.service > /dev/null << 'SERVICE_EOF'
[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
TimeoutStartSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
SERVICE_EOF
echo "Docker安装完成"
EOF
chmod +x ${DOWNLOAD_DIR}/install.sh
echo "离线包准备完成,目录:${DOWNLOAD_DIR}"
echo "包含:"
echo " - Docker ${DOCKER_VERSION} 二进制包"
echo " - docker-compose ${DOCKER_COMPOSE_VERSION}"
echo " - containerd ${CONTAINERD_VERSION}(可选)"
echo " - 安装脚本 install.sh"
这个脚本不仅下载了必要的二进制文件,还生成了完整的安装脚本,大大简化了离线部署的复杂度。
2.3 二进制文件部署实践
将离线包传输到目标服务器后,执行以下步骤:
# 1. 解压并安装二进制文件
tar -xzf docker-20.10.24.tgz
sudo cp docker/* /usr/local/bin/
# 2. 验证可执行权限
sudo chmod +x /usr/local/bin/docker*
sudo chmod +x /usr/local/bin/containerd*
sudo chmod +x /usr/local/bin/runc*
# 3. 创建符号链接(如果/usr/bin在PATH中)
sudo ln -sf /usr/local/bin/docker /usr/bin/docker
sudo ln -sf /usr/local/bin/dockerd /usr/bin/dockerd
# 4. 验证安装
docker --version
dockerd --version
这里有个细节需要注意:某些系统可能已经预装了较旧版本的Docker相关命令,直接覆盖可能导致冲突。建议先检查:
# 检查现有docker命令位置
which docker
type docker
# 如果存在,备份原有命令
sudo mv /usr/bin/docker /usr/bin/docker.bak 2>/dev/null || true
3. Systemd服务配置深度解析
二进制安装的核心难点在于systemd服务的配置。一个配置不当的服务文件可能导致各种奇怪的启动问题。
3.1 完整的服务文件配置
基于多个生产环境的经验,我总结出这个相对完善的docker.service配置:
[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
# 使用socket激活模式
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
# 资源限制配置
TimeoutStartSec=0
RestartSec=2
Restart=always
# 启动限制
StartLimitBurst=3
StartLimitInterval=60s
# 进程限制
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
LimitMEMLOCK=infinity
# 任务限制(systemd 226+)
TasksMax=infinity
# cgroup委托
Delegate=yes
# 仅kill docker进程,不kill整个cgroup
KillMode=process
OOMScoreAdjust=-500
# 环境变量
EnvironmentFile=-/etc/default/docker
# 标准输出配置
StandardOutput=journal
StandardError=journal
# 安全配置
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full
ProtectHome=yes
[Install]
WantedBy=multi-user.target
3.2 关键配置项详解
Type=notify:这是Docker与systemd通信的关键。Docker启动完成后会通知systemd,systemd才会认为服务已成功启动。如果这里配置错误,可能会出现服务"启动成功"但实际无法使用的状况。
Delegate=yes:允许Docker管理自己的cgroup。如果不设置这个,Docker容器可能无法正确进行资源限制。
KillMode=process:确保在停止服务时只终止Docker守护进程,而不是整个cgroup中的所有进程。这在有运行中容器时尤为重要。
OOMScoreAdjust=-500:降低Docker守护进程被OOM killer杀死的概率。在内存紧张的环境中,这个设置可以避免Docker本身被意外终止。
3.3 配置containerd服务
从Docker 20.10开始,containerd作为独立的运行时组件,也需要相应的systemd配置:
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStart=/usr/local/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
提示:在某些ARM架构的服务器上,可能需要额外加载内核模块。可以通过
lsmod | grep overlay检查模块是否已加载,如果没有,需要在ExecStartPre中添加相应的modprobe命令。
3.4 服务启动与验证
配置完成后,按顺序执行:
# 1. 重新加载systemd配置
sudo systemctl daemon-reload
# 2. 设置开机自启
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
# 3. 启动服务
sudo systemctl start containerd.service
sudo systemctl start docker.service
# 4. 检查服务状态
sudo systemctl status docker.service --no-pager -l
# 5. 查看详细日志(如果有问题)
sudo journalctl -u docker.service -f
如果一切正常,你应该能看到类似这样的输出:
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2024-01-01 10:00:00 CST; 10s ago
Docs: https://docs.docker.com
Main PID: 12345 (dockerd)
Tasks: 25
Memory: 45.3M
CGroup: /system.slice/docker.service
└─12345 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
4. Docker Daemon高级配置优化
默认的Docker配置可能不适合生产环境,特别是在ARM架构的服务器上。以下是我在实践中总结的优化配置。
4.1 完整的daemon.json配置
创建或编辑/etc/docker/daemon.json:
{
"data-root": "/data/docker",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production",
"env": "os,customer"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
},
"live-restore": true,
"ipv6": false,
"fixed-cidr-v6": "2001:db8:1::/64",
"experimental": false,
"debug": false,
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"insecure-registries": [
"192.168.1.100:5000",
"registry.local:5000"
],
"dns": ["8.8.8.8", "8.8.4.4"],
"dns-opts": ["timeout:2", "attempts:3"],
"exec-opts": ["native.cgroupdriver=systemd"],
"default-address-pools": [
{
"base": "172.20.0.0/16",
"size": 24
}
],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"shutdown-timeout": 30
}
4.2 关键配置项解析
data-root:这是最重要的配置之一。我强烈建议将数据目录放在独立的分区或磁盘上。在ARM服务器上,IO性能可能成为瓶颈,选择合适的存储位置很重要。
storage-driver:overlay2是目前最推荐的文件系统驱动,但在某些较旧的ARM内核上可能需要启用overlay2.override_kernel_check=true。
live-restore:这个配置允许在Docker守护进程重启时保持容器运行。在生产环境中,这可以避免服务中断。
default-address-pools:定义Docker网络的IP地址池。在多个Docker实例或频繁创建/删除网络的环境中,这可以避免IP地址冲突。
registry-mirrors:虽然是在离线环境,但配置镜像加速器仍然有意义。当网络恢复或需要通过代理访问外网时,这些配置会立即生效。
4.3 ARM架构特有的优化
ARM架构与x86有一些差异,需要特别注意:
- 内存对齐:某些ARM处理器对内存访问有对齐要求。如果遇到奇怪的崩溃,可以尝试:
{
"default-runtime": "runc",
"runtimes": {
"runc": {
"path": "runc",
"runtimeArgs": [
"--systemd-cgroup"
]
}
}
}
- CPU调度:ARM big.LITTLE架构需要特别注意CPU绑定:
# 查看CPU拓扑
lscpu | grep -E "Core|Socket|NUMA"
# 在运行容器时指定CPU集合
docker run --cpuset-cpus="0-3" your-image
- IO性能优化:ARM服务器的IO性能可能不如x86,建议:
{
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=100G",
"overlay2.mountopt=nodev"
]
}
4.4 离线镜像仓库配置
在完全离线的环境中,需要搭建私有镜像仓库。这里提供一个简单的配置示例:
# 1. 在可联网机器上拉取基础镜像
docker pull arm64v8/alpine:latest
docker pull arm64v8/nginx:latest
# 2. 保存为tar文件
docker save -o alpine-arm64.tar arm64v8/alpine:latest
docker save -o nginx-arm64.tar arm64v8/nginx:latest
# 3. 传输到离线服务器并加载
docker load -i alpine-arm64.tar
docker load -i nginx-arm64.tar
# 4. 打上本地标签
docker tag arm64v8/alpine:latest local-registry:5000/alpine:latest
docker tag arm64v8/nginx:latest local-registry:5000/nginx:latest
# 5. 推送到私有仓库(如果已搭建)
docker push local-registry:5000/alpine:latest
5. 常见问题排查与解决方案
即使按照最佳实践配置,在实际部署中仍然可能遇到各种问题。以下是我在ARM服务器上遇到的一些典型问题及解决方案。
5.1 "Cannot connect to Docker daemon" 错误深度排查
这是最常见的问题,原因可能有很多:
问题现象:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
排查步骤:
- 检查服务状态:
sudo systemctl status docker.service
- 检查socket文件权限:
ls -la /var/run/docker.sock
# 应该显示:srw-rw---- 1 root docker 0 Jan 1 10:00 /var/run/docker.sock
- 检查用户组:
# 查看当前用户所在组
groups $USER
# 将用户添加到docker组
sudo usermod -aG docker $USER
# 重新登录使组生效
newgrp docker
- 检查Docker守护进程日志:
sudo journalctl -u docker.service --since "10 minutes ago" -f
- 手动启动测试:
# 停止systemd管理的服务
sudo systemctl stop docker.service
# 手动启动dockerd查看输出
sudo /usr/bin/dockerd --debug
常见原因及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 权限被拒绝 | 用户不在docker组 | sudo usermod -aG docker $USER |
| socket文件不存在 | Docker服务未启动 | sudo systemctl start docker |
| 连接超时 | 防火墙阻止 | sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.17.0.0/16" accept' |
| TLS证书问题 | 证书配置错误 | 检查/etc/docker/daemon.json中的TLS配置 |
5.2 存储驱动相关问题
问题:Docker启动失败,日志显示overlay2相关错误
解决方案:
- 检查内核版本和overlay2支持:
# 检查内核版本
uname -r
# 检查overlay模块
lsmod | grep overlay
# 检查文件系统支持
grep overlay /proc/filesystems
- 如果内核版本较旧(<4.0),可能需要使用
devicemapper:
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/docker-thinpool",
"dm.use_deferred_removal=true",
"dm.use_deferred_deletion=true"
]
}
- 清理旧的Docker数据:
# 停止Docker服务
sudo systemctl stop docker
# 备份现有数据
sudo mv /var/lib/docker /var/lib/docker.backup
# 或清理数据
sudo rm -rf /var/lib/docker/*
# 重新启动
sudo systemctl start docker
5.3 网络配置问题
问题:容器无法访问外部网络或端口映射不生效
排查步骤:
- 检查iptables规则:
sudo iptables -L -n -v
sudo iptables -t nat -L -n -v
- 检查网络接口:
ip link show
docker network ls
- 检查DNS配置:
# 查看容器内DNS解析
docker run --rm alpine cat /etc/resolv.conf
# 测试DNS解析
docker run --rm alpine nslookup docker.com
解决方案:
如果发现网络问题,可以尝试重置Docker网络:
# 停止Docker服务
sudo systemctl stop docker
# 清理网络配置
sudo ip link delete docker0
sudo rm -rf /var/lib/docker/network
# 清理iptables规则(谨慎操作)
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X
# 重新启动
sudo systemctl start docker
5.4 ARM架构特有的兼容性问题
问题1:x86镜像无法在ARM上运行
解决方案:
# 使用多架构镜像
docker pull --platform linux/arm64 nginx:latest
# 或者使用buildx构建多架构镜像
docker buildx build --platform linux/amd64,linux/arm64 -t your-image:multiarch .
问题2:某些应用在ARM上性能异常
排查:
# 检查CPU特性
cat /proc/cpuinfo | grep -E "model name|cpu MHz|cache size"
# 检查内存访问
docker run --rm -it arm64v8/alpine:latest \
sh -c 'echo "Testing memory access..." && dd if=/dev/zero of=/tmp/test bs=1M count=100'
# 使用perf分析性能
sudo perf stat docker run --rm your-image your-command
问题3:内核参数需要调整
在某些ARM服务器上,可能需要调整内核参数以获得最佳性能:
# 编辑/etc/sysctl.conf
cat >> /etc/sysctl.conf << EOF
# Docker优化参数
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 524288
vm.max_map_count = 262144
EOF
# 应用配置
sudo sysctl -p
5.5 资源限制与监控
在资源受限的ARM边缘设备上,合理的资源限制尤为重要:
# 查看容器资源使用
docker stats
# 运行容器时设置资源限制
docker run -d \
--name limited-container \
--memory="512m" \
--memory-swap="1g" \
--cpus="1.5" \
--cpu-shares=1024 \
--blkio-weight=500 \
your-image
# 查看详细资源使用情况
docker inspect limited-container | grep -A 10 "HostConfig"
对于生产环境,建议配置资源监控:
# 使用cAdvisor监控容器资源
docker run -d \
--name=cadvisor \
--restart=always \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:latest-arm64
访问http://服务器IP:8080即可查看详细的容器监控信息。
6. 生产环境部署检查清单
在完成所有配置后,使用以下检查清单确保部署的完整性和可靠性:
6.1 基础功能验证
#!/bin/bash
# Docker部署验证脚本
echo "=== Docker部署验证检查 ==="
# 1. 服务状态检查
echo "1. 检查服务状态..."
systemctl is-active docker.service
systemctl is-enabled docker.service
# 2. 版本检查
echo -e "\n2. 检查版本信息..."
docker --version
docker info | grep -E "Server Version|Storage Driver|Kernel Version|Operating System"
# 3. 基础功能测试
echo -e "\n3. 运行测试容器..."
docker run --rm hello-world
# 4. 网络测试
echo -e "\n4. 网络连通性测试..."
docker run --rm alpine ping -c 3 8.8.8.8
# 5. 存储测试
echo -e "\n5. 存储功能测试..."
docker run --rm -v /tmp:/data alpine sh -c "echo 'test' > /data/test.txt && cat /data/test.txt"
# 6. 资源限制测试
echo -e "\n6. 资源限制测试..."
docker run --rm --memory=100m alpine free -m
echo -e "\n=== 验证完成 ==="
6.2 性能基准测试
对于生产环境,建议进行简单的性能测试:
# CPU性能测试
docker run --rm --cpus=1 arm64v8/stress-ng --cpu 1 --timeout 30s --metrics-brief
# 内存性能测试
docker run --rm --memory=512m arm64v8/stress-ng --vm 1 --vm-bytes 256m --timeout 30s
# IO性能测试
docker run --rm -v $(pwd):/data arm64v8/alpine dd if=/dev/zero of=/data/testfile bs=1M count=100 oflag=direct
# 网络性能测试(需要两个容器)
docker run -d --name=iperf-server arm64v8/alpine sh -c "apk add iperf && iperf -s"
SERVER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' iperf-server)
docker run --rm arm64v8/alpine sh -c "apk add iperf && iperf -c $SERVER_IP"
docker rm -f iperf-server
6.3 安全配置检查
# 检查Docker守护进程配置
docker info | grep -E "Registry Mirrors|Insecure Registries|Live Restore|Debug"
# 检查容器安全配置
docker run --rm -it alpine sh -c "cat /proc/self/status | grep Cap"
# 检查镜像签名(如果配置了内容信任)
export DOCKER_CONTENT_TRUST=1
docker pull alpine:latest 2>&1 | grep -i "sign"
6.4 备份与恢复策略
最后,确保有完整的备份方案:
#!/bin/bash
# Docker数据备份脚本
BACKUP_DIR="/backup/docker"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p ${BACKUP_DIR}/${DATE}
# 停止Docker服务(可选,生产环境需谨慎)
# systemctl stop docker
# 备份数据目录
tar -czf ${BACKUP_DIR}/${DATE}/docker-data.tar.gz -C /data/docker .
# 备份配置文件
cp /etc/docker/daemon.json ${BACKUP_DIR}/${DATE}/
cp /etc/systemd/system/docker.service ${BACKUP_DIR}/${DATE}/
cp /etc/systemd/system/containerd.service ${BACKUP_DIR}/${DATE}/
# 备份镜像列表
docker images --format "{{.Repository}}:{{.Tag}}" > ${BACKUP_DIR}/${DATE}/images.list
# 备份容器配置
docker ps -a --format "{{.Names}}" | while read container; do
docker inspect $container > ${BACKUP_DIR}/${DATE}/container-${container}.json
done
# 重新启动服务(如果停止了)
# systemctl start docker
echo "备份完成:${BACKUP_DIR}/${DATE}"
在实际的ARM服务器部署中,每个环境都有其独特性。我在某次鲲鹏920的部署中就遇到了一个奇怪的问题:Docker服务能够正常启动,但运行特定镜像时会出现段错误。经过层层排查,最终发现是内核版本与Docker版本不兼容——那个内核版本对某些ARM指令集的支持有问题。升级内核后问题解决。
另一个案例是在飞腾2000+平台上,容器网络性能异常。通过分析发现是默认的网桥MTU设置不适合该网络环境,调整docker0网桥的MTU值后性能恢复正常。
这些经验告诉我,ARM平台的Docker部署虽然大体流程与x86相似,但在细节处理上需要更多关注架构特性。从内核模块到CPU调度,从内存对齐到IO优化,每个环节都可能成为性能瓶颈或稳定性问题。
最实用的建议是:在正式部署前,一定要在相同架构的测试环境中充分验证。保存好所有的配置脚本和问题排查记录,这些在后续维护和问题复现时会非常有价值。毕竟,在离线的生产环境中,每一次排错都是对技术能力的考验。
751



被折叠的 条评论
为什么被折叠?



