5. Singularity容器技术
1. 问题引入
为了解决这些问题,容器技术出现了.容器技术与虚拟机有相似之处,具体的区别见下图.为了说明我直接复制了知乎的高赞回答:
服务器好比运输码头:拥有场地和各种设备(服务器硬件资源),服务器虚拟化好比作码头上的仓库:拥有独立的空间堆放各种货物或集装箱(仓库之间完全独立,独立的应用系统和操作系统);Docker比作集装箱:各种货物的打包(将各种应用程序和他们所依赖的运行环境打包成标准的容器,容器之间隔离).
Docker有着小巧、迁移部署快速、运行高效等特点,但隔离性比服务器虚拟化差:不同的集装箱属于不同的运单(Docker上运行不同的应用实例),相互独立(隔离)。但由同一个库管人员管理(主机操作系统内核),因此通过库管人员可以看到所有集装箱的相关信息(因为共享操作系统内核,因此相关信息会共享).
服务器虚拟化就好比在码头上(物理主机及虚拟化层),建立了多个独立的“小码头”—仓库(虚拟机)。其拥有完全独立(隔离)的空间,属于不同的客户(虚拟机所有者)。每个仓库有各自的库管人员(当前虚拟机的操作系统内核),无法管理其它仓库。不存在信息共享的情况
作者:正则云科技
链接:https://www.zhihu.com/question/48174633/answer/180743885
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Docker在刚开始只允许Linux系统安装,在后续也允许Non-Linux系统安装,这是因为Docker在系统上安装了一个小型的Linux系统,在Linux系统又是和单纯Linux系统安装Docker一样的东西.
2. 安装
SingularityCE的使用不需要管理员权限,但安装需要管理员权限.实际把下面的代码运行一下,斜杠代表换行,只是为了美观.
# Ensure repositories are up-to-date
sudo apt-get update
# Install debian packages for dependencies
sudo apt-get install -y \
wget \
build-essential \
libseccomp-dev \
libglib2.0-dev \
pkg-config \
squashfs-tools \
cryptsetup \
runc
运行上面的代码后,需要安装Go.
$ export VERSION=1.17.2 OS=linux ARCH=amd64 && \
#上面的export相当于Python的变量声明,将变量值带入wget里去.我们没必要一定要安装1.17.2的go.
# 也可以直接在官网复制新的版本下载代码
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && \
#tar -C 指定解压路径
sudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz && \
#删除下载的软件包
rm go$VERSION.$OS-$ARCH.tar.gz
然后将GO语言添加到环境变量
$ echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc && \
source ~/.bashrc
然后就是下载SingularityCE,export起到的作用是一样的.
$ export VERSION=3.11.0 && \
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-ce-${VERSION}.tar.gz && \
tar -xzf singularity-ce-${VERSION}.tar.gz && \
cd singularity-ce-${VERSION}
接下来是编译SingularityCE,让它转为机器码
# ./mconfig是为了检测系统是否已经准备好了安装SingularityCE所需要的依赖
$ ./mconfig && \
# make -C 将源代码翻译成二进制 make是C、C++所使用的编译方式
# builddir 表示编译后文件存放地址
make -C builddir && \
# make -C 将编译在builddir的命令安装在默认的地方(/bin目录下)
# 且会自动配置环境变量
sudo make -C builddir install
3. 快速入门
3.1 下载镜像
在Click可以下载大家上传的镜像,当然我们也可以使用官方的Click.
#这里老师给的代码已经失效了,只能用wget下载老师已经下载好的.
但本人实测有点问题,就是会出现警告.
但实际上我们可以去两个地方下载镜像,singularity社区算是一个比较新的社区,但singularity也可兼容docker的容器,所以我们也能去docker社区下载
3.2 制作沙箱
同样有警告.制作沙箱将sif转为文件夹.
3.3 容器内操作
- 进入容器:
singularity
shell
blast
但是这样是不行的,我们没有以root用户进入容器,当我们想wget装软件时,会提示没有该指令,但如果我们要装wget指令,就必须先有root权限.
singularity
shell
‑‑writable
‑‑fakeroot
blast
# -fakeroot : 以root身份进入容器
# ‑writable : 让用户可以修改容器
- 在容器内安装软件
apt update
apt install wget
# download the latest build
wget http://opengene.org/fastp/fastp
chmod a+x ./fastp
# or download specified version, i.e. fastp v0.23.4
wget http://opengene.org/fastp/fastp.0.23.4
mv fastp.0.23.4 fastp
chmod a+x ./fastp
3.4 添加环境变量
我们修改容器的环境变量不是在.bashrc修改,而是先退出环境,然后修改blast/environment
,添加export
PATH=/opt/ncbi‑blast‑2.10.1+/bin:$PATH
添加后,我们可以在没有打开容器的情况下运行一些程序
singularity exec blast fastp
3.5 打包
如果我们要将容器传输出去,一个文件夹传输可能不太方便,因此我们会将文件打包.但是注意要以管理员权限.
3.6 运行容器内程序
主要是三种方法.
在第二种方法里,当最后一个fastp打出,就相当于可以将前面的代码无视,类似于直接使用fastp指令,因此后面可以接fastp需要的参数.
singularity exec fastp.sif fastp 参数
第三种方法相当于启动一个进程,然后让该进程在后台运行.这种方式稳定性比较好.
singularity instance start fastp.sif blast
# 将fastp.sif启动来在后台运行,后台运行的程序名叫blast
# 运行instance里面的程序 blast 里的fastp指令
ingularity exec instance://blast fastp
4. 容器与主机的交互
假如我们要用容器分析在主机的数据,这种情况要怎么交互呢?这里给出的解决方法是挂载.使用--bind 主机目录:容器目录
来镜像访问.但这里又有一个权限的问题.Singularity解决这个问题的方式是在容器内创建一个一模一样的用户,该用户的分组和权限与原主机一致.我们对主机目录什么权限,就对容器的镜像目录有什么权限.
但是我们要在容器装软件时,需要用到管理员权限(比如wget
).Singularity解决这个问题的方式是使用--fakeroot
选项.
当我们进入容器会自动挂载好一些文件夹,比如home目录,当前所在的文件夹,以及tmp目录.
下面是角色测试.虽然已经登录作为root用户,但在容器里还是不允许删除其他用户的文件.
请注意,我们挂载的时候,如果冒号后面不加目录,就是创建一个相同目录路径在容器镜像.