docker容器转apptainer
·
docker容器转apptainer
近期由于服务器升级,原本的docker系统被替换为apptainer系统,因此需要把容器迁移过去(毕竟很多环境配置还是比较麻烦)
一、什么是docker和apptainer
网上关于两者概念的对比很多,这里不念经,只提核心差异:Docker 采用守护进程(Daemon)模式,通常需要 root 权限,非常适合微服务部署;而 Apptainer(原 Singularity)采用‘用户空间’架构,你是什么用户跑容器就是什么用户,安全性极高,因此成为了目前高校和科研集群(HPC)的主流标配。本文主要聚焦纯实操,教你如何无痛迁移。
二、现有docker容器转到apptainer系统步骤
2.1 docker容器打包,生成一个.tar文件
#将容器提交成镜像(这个过程不需要停掉容器,并且不会对里面运行的程序产生影响,因为 commit只是对当前状态的容器进行一次快照)
# -p=false可以强制不暂停容器内的任务(一般不加也没问题,保险起见可以加上)
docker commit -p=false [container id] [image name]
#打包成.tar
docker save [image name] -o [name.tar]
2.2构建apptainer容器
(1)这里是以可写方式构建容器,因为需要进入容器进行环境安装和开发等工作。
#构建容器-需要更改容器内容
# --fakeroot 在容器里启用root用户,如不加则和宿主机用户一致
# --sandbox 沙盒模式,能够将容器文件建立为一个文件夹,而不是.sif文件
# test_dev_env 容器的目录,你在apptainer容器中的文件会放到这个目录
apptainer build --fakeroot --sandbox test_dev_env/ docker-archive://test.tar
(2)如果不需要更改容器里的内容会简单很多。
apptainer build hello_world.sif docker-archive://hello_world.tar
2.3 容器启动和操作
主要是记录如何使用apptainer容器,在远程服务器上像本地一样能够方便的使用集群的GPU,同时能够方便的配置自己所需要的环境。受apptainer的保护机制影响,当用户同时使用apptainer的–fakeroot和–writable参数时由于对宿主机的保护,所以一些底层的二进制代码不会载入到容器中,这就导致同时使用上面两个参数时不能再容器内访问CUDA,所以为了实现上面的目的主要分为下面两步:
(1)使用–writable和–fakeroot安装所需环境
#打开容器
# --writable 以可写方式进入容器,你可以在容器中进行环境安装等操作,但是不能执行需要用到GPU的代码
# 因为CUDA在这个模式下不会被加载
# Apptainer 出于安全考虑,默认不会自动帮你创建不存在的挂载点。建议进入容器前,先在宿主机执行
mkdir -p test_dev_env/target_path
apptainer shell --fakeroot --writable --bind source_path:target_path test_dev_env
#激活conda,并安装依赖,但是不能访问CUDA
export PATH="/data/user_home/2024122008/anaconda3/bin:$PATH"
source /data/user_home/2024122008/anaconda3/etc/profile.d/conda.sh
conda activate your_env
# 比如更新你的库
pip install -r /data/user_home/2024122008/My_project/requirements.txt
注:在此模式下配好环境后,必须 exit 退出容器。
(2)使用–nv 访问CUDA
# --nv:核心参数,挂载宿主机 Nvidia 驱动,开启 GPU 支持
# -e:隔离宿主机环境变量,保证 Conda 等工具纯净运行
apptainer shell --nv -e --bind source_path:target_path test_dev_env
#如果使用了 -e 参数,则需要需要为当前环境指定路径
# 1. 将 Conda 强行加入容器当前的独立 PATH
export PATH="/data/user_home/2024122008/anaconda3/bin:$PATH"
# 2. 加载 Conda 的底层 shell 脚本
source /data/user_home/2024122008/anaconda3/etc/profile.d/conda.sh
# 3. 再次尝试列出环境
conda env list
#测试CUDA,如果显示显卡,则可以开始训练
nvidia-smi
更多推荐
所有评论(0)