引言
每一个做生信的人在安装新软件之前都曾有过期待,这个软件要一次性安装好,可现实往往是残酷的...可见有一个良好的分析环境,对我们的研究效率是有多么的高!
配置环境的“老大难”
经过之前流程构建的介绍,估计有的小伙伴们准备磨刀霍霍了。且慢!有过流程分析的小伙伴可能有经验,在别人机器下运行地好好的流程,却在自己的机器上始终运行不起来,明明软件都安装好了咋就运行不起来(掀桌子!),但又受限于对计算机系统的复杂性,遇到了此类问题时,只能听天命了,真是令人捉狂!去问开发者,开发者常常会说:“它可以在我的机器上跑了”,也就是说可能换个环境,流程就认生跑不动了。这就说明生物信息学分析所用到的软件对环境需求都是不一样的。
那有没有办法来解决这个问题呢?答案是肯定的。聪明的研究者们想到,如果把这些软件和依赖放到一个干净统一的环境下,你和我运行流程时的环境配置都是一模一样的,于是上面遇到的问题就解决了。带着这样的需求,虚拟环境的概念出现了,如virtualenv和conda,两者之间的不同是,virtualenv是Python的环境管理器,而conda不仅是包和环境管理器,还不仅限于Python还支持R、Perl等,扩大了conda的使用范围。
看似版本依赖问题解决了,但爱想问题、爱折腾你可能时不时会冒出这样的想法:一个linux环境下的流程,我要怎么在windows下面运行呢?不能让我再安个linux系统吧,那可太麻烦了!Bingo!你想的问题,也正是别人也会想到的问题。这里就要介绍我们今天要讲的主角Docker了。
Docker是什么?
根据Docker文档中的定义:将软件打包成标准化单位,用于开发,装运和部署。
Package Software into Standardized Units for Development, Shipment and Deployment.
很多人看了这个概念跟没看一样,根本不知道说的是什么。其实简单来讲,我们把关注点放到后面的装运和部署。想要装运,那么就得要一个容器去装载里面的货物;想要部署,容器就要有一个良好设施去存放货物,比如linux环境。如此,Docker就是一个有着良好环境可以存放货物的环境,且这个环境不受外界因素的干扰,独立却功能俱全,就相当于把你分析所需要的所有软件都装在“盒子”里面,且没有依赖冲突。所以你将Docker看做是一个轻量级的操作系统也是可以的。
Docker能干什么?
由于Docker可以将程序和与该程序的依赖,打包放在一个文件存储系统里面。运行这个文件存储系统时,就会生成一个虚拟的容器,这个容器里面有着独立的数据库、软件运行环境、独立的服务器进程,程序在这个虚拟容器里面运行,就像在一个真实的机器上运行一样。有了Docker,就不必再担心环境问题了。
上面只是简单介绍了一下Docker的使用场景,其主要优点有:
运行环境标准化:在本地测试他人的软件、提供集成的测试环境。以前流程执行的不成功,我们经常可以推锅给运行环境,这下有了Docker以后锅可没得甩了;
可移植性:就是无缝将云平台的Docker部署到自己的电脑上,把自己配置好的Docker容器上传到网上,今天去这家,明天去那家,如鱼得水,部署飞快;
组件微服务构架:通过使用多个容器,一台机器可以运行多个服务,因此可以在本机模拟出微服务器架构。
Docker的一些缺点
作为一个不断发展的工具,自然会有一些缺点:
权限要求:Docker的运行需要ROOT权限,或者添加docker用户,但对于在集群或者云平台上的用户来说,由于权限的限制只能通过conda等工具完成分析软件部署,这就导致了很大一部分用户很难拥抱这个好用的工具;
宿主配置:只能在64位的系统上运行,32位无法正常运行,且只能虚拟基于linux的服务,windows的服务目前不支持;
安全性:Docker设计上一定程度地保护了docker容器的安全,但是宿主机能够对docker内部的文件可以毫无障碍地读取和删除,一旦有了宿主机的权限就掌握了对上面docker容器的生杀大权。
Docker的几个重要概念
镜像(Image):跟安装操作系统使用的系统镜像(iso)一样,Docker 镜像也相当于一个小而完整的操作系统如Ubuntu 18.04。每个镜像有自己唯一的ID,名字和标签,还包含一些运行时准备的一些配置参数(如环境变量、软件等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Containers): 是一种超轻量级的虚拟机,在里面可以安装、运行程序,还可以把安装好的程序存储起来获得新的镜像。
仓库(Registry):镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,就如同存储镜像的数据库一样,Docker Registry 就是这样的服务。
Docker与生物信息学
巴拉巴拉说了这么多,那Docker怎么用到生物信息学上面来呢?有比较基因组分析经历的同学可能用到过circos,因其是完全依赖于Perl的软件,在安装相关依赖的时候显得尤其麻烦。经常会显示“Can't locate ***/***.pm in @INC (@INC contains: /path/to/circos-0.55/bin/lib /path/to/circos-0.55/bin/../lib)”等错误,还会因为各种没有权限而苦恼。有了Docker你就不用怕啦,只需运行“docker pull alexcoppe/circos”,然后circos就安装好啦,没错,一条命令就搞定了;只需一步,circos安装抱回家!如下图:
可能有的小伙伴就会犯嘀咕,“这不和conda干的是同一件事吗?”确实,在很多时候Docker能干的事,conda就能完成。但是,Docker是更接近操作系统的工具,conda能同时在一个环境里面安装Python2和Python3吗?Docker就能,而且在Docker容器中也能安装conda哟!一键搞定环境依赖,那种解脱的感觉,只有发文章的时候才能感受到吧!
结束语
好了,关于Docker的基本知识就说到这,以后我们再接着讲具体的使用方法。因为Docker有着良好可移植性,保证了分析结果可重复性,提高结论可行度,我相信在不久的将来,使用Docker进行生物信息学应用、软件的发布将成为共识。同时也由于生信生态的普及,越来越多的研究人员加入这个大家庭中,怎么使得软件更方(傻)便(瓜)走进研究人员的日常,这应该是我们做生信的小伙伴要关注的点!
它,
不仅仅是一个码,
还是知识!
领取专属 10元无门槛券
私享最新 技术干货