张芷铭的个人博客

Docker 镜像打包传输流程:docker save 打包 → 传输 → docker load 加载 → docker run 启动,NPU 容器需挂载驱动目录并启用特权模式。

前提确认

1
2
3
4
5
# 确认镜像存在
docker images | grep veomni_npu

# 确认磁盘空间(镜像通常 30-50GB)
df -h /dpc

镜像打包

1
2
3
4
5
# 打包为 tar
docker save veomni_npu:latest -o /dpc/zzm/veomni_npu_latest.tar

# 压缩(可选,35GB 可压缩至 15-20GB)
gzip /dpc/zzm/veomni_npu_latest.tar

命令说明

参数作用
docker save将镜像分层保存为 tar
-o指定输出路径
gzip压缩减小体积

传输到目标节点

方式一:共享存储(推荐)

打包后放在共享存储(如 /dpc/),其他节点直接访问。

方式二:SCP 传输

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 单节点传输
scp /dpc/zzm/veomni_npu_latest.tar.gz root@g0007:/dpc/zzm/

# 批量传输
for node in g0007 g0008 g0009; do
  scp /dpc/zzm/veomni_npu_latest.tar.gz root@$node:/dpc/zzm/
done

# rsync 替代(传输中断可续传)
rsync -avz /dpc/zzm/veomni_npu_latest.tar.gz root@g0007:/dpc/zzm/

加载镜像

1
2
3
4
5
6
7
8
9
# 加载 tar 包
docker load -i /dpc/zzm/veomni_npu_latest.tar

# 加载压缩包(先解压)
gzip -d /dpc/zzm/veomni_npu_latest.tar.gz
docker load -i /dpc/zzm/veomni_npu_latest.tar

# 验证
docker images | grep veomni_npu

启动容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# NPU 容器启动命令
docker run -d \
  --name veomni_speed \
  --privileged \
  --network host \
  -v /dpc:/dpc \
  -v /usr/local/Ascend:/usr/local/Ascend \
  -v /var/log/npu:/var/log/npu \
  --env ASCEND_DEVICE_ID=0 \
  veomni_npu:latest \
  /bin/bash -c "tail -f /dev/null"

关键参数

参数作用
--privileged特权模式,访问 NPU 设备
--network host主机网络,避免通信隔离
-v /usr/local/Ascend挂载昇腾 CANN 驱动
-v /dpc:/dpc挂载共享存储
tail -f /dev/null保持容器后台运行

验证

1
2
3
docker ps | grep veomni_speed
docker exec -it veomni_speed bash
npu-smi info  # 检查 NPU 可用性

批量部署脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# 打包镜像
docker save veomni_npu:latest -o /dpc/zzm/veomni_npu_latest.tar
gzip /dpc/zzm/veomni_npu_latest.tar

# 批量部署
nodes=("g0007" "g0008" "g0009")
for node in "${nodes[@]}"; do
  scp /dpc/zzm/veomni_npu_latest.tar.gz root@$node:/dpc/zzm/
  ssh root@$node << EOF
    gzip -d /dpc/zzm/veomni_npu_latest.tar.gz
    docker load -i /dpc/zzm/veomni_npu_latest.tar
    docker stop veomni_speed || true
    docker rm veomni_speed || true
    docker run -d --name veomni_speed --privileged --network host \
      -v /dpc:/dpc -v /usr/local/Ascend:/usr/local/Ascend \
      veomni_npu:latest /bin/bash -c "tail -f /dev/null"
EOF
done

避坑要点

  1. 驱动一致性:目标节点 CANN 驱动版本必须一致
  2. 磁盘空间:确保至少 40GB 可用空间
  3. 容器命名:保持一致便于脚本复用
  4. 权限问题:必须加 --privileged
  5. 路径一致:挂载共享存储保证数据路径相同

Comments