udocker一个轻量级的用户空间容器工具

udocker 是一个轻量级的用户空间容器工具,允许 在不需要 root 权限 的环境中运行 Docker 镜像,特别适用于 高性能计算(HPC)集群科研环境受限服务器 等场景。

python程序


简要介绍

特性 说明
🚫 无需 root 不需要 Docker daemon,也不需要 root 权限
📦 支持 Docker 镜像 可从 Docker Hub 等容器仓库下载并运行镜像
🧪 兼容科学软件 常用于 HPC、科研环境(如 SLURM、PBS)中运行容器化应用
🧱 后端可选 支持多种执行后端(如 P1, P2, F1, F3
🗂️ 完全在用户目录运行 所有数据保存在 $HOME/.udocker

安装方式(无需 root)

1
2
3
4
5
6
wget https://github.com/indigo-dc/udocker/releases/download/1.3.17/udocker-1.3.17.tar.gz
tar zxvf udocker-1.3.17.tar.gz
export PATH=`pwd`/udocker-1.3.17/udocker:$PATH

udocker --help
udocker install

这将在 $HOME/.udocker 下安装完整运行环境,首次运行会自动完成安装。


常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Commands:
search <repo/expression> :搜索dockerhub以获取容器图像
pull <repo/image:tag> :从dockerhub拉取容器映像
create <repo/image:tag> :从拉取的图像创建容器
run <container> :执行容器

images -l :列出容器图像
ps -m -s :列出创建的容器
name <container_id> <name> :为容器命名
rmname <name> :从容器中删除名称
rename <name> <new_name> :更改容器名称
clone <container_id> :克隆容器
rm <container-id> :删除容器
rmi <repo/image:tag> :删除图像

import <tar> <repo/image:tag> :导入tar文件(由docker导出)
import - <repo/image:tag> :从stdin进口(由docker出口)
export -o <tar> <container> :导出容器目录树
export - <container> :导出容器目录树
load -i <imagefile> :从文件中加载图像(由docker保存)
load :从stdin加载图像(由docker保存)
save -o <imagefile> <repo/image:tag> :将带有图层的图像保存到文件中

inspect -p <repo/image:tag> :返回图像上的低级信息
verify <repo/image:tag> :验证拉取或加载的图像

protect <repo/image:tag> :保护存储库
unprotect <repo/image:tag> :取消存储库保护
protect <container> :保护容器
unprotect <container> :取消储存库保护

mkrepo <top-repo-dir> :在位置创建另一个存储库
setup :更改容器执行设置
login :登录docker存储库
logout :从docker存储库注销

help :This help
run --help :特定于命令的帮助
version :显示udocker版本

Options common to all commands must appear before the command:
-D :Debug
--quiet :更少的冗差
--repo=<directory> :在目录中使用存储库
--insecure :允许不安全的未经身份验证https
--allow-root

初始化 udocker

安装依赖文件

1
2
udocker install
udocker --allow-root install # 默认非root运行

拉取镜像(和 Docker 一样)

1
udocker pull ubuntu:20.04

创建容器实例

1
udocker create --name=myubuntu ubuntu:20.04

运行容器

1
udocker run myubuntu

带参数运行

1
udocker run --bind=/data --env=MYVAR=123 myubuntu /bin/bash

容器内安装软件

1
udocker run myubuntu apt update && apt install -y curl

后端执行模式(运行机制)

模式 描述 是否需要 root
P1 使用 proot 实现的 chroot 替代
P2 类似 P1,支持更多功能
F1 使用 fakechroot + LD_PRELOAD
F3 更快的 fakechroot 模式,适合 HPC
R1 使用 runC(需要 root) 是(通常不用于 udocker)

可设置默认执行器:

1
udocker setup --execmode=P1 myubuntu

默认目录结构

路径 说明
~/.udocker 所有镜像、容器、配置文件存放位置
~/.udocker/containers 容器数据存储路径
~/.udocker/repos 拉取的镜像数据

适用场景

场景 描述
✅ 无 root 环境运行容器 如共享 HPC 集群,云主机,受限开发环境
✅ 科学计算 使用 Bioconda / TensorFlow / PyTorch 等镜像运行计算任务
✅ 容器移植 把已有 Docker 容器移植到无 root 系统运行
✅ SLURM/作业调度系统 sbatchqsub 配合使用

udocker和 Docker 的区别

项目 Docker udocker
是否需 root
是否需 daemon
是否支持 Dockerfile 构建 否(可手动操作容器)
执行速度 原生快 稍慢(尤其是 P1/F1 模式)
支持 GPU 否(默认) 有 Hack 可支持部分场景

在 HPC 中运行容器任务

1
2
3
4
udocker pull tensorflow/tensorflow:2.13.0
udocker create --name=tf tensorflow/tensorflow:2.13.0
udocker setup --execmode=F3 tf
udocker run --bind=/data tf python3 /data/train.py