可重复的生信分析一直是未来的趋势。如果实现可重复的生信分析,关键在于分析软件版本的控制,一致的环境设置还有良好的分析流程的记录。最近发现一篇关于这方面很好的教程。改教程主要分三个方面:Docker的介绍,Conda的介绍还有Workflowr的教程。通过使用这几个不同的工具实现上面提到的要素,进而进行可重复的生信分析。今天先讲第一部分 Docker的介绍
。
什么是Docker?
Docker是一个使用OS级虚拟化的平台,在被称为Containers的环境中运行软件,这些程序container是完全隔离的环境。它们可以拥有自己的进程或服务或网络接口,就像单独虚拟机(VM)一样。但它们与VM又有所不同,它们“共享”了OS内核。Docker的镜象是静态(固定)的模板,而containers是动态的镜像。
image为什么要用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在可重复的生信分析里面的角色,敬请大家关注。
本教程的原链接:
网友评论