什么是容器
容器(container)可以简单的理解成自己配置的系统环境,有你所需的package和dependencies。它可以允许你在笔记本、云服务器和HPC环境中运行你的程序。
为什么需要容器
假设以下场景:
场景1:花了几个小时在主机或者笔记本上装上了某软件/package(比如 tensorflow),分析的结果好像不错,你准备把分析放到服务器上以运行更多的数据,发现服务器的环境总是跟你作对,恨不得重装服务器的系统。除了使用conda建立相同的虚拟环境,容器技术也是不错的解决方案。
工作中的一部分时间都用来纠结各种软件的安装和配置。记得在Tensorflow刚出来的时候试图在window上安装,挣扎一天后最终放弃。【btw 现在谷歌出了colab,让你在浏览器上就直接用Tensorflow和pytorch】。还记得有一次升级了Mac系统,从此Mac只能运行64位的程序,随后发现基于TkSurfer的作图代码用不了,只有花一天时间迁移到Freeview。
场景2:想试试某paper分享的代码,结果代码中一个dependency是某个过时的package,旧的版本装到让你怀疑人生,python都卸载了几次。
场景3:你准备重复某paper的结果,数据和代码都有,结果就是不一样。纠结一周后发现是某个dependency的版本不一样导致的。
场景4:分享某篇paper的代码时,非常小心的列出所需要的程序及版本以防别人写无数封邮件问你这代码怎么运行不了。
后面几个场景都和现在火热的reproducibility相关。研究结果无法重复的原因实在是太多,代码所需软件的安装和版本的不一致便是原因之一。Docker和singilarity一类的容器技术能有效改善该问题,将来可能会和现在的BIDS一样流行。你也许已经意识到有的文章开始在分享代码的同时分享docker。
VM vs. Container
VM相当于安装了一个全新的系统(新的内核)。比如你使用VirtualBox在Mac电脑上安装Windows虚拟机,或者在win10上装一个Linux。每次启动它的时候相当于启动了另一个全新的操作系统,因此它速度慢消耗大量系统资源。如果想在Window中学习某些Linux的操作比如文件管理,bash编程,或者基于Linux的软件比如AFNI, FSL等,VM可能是最好的选择。VM非常容易上手,稍微麻烦的地方可能是虚拟系统和主机之间文件的共享,网上有很多教程。
Container与所在系统共享一个内核,基于现有内核对运行环境进行配置。这意味着它比VM更快,更小,一个Container可能只有几个MB。但 Linux的Container必须在Linux主机上运行,目前大部分Container都是基于Linux开发的。下图展示的是一个更为专业的运用场景。没有必要为某个app专门配置一个虚拟机,使用Container就可以共享app的bins/libraries
Docker vs. Singularity
Docker是目前使用最广泛的容器软件,已经趋成熟,拥有庞大的用户社区。Docker Hub(这些年怎么什么都加个hub)是一个线上存储容器的地方,目前已经有超过十万个已经配置好的容器供下载和使用。正如Docker的logo,一艘货轮上堆着不同的集装箱,Docker设计的理念是在同一系统上允许运行多个容器,同时还做到容器之间,容器和主系统之间的隔离。不足之处是难学,而且对没有root权限的HPC用户不友好。
Singularity是一个相对较新的容器软件,仍处于开发状态,兼容Docker容器这一特性让它的用户群体增长迅速。Singularity假设用户在一个有root权限的系统上构建容器,在一个没有root权限的系统上运行容器,这更符合科研应用的场景,因为HPC的用户是不会有root权限使用docker的。
最后的废话
内容大概是几个月前就写好了,当时在做kaggle,发现大部分人都会分享他们用的code+docker。总想着应该配一个docker或者singularity的教程之类的。当时学习了一部分singularity的内容,现在只记得它的教程居然是基于virtualbox的,windows要先安装一个虚拟的linux,才能学习怎么使用singularity。学习过程也是一地鸡毛,各种Linux的环境问题比如要自己安装gcc,uuid-dev等等。可是在实际的工作中发现,没有哪个地方不得不使用singularity,HPC使用conda管理不同的环境效果也不错。所以说在科研领域,Docker和singilarity一类的容器技术将来可能会和现在的BIDS一样流行。至少分享代码的时候说一句这是我建立的docker,看起来会比较professional。因为容器技术使用的是共享内核,linux建立的容器也只能在linux上运行,操作系统之间的差别便成了无法逾越的障碍。