ARM服务器上Docker离线安装全攻略:从二进制包到服务配置(附常见报错解决)

ARM版本的docker安装 阅读详情

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.10uname -r建议4.14+以获得更好的容器支持
cgroup支持已启用grep cgroup /proc/filesystems容器资源隔离的基础
overlay2已启用grep overlay /proc/filesystemsDocker推荐的文件系统驱动
iptables≥ 1.4iptables --version容器网络管理
systemd≥ 219systemctl --version服务管理(非必须但推荐)

如果发现缺少某些内核模块,可能需要重新编译内核或加载模块:

# 临时加载overlay模块
modprobe overlay

# 永久生效(添加到/etc/modules-load.d/)
echo "overlay" >> /etc/modules-load.d/docker.conf

1.3 存储规划与分区建议

在离线环境中,存储配置尤为重要。Docker默认使用/var/lib/docker作为数据目录,但考虑到:

  1. 系统盘空间通常有限
  2. 容器镜像和运行时数据可能快速增长
  3. 备份和迁移的需求

我建议将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官方提供了静态二进制包的下载地址,但版本选择有讲究。不是越新越好,而是要考虑:

  1. 稳定性优先:生产环境建议选择稳定版而非最新版
  2. 内核兼容性:较新的Docker版本可能需要更新的内核特性
  3. 功能需求:是否需要BuildKit、containerd等新特性

官方下载地址结构如下:

https://download.docker.com/linux/static/stable/aarch64/

这里有一个实用的版本选择策略表格:

Docker版本发布时间推荐场景注意事项
20.10.x2020-2021稳定生产环境兼容性好,社区支持充分
23.0.x2023新功能需求需要较新内核(≥5.4)
24.0.x2023-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有一些差异,需要特别注意:

  1. 内存对齐:某些ARM处理器对内存访问有对齐要求。如果遇到奇怪的崩溃,可以尝试:
{
  "default-runtime": "runc",
  "runtimes": {
    "runc": {
      "path": "runc",
      "runtimeArgs": [
        "--systemd-cgroup"
      ]
    }
  }
}
  1. CPU调度:ARM big.LITTLE架构需要特别注意CPU绑定:
# 查看CPU拓扑
lscpu | grep -E "Core|Socket|NUMA"

# 在运行容器时指定CPU集合
docker run --cpuset-cpus="0-3" your-image
  1. 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?

排查步骤:

  1. 检查服务状态:
sudo systemctl status docker.service
  1. 检查socket文件权限:
ls -la /var/run/docker.sock
# 应该显示:srw-rw---- 1 root docker 0 Jan 1 10:00 /var/run/docker.sock
  1. 检查用户组:
# 查看当前用户所在组
groups $USER

# 将用户添加到docker组
sudo usermod -aG docker $USER

# 重新登录使组生效
newgrp docker
  1. 检查Docker守护进程日志:
sudo journalctl -u docker.service --since "10 minutes ago" -f
  1. 手动启动测试:
# 停止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相关错误

解决方案:

  1. 检查内核版本和overlay2支持:
# 检查内核版本
uname -r

# 检查overlay模块
lsmod | grep overlay

# 检查文件系统支持
grep overlay /proc/filesystems
  1. 如果内核版本较旧(<4.0),可能需要使用devicemapper:
{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.thinpooldev=/dev/mapper/docker-thinpool",
    "dm.use_deferred_removal=true",
    "dm.use_deferred_deletion=true"
  ]
}
  1. 清理旧的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 网络配置问题

问题:容器无法访问外部网络或端口映射不生效

排查步骤:

  1. 检查iptables规则:
sudo iptables -L -n -v
sudo iptables -t nat -L -n -v
  1. 检查网络接口:
ip link show
docker network ls
  1. 检查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优化,每个环节都可能成为性能瓶颈或稳定性问题。

最实用的建议是:在正式部署前,一定要在相同架构的测试环境中充分验证。保存好所有的配置脚本和问题排查记录,这些在后续维护和问题复现时会非常有价值。毕竟,在离线的生产环境中,每一次排错都是对技术能力的考验。

【debian系统arm架构安装docker】且换源后依旧不行就离线导入镜像 在Debian系统上安装Docker并使用阿里云的镜像源可以通过以下步骤完成。 阅读详情

相关推荐

ARM服务器离线安装Docker和Docker Compose全攻略(含常见报错解决方案)

本文详细介绍了在ARM架构服务器上离线部署Docker和Docker Compose的完整流程与实战技巧。针对企业内网等无网络环境,提供了从环境检查、二进制包获取、系统集成配置到服务启动验证的全方位指南,并重点分享了安装过程中常见报错的解决方案,帮助运维人员高效构建稳定的容器化环境。

e4f5g6h7的博客 751

Linux离线arm环境安装部署docker详细教程

把这些复制到创建的文件中(注意需要修改insecure-registry=192.168.205.230,ip地址修改为当前机器的地址)通过官网下载docker安装包,找arm环境的安装包,如果是x86环境可以下载对应的安装包。上传成功后解压 tar -xvf docker-24.0.6.tgz。3. 复制文件到 /usr/bin。

m0_50287279的博客 1万+

ARM服务器离线安装Docker和Docker-Compose全攻略(含常见报错解决方案)

本文详细介绍了在ARM架构服务器上离线安装Docker和Docker-Compose的完整流程与实战指南。针对企业内网环境,提供了从前期准备、依赖包获取、分步安装配置到生产环境优化的全攻略,并深度解析了“exec format error”、服务启动失败等常见报错的解决方案,帮助运维工程师高效完成容器化部署。

5f4d3s2a1q的博客 453

arm安装docker与docker-copose

docker-compose默认在arm64位的操作系统上无法使用,需要重新编译。4、安装 docker 和 docker compose 离线包。2、解压,然后将docker目录下文件拷贝到/usr/bin里。(复制以下内容保存为 docker.service 文件)arm64位操作系统上可用的docker-compose。3、准备 docker.service系统配置文件。一、银河麒麟Arm64安装docker。4.2.1查看 docker 版本。4.1、安装docker。4.2、验证安装是否成功。

csdndd521的博客 3587

Docker与Docker Compose离线安装全攻略:aarch64架构实战与版本兼容性解析

本文详细解析了在aarch64架构服务器上进行Docker与Docker Compose离线安装的完整流程与核心要点。针对无外网环境,提供了从精准获取官方安装包、手动部署Docker引擎、配置systemd服务,到安装Docker Compose的实战步骤。文章重点剖析了Docker版本、Compose文件语法与系统内核间的兼容性问题,并给出了离线镜像导入与私有仓库搭建等进阶解决方案,旨在帮助运维人员构建稳定可靠的离线容器化环境。

weixin_29305337的博客 559

鲲鹏架构下银河麒麟v10系统离线部署Docker全攻略

本文详细介绍了在鲲鹏架构的银河麒麟v10系统上离线部署Docker的完整流程。从环境准备、旧版本清理到二进制包安装和systemd服务配置,提供了实战经验与常见问题解决方案,特别针对ARM架构的兼容性问题给出优化建议,助力企业快速实现容器化部署。

weixin_26875109的博客 358

arm离线安装docker和docker-compose

目录1. 查看系统信息​编辑2.网盘获取安装包3.安装4.自定义安装版本5.下载docker离线安装包6.下载 docker-compose离线包 7.编辑docker.service8.安装docker-compose9.遇问题总结10.安装完docker-compose结果没有命令缺少环境变量11.添加变量链接:https://pan.baidu.com/s/18DWv56wGW8xaJ9oR0Qxxuw 提取码:0124 --来自百度网盘超级会员V3的分享 卸载 https://downl

生活不只是眼前的苟且,还有诗和远方! 3101

内网离线部署Nginx全攻略:从依赖解析到实战避坑

在Linux系统运维中,软件包管理是基础且关键的技能,通常通过yum或apt等在线工具可以轻松解决依赖问题。然而,在内网隔离环境下,无法访问外部软件源,离线安装成为必须掌握的硬核能力。其核心原理在于,需要在外网模拟目标环境,递归解析并收集软件及其所有层级的依赖包,形成一个完整的离线物料库。这项技术的工程价值在于,它确保了在银行、军工、政府等保密项目或开发测试环境中,服务的可靠部署与快速搭建。通过使用yum downloadonly、repotrack等工具,可以高效构建包含Nginx及pcre、zlib、o

weixin_30780649的博客 452

docker和docker-compose离线安装全攻略:二进制包方式

本文提供了一份详细的 Docker 离线安装教程,主要包含以下内容: 系统要求与检查:包括内核版本要求、cgroup版本检查等注意事项 二进制包下载:提供官方下载地址和网盘备选链接(含x86_64和aarch64架构) 安装步骤: 解压二进制包并复制到系统路径 创建systemd服务文件实现守护进程管理 配置优化: 配置国内镜像加速源(推荐docker.1ms.run等) 关闭SELinux等可能影响运行的设置 验证安装:通过docker version/info等命令验证安装结果

qq_36115389的博客 1113

内网环境Python加密库cryptography离线安装全攻略

在Python开发中,依赖管理是构建稳定应用的基础,而离线环境下的依赖安装则是企业级开发中常见的挑战。其核心原理在于,当无法连接PyPI等公共仓库时,pip的自动化依赖解析机制失效,需要开发者手动处理依赖树和平台兼容性问题。这一技术对于保障金融、政务等安全敏感领域在内网隔离环境中的项目部署至关重要。尤其是在处理像cryptography这样的核心安全库时,它不仅涉及纯Python依赖,更关键的是其底层基于Rust和C编写的二进制扩展,这使得系统级依赖(如Rust工具链、OpenSSL开发库)和正确的安装顺序

weixin_33709219的博客 414

内网离线部署Playwright全攻略:Python 3.9环境下的浏览器自动化解决方案

浏览器自动化是现代软件开发和测试中的关键技术,它通过程序控制浏览器行为,实现UI测试、数据抓取和RPA流程自动化。其核心原理是借助浏览器驱动协议与浏览器内核交互,模拟用户操作。这项技术的价值在于提升测试效率、保障Web应用质量并实现业务流程自动化。在金融、政务、企业内网等隔离环境中,由于安全策略限制外网访问,离线部署成为关键挑战。本文聚焦于Python 3.9与Playwright框架,针对CentOS 7等常见内网环境,提供完整的离线部署方案,涵盖依赖打包、浏览器二进制分发和系统库处理,解决`pip do

weixin_33947521的博客 309

龙芯3B6000服务器安装Docker 29.5.1全攻略:从源码编译到生产部署

在国产化替代和信创浪潮下,龙芯平台的应用部署成为许多开发者和运维工程师必须面对的课题。Docker 作为现代应用部署的基石,其高版本(如 29.5.1)带来了性能提升、安全加固和新特性支持,但在龙芯 3B6000 这类 LoongArch 架构的平台上,通过官方仓库直接安装 Docker 通常无法获取到最新版本,甚至可能没有预编译的二进制包。本文将手把手带你完成在龙芯 3B6000 服务器上,通过 RPM 包离线或在线方式,成功安装 Docker Engine 29.5.1 版本的全过程,涵盖从环境准备、依

468

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4313

软件安装全攻略:从环境检查到容器化部署的工程实践

软件安装是系统部署与运维的基础环节,其本质是将程序代码或预编译产物部署到目标环境并使其可用的过程。其核心原理在于确保软件依赖(包括库文件、运行时环境、系统组件)与目标环境的兼容性,并遵循正确的部署路径与权限模型。这一过程的技术价值在于为上层应用提供稳定、可预测的运行基础,避免因环境差异导致的“在我机器上能运行”问题。在实际应用场景中,开发者与运维人员需根据需求选择包管理器、源码编译、二进制包或容器化等不同安装方式,并严格进行环境核查、依赖管理与完整性验证。本文聚焦于安装前的环境准备与依赖核查、主流安装方式的

weixin_33738982的博客 438

LSTM量化选股实战:从数据清洗到回测归因的工程化闭环

LSTM(长短期记忆网络)是一种专为建模长程依赖而设计的循环神经网络,其门控机制能有效应对金融时序数据的非线性、高噪声与动态演化特性。相比传统统计模型或简单RNN,LSTM在股价趋势建模中展现出更强的鲁棒性与泛化能力,尤其适合处理日频多因子时序信号。其技术价值不仅在于提升预测精度,更在于支撑可归因、可审计的量化策略工程实践——从特征构建、标签定义到滚动回测,每一步都需严防未来信息泄露与过拟合风险。典型应用场景包括A股多因子选股、行业轮动信号生成及Alpha组合优化。本文聚焦LSTM在真实量化场景中的落地难点

weixin_33158887的博客 399

USVInland 数据集实战:4个月采集27段数据,26公里内河SLAM评测

本文详细解析了USVInland数据集在内河SLAM算法评测中的应用实践。通过4个月采集的27段共26公里真实多传感器数据,该数据集有效解决了GPS信号遮挡、动态反射干扰等内河无人船SLAM核心挑战。文章从数据预处理、算法优化到性能评测,全面展示了如何利用毫米波雷达与视觉数据的时空对齐特性提升定位精度,为水上无人驾驶技术提供重要基准。

weixin_33158887的博客 341

内网环境下Docker离线部署与镜像迁移实战指南

本文详细介绍了在内网环境下进行Docker离线部署与镜像迁移的实战指南。通过二进制文件部署、systemd服务配置、镜像导出导入等步骤,帮助用户解决内网环境中的常见问题,如跨平台兼容性和多架构镜像支持。特别适合企业生产环境、金融系统等需要严格网络管控的场景。

weixin_30736301的博客 486

AWS入门实践-如何在AWS云上创建一个内外网隔离的生产环境

在 AWS 上建立一个内外网分离的生产环境,可以减少应用服务的暴露面,有效的保证你的应用服务器的安全。通常我们会将web应用放在外网的子网内,数据库服务器等放在内网的子网。我们将按照下图来部署动手实践环境,实现在public subnet的EC2虚拟机可以直接通过互联网可以访问,在Private subnet的EC2虚拟机不能通过互联网直接访问,但是却可以在内部来访问互联网安装应用等等。

weixin_39108752的博客 2994

PyTorch GPU环境搭建全攻略:从CUDA驱动到虚拟环境配置

深度学习框架的安装与配置是模型开发的基础环节,其核心在于构建稳定、高效的软件栈协同工作环境。以PyTorch为例,其GPU加速功能依赖于CUDA(Compute Unified Device Architecture)这一并行计算平台,通过显卡驱动、CUDA工具包、PyTorch库及Python环境的精确版本匹配实现。这一技术架构的价值在于充分利用GPU的并行计算能力,将模型训练和推理速度提升数十至数百倍,广泛应用于计算机视觉、自然语言处理等AI领域。在工程实践中,使用Conda管理虚拟环境能有效隔离依赖、

weixin_33691817的博客 412

20220601超简单百度地图街景图片爬取+绿视率计算

真的不难咯。

weixin_39676904的博客 1万+

华为OD最新机试真题-池化资源共享

摘要:该问题要求管理n台设备的资源池,处理资源申请和释放操作。申请操作需返回满足条件且剩余资源最少的设备ID,释放操作需将指定申请的资源归还。采用线段树数据结构维护各设备当前最大可用资源值,支持快速查询和更新。线段树实现了单点修改、区间最大值查询以及查找最左满足条件的节点功能。算法时间复杂度为O((n+m)logn),空间复杂度O(n),适用于大规模操作。提供了C++、Java和Python三种实现方案。

面试高手的博客 325

ARM架构服务器安装docker

华为云服务器(aarch64架构)安装docker容器服务

相约黄昏后 6037

全志A527 T527 android13支持usb摄像头

我们发现usb摄像头在A527 android13上面并不能正常使用,需要支持相关的摄像头。

zhutoubenben的专栏 964

麒麟系统(arm64/aarch64)离线安装docker和docker-compose

公司最近需要把所有服务全部部署到麒麟服务器上,其中包含各种服务器:nginx、redis、emqx、influxDB、kafka、zookeeper、minio、mysql以及各个应用等。我淋过雨,所以我也想为别人撑伞。网上关于 arm64 系统的资料很少,耗费了很多时间试错。所以把这类的东西全部总结写下来,希望对后面的同学有所帮助。

勿在浮沙柱筑高台 4万+

XDMA流传输模式

XDMA 流传输模式(Streaming DMA)​ 是 Xilinx FPGA 通过 PCIe 与主机进行 ​实时流式数据传输 的核心机制,

浩瀚之水的专栏 3435

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 告别tcpdump拖拽!Wireshark+sshdump远程抓包5分钟配置指南(附免密登录技巧)
下一篇: LangGraph多智能体实战:用Supervisor和Swarm架构搞定旅行预订系统(附完整代码)
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值