背景:在linux系统上使用docker创建镜像,使用容器。
在日常的生信分析过程中,环境的配置往往比数据分析本身还令人头疼。conda的使用方便了R和python包的下载,但它也仅仅是一个包的管理软件。有没有一种方法可以完全复刻别人服务器上所有的环境,包括所有已下载的R、python包、.bashrc配置以及常用的生信软件(R软件、python软件、fastp软件等),甚至包括别人所创建的所有conda环境,实现服务器上所有东西的复刻呢?
docker就能实现这样的需求,docker的主机服务器用于存储用户们创建的镜像,而镜像就是配置好的服务器环境
。
对于一个镜像来说,复刻是成百上千次的,每次复刻就是创建一个容器,容器就是复刻镜像的载体
。
这里基于我自己的需求记录docker的使用。我要想使用的是宏基因组的差异分析lefse
,然而由于水平有限,这个软件的conda和其他方法我都配置不好,于是准备复刻别人配置好的整体环境。
-
docker search
docker search
命令用于搜索镜像。例如搜索lefse
的镜像docker search lefse
:
lefse.png
可以看到这里有好几个镜像,NAME是它们完整的名字,然而第一个镜像一看就比其他镜像更加专业,其次看STARS,第一个镜像有4个“点赞收藏”,所以我选择第一个镜像使用。 docker pull
docker pull
命令用于下载镜像。例如下载lefse
镜像docker pull biobakery/lefse
。注意,这里要使用上一步搜索出来的完整镜像名字。-
docker images
docker images
直接使用,可以查看下载到主机的所有镜像。
images.png -
docker run
上图中第一列是镜像名字,第二列是标签名字,第三列是镜像ID,第四列是下载日期,第五列是镜像大小。
启动容器的命令是docker run -it 镜像名字/镜像ID
。
这里有很多探索的地方,作为初学者随便试了一下(基于我自己的理解)。
首先使用镜像名字启动(复刻)镜像,启动完镜像的环境被称为一个容器。
run.png
启动完成后,可以看到仿佛进入了一个陌生人的服务器。其中用户名由我自己变成了叫作linuxbrew
的,其次可以看到这个终端显示没有了颜色,基于conda安装与使用-miniconda管理R与Python环境-soft02 - 简书 更改这里的.bashrc
,再source .bashrc
,发现终端的显示方式已被更改。
仔细看看这个终端显示的日期,发现是早上8点过,而现在是北京时间下午6点过,结合微薄的地理知识可以推测这个服务器应该是在西方。
言归正传,我是准备做lefse
的,那么我登录到这个服务器上有没有lefse呢?
检测一下,使用lefse
命令:
可以看到没有
lefse
,这是因为什么呢?debug
发现因为我函数用错了。好了,环境应该没有什么问题,直接使用别人的服务器配置就可以什么都不做,接下来只需要导入数据。
ll
发现目前home
目录下是空空如也,那么如何将原来主机中的数据导入或者连接到这台虚拟服务器上呢?
- docker run -it -v
-v
参数能够实现主机到虚拟机的数据连接,这里我将我的数据连接到虚拟容器中。
在虚拟容器中pwd
,得到这个虚拟容器的地址:
pwd.png
而我的数据地址则是在原本的主机中pwd
:
pwd.png
使用-v参数将两者链接:
usage:-v 原始主机中的数据地址:虚拟容器中的数据地址
docker run -it -v /mnt/home/yanyt/02.workflow/03.metagenomics_yyt01/02.test:/home/linuxbrew/share biobakery/lefse
注意,这样是重新打开了一个容器,也就是又进入了一个新的虚拟容器中:
可以看到新的服务器它这个.bashrc没有更改,所以终端显示没有颜色,在home目录中出现了一个新的文件夹share,进入此文件夹ll,可以看到我原本主机中的数据全部到了这个地方。
那么环境和数据都有了,就可以具体lefse分析了。
文件没有权限,这是因为对于虚拟容器来讲,他是一个外人(很外的人),所以需要回到主机,将权限打开,我直接设置为777,所有人都能访问并修改我的文件夹:
回到虚拟容器,发现文件夹权限变成了777,这说明主机上对数据做的修改,会直接作用到虚拟容器中:
继续运行
lefse
命令:命令没有问题,可以直接使用,且这里对文件做了修改,回到主机,发现主机上的文件也直接被修改,这说明虚拟机和主机之间的操作是一致的,所以要格外小心,避免误操作。
那么所有的分析完成以后,如何处理docker容器呢?
-
docker ps
使用docker ps
命令可以查看所有正在运行的容器:
ps.png -
exit
直接在虚拟容器中输入exit
并回车,就可以直接退出容器,注意,此时容器将直接被删除。
在第一个容器中试验exit
并回车,回到主机使用docker ps
命令发现已经没有了第一个容器:
exit.png -
ctr P+ctr Q
使用ctr P+ctr Q
可以从虚拟容器返回到主机页面,但此时容器仍然存在,还可以再次进入。
在第二个容器中使用ctr P+ctr Q
回到主机,使用docker ps
发现容器仍然存在:
P_Q
由于这个容器我要反复使用,所以暂时不将它删除,以后每次使用lefse我将重启它。 docker start
docker start 容器名字
将重启并进入一个虚拟容器。docker run -it -d
-d
参数实现后台运行容器,界面仍然停留在主机不进入容器。docker attach 容器名字
将进入一个在后台运行的容器。docker stop/kill
使用ctr P+ctr Q退出容器时,容器并未被删除,还可以再次进入。而退出后使用docker stop/kill 容器名字,将永久删除容器,下次再使用的话就得重新运行docker run -it 容器名字
,且登陆上去将是空空如也的新虚拟容器。
总结:docker的使用浅探究到这里,那么之后只要有现成的docker镜像,就“懒得”再配置环境。反之,如果厉害可以自己配置镜像给别人使用。