可重复的生信分析系列一:Docker的介绍
可重复的生信分析一直是未来的趋势。如果实现可重复的生信分析,关键在于分析软件版本的控制,一致的环境设置还有良好的分析流程的记录。最近发现一篇关于这方面很好的教程。改教程主要分三个方面:Docker的介绍,Conda的介绍还有Workflowr的教程。通过使用这几个不同的工具实现上面提到的要素,进而进行可重复的生信分析。今天先讲第一部分 Docker的介绍。
什么是Docker?
Docker是一个使用OS级虚拟化的平台,在被称为Containers的环境中运行软件,这些程序container是完全隔离的环境。它们可以拥有自己的进程或服务或网络接口,就像单独虚拟机(VM)一样。但它们与VM又有所不同,它们“共享”了OS内核。Docker的镜象是静态(固定)的模板,而containers是动态的镜像。
为什么要用Containers?
Containers能更简单的传导(对开发人员有用)和更简单地在本地系统上使用不同的工具(对用户有用)。Containers封装了软件组件及其相应的依赖项,因此你只需下载对应的镜像就相当于安装了软件,然后在支持Docker的任何系统上运行它。BioContainers项目已将许多生物信息学工具包装在一起。他们在Docker Hub上有1000多个存储库,其中包含各种生物信息工具的Docker镜像。
关于Docker的基础
首先下载Docker,到下面的网站下载好对应版本的docker,然后进行安装。我的电脑是mac系统的,后面的操作都基于mac系统的docker。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
https://www.docker.com/products/docker-desktop
</pre>
下载安装好后,简单查看一下其对应的版本:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker --version -
Docker version 19.03.5, build 633a0ea
</pre>
接着执行强制性的步骤,去检查安装是否正确。如果你的docker被正确安装,它会在你terminal里输出下面的内容:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker run hello-world -
This message shows that your installation appears to be working correctly. -
To generate this message, Docker took the following steps: -
1. The Docker client contacted the Docker daemon. -
2. The Docker daemon pulled the "hello-world" image from the Docker Hub. -
(amd64) -
3. The Docker daemon created a new container from that image which runs the -
executable that produces the output you are currently reading. -
4. The Docker daemon streamed that output to the Docker client, which sent it -
to your terminal. -
To try something more ambitious, you can run an Ubuntu container with: -
$ docker run -it ubuntu bash -
Share images, automate workflows, and more with a free Docker ID: -
https://hub.docker.com/ -
For more examples and ideas, visit: -
https://docs.docker.com/get-started/
</pre>
下载我们第一个docker镜像
准备工作结束后,开始使用 docker pull下载我们的第一个docker镜像。下面会下载一个名为 BusyBox的镜像,这个镜像包含了许多常见的UNIX的程序
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker pull busybox
</pre>
下载后,我们可以通过 docker images命令查看在你的计算器上所有可用的docker镜像:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker images -
REPOSITORY TAG IMAGE ID CREATED SIZE -
busybox latest b534869c81f0 17 hours ago 1.22MB
</pre>
运行Docker容器
使用 docker run使用docker的镜像,来启动新的docker容器。docker镜像是在运行使用到的文件系统和参数。docker容器可以看作是镜像中一个正在运行的例子。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker run -it --rm busybox
</pre>
参数 -i指定你要交互式运行docker容器。参数 -t指定在启动容器时要运行伪终端。--rm参数指定在退出时自动删除容器。
如果你有不想要的镜像,可以通过下面的命令进行删除:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker rmi busybox -
# busybox should now be gone -
docker images -
共享文件
</pre>
共享文件
Docker容器(通常)不会包含你要分析的数据。你需要指定哪个volumes需要链接在一起。
这里先下载安装好Conda的:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker pull continuumio/miniconda3
</pre>
接着使用以下命令将容器外部的数据链接到容器里:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker run -it --rm -v /tmp/:/data continuumio/miniconda3
</pre>
/tmp/是本地文件系统上数据目录的文件路径。/data是容器中链接数据的文件夹的文件路径。/data文件夹中的任何数据都将被本地文件系统中的数据替换。-v选项指定你本地需要替换到容器里的路径。对容器中数据所做的任何更改,都会同步到本地文件的数据中。
这里可以看到,咱们在容器里创建的 data/hello.txt,同样可以在本地路径 /tmp/中找到。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
(base) root@f5ef791f90c7:/# echo "Hello from the otherside" > data/hello.txt -
# exit container -
exit -
ls -al /tmp/hello.txt -
-rw-r--r-- 1 ricky wheel 25 17 Mar 16:35 /tmp/hello.txt -
cat /tmp/hello.txt -
Hello from the otherside
</pre>
RStudio服务器的构建
下面我们尝试使用docker来构建一个R的环境,这里需要下载R studio的镜像:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker pull davetang/rstudio_biocasia
</pre>
成功下载安装镜像后,请尝试运行以下命令。下面的输出表明,该镜像正在使用Debian操作系统。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker run --rm -it davetang/rstudio_biocasia cat /etc/os-release -
PRETTY_NAME="Debian GNU/Linux 9 (stretch)" -
NAME="Debian GNU/Linux" -
VERSION_ID="9" -
VERSION="9 (stretch)" -
VERSION_CODENAME=stretch -
ID=debian -
HOME_URL="https://www.debian.org/" -
SUPPORT_URL="https://www.debian.org/support" -
BUG_REPORT_URL="https://bugs.debian.org/"
</pre>
从Docker运行RStudio服务器
在浏览器中启动容器:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker run --rm \ -
-p 8888:8787 \ -
-e PASSWORD=password \ -
davetang/rstudio_biocasia
</pre>
如果一切顺利,则可以通过你喜欢的Web浏览器访问 http:// localhost:8888 /上的RStudio服务器。用户名为 rstudio,密码为 password。选项 “-p”是端口, “-e”是环境变量;默认情况下,RStudio服务器使用端口8787,因为我已将此端口映射到本地计算机上的端口8888。如果使用不同的端口,则可以运行RStudio服务器的多个容器。
这时候可以打开一个新的终端,使用 ps来查看哪些容器正在运行。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
docker ps -
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -
a6a3f94f7886 davetang/rstudio_biocasia "/init" 20 seconds ago Up 19 seconds 0.0.0.0:8888->8787/tcp vigilant_sinoussi
</pre>
为你的项目创建Docker镜像
docker镜像是基于Dockerfile中包含的命令构建的。例如,下面是用来创建d avetang/rstudio_biocasia镜像的Dockerfile 。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
FROM rocker/rstudio:3.6.1 -
MAINTAINER Dave Tang <me@davetang.org> -
RUN apt-get clean all && \ -
apt-get update && \ -
apt-get upgrade -y && \ -
apt-get install -y \ -
libhdf5-dev \ -
libcurl4-gnutls-dev \ -
libssl-dev \ -
libxml2-dev \ -
libpng-dev \ -
zlib1g-dev \ -
&& apt-get clean all && \ -
apt-get purge && \ -
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -
RUN Rscript -e "install.packages(c('rmarkdown', 'tidyverse', 'workflowr'));" -
# COPY user-settings /home/rstudio/.rstudio/monitored/user-settings/user-settings -
# COPY .Rprofile /home/rstudio/
</pre>
该Dockerfile使用镜像 rocker/rstudio:3.6.1作为基础并安装一些常用的库。添加了将在其它研讨会中使用的其他R软件包。另外还可以使用COPY(尽管已注释掉)将本地计算机中的数据复制到Docker镜像中的文件夹中。该数据将永久包含在Docker镜像中,如果数据很大,则会带来不便,因为生成的Docker镜像将需要更多的磁盘空间。
Dockerfile中的每个 RUN,COPY和ADD命令都会在容器中生成另一个层,从而增加其大小。我们应该始终使用多行命令并清理程序包管理器缓存,以最大程度地减少最终生成镜像的大小。
Dockerfile用于在带有Dockerfile的文件夹中使用以下命令构建镜像:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker build -t davetang/rstudio .
</pre>
成功创建Docker镜像后,可以将其推送到Docker Hub,以便其他人可以使用它。首先,使用你的DockerHub用户名和密码登录。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker login
</pre>
然后将镜像推送到Docker Hub。
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
docker push davetang/rstudio
</pre>
使用docker做生信分析的例子
下载测试数据,https://github.com/davetang/learningvcffile/blob/master/aln_consensus.bcf,并将下载好的数据移动到你需要挂在的路径中:
<pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; background: rgb(241, 239, 238); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;">
-
# 下载镜像 -
docker pull biocontainers/bcftools:v1.9-1-deb_cv1 -
# 挂载数据 -
docker run -it --rm -v /Users/hhu/dowload:/data biocontainers/bcftools:v1.9-1-deb_cv1 -
# 执行分析 -
bcftools view -v snps aln_consensus.bcf | grep -v "^#" | head -2 -
1000000 336 . A G 221.999 . DP=112;VDB=0.756462;SGB=-0.693147;MQ0F=0;AF1=1;AC1=2;DP4=0,0,102,0;MQ=60;FQ=-281.989 GT:PL 1/1:255,255,0 -
1000000 378 . T C 221.999 . DP=101;VDB=0.704379;SGB=-0.693147;MQ0F=0;AF1=1;AC1=2;DP4=0,0,99,0;MQ=60;FQ=-281.989 GT:PL 1/1:255,255,
</pre>
本次Docker的分享就到这里结束了,下一次的内容会介绍Conda在可重复的生信分析里面的角色,敬请大家关注。
本教程的原链接: