生物信息学

可重复的生信分析系列一:Docker的介绍

2020-04-16  本文已影响0人  lakeseafly

可重复的生信分析一直是未来的趋势。如果实现可重复的生信分析,关键在于分析软件版本的控制,一致的环境设置还有良好的分析流程的记录。最近发现一篇关于这方面很好的教程。改教程主要分三个方面: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;">

  1. 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;">

  1. docker --version

  2. 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;">

  1. docker run hello-world

  2. This message shows that your installation appears to be working correctly.

  3. To generate this message, Docker took the following steps:

  4. 1. The Docker client contacted the Docker daemon.

  5. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

  6. (amd64)

  7. 3. The Docker daemon created a new container from that image which runs the

  8. executable that produces the output you are currently reading.

  9. 4. The Docker daemon streamed that output to the Docker client, which sent it

  10. to your terminal.

  11. To try something more ambitious, you can run an Ubuntu container with:

  12. $ docker run -it ubuntu bash

  13. Share images, automate workflows, and more with a free Docker ID:

  14. https://hub.docker.com/

  15. For more examples and ideas, visit:

  16. 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;">

  1. 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;">

  1. docker images

  2. REPOSITORY TAG IMAGE ID CREATED SIZE

  3. 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;">

  1. 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;">

  1. docker rmi busybox

  2. # busybox should now be gone

  3. docker images

  4. 共享文件

</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;">

  1. 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;">

  1. 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;">

  1. (base) root@f5ef791f90c7:/# echo "Hello from the otherside" > data/hello.txt

  2. # exit container

  3. exit

  4. ls -al /tmp/hello.txt

  5. -rw-r--r-- 1 ricky wheel 25 17 Mar 16:35 /tmp/hello.txt

  6. cat /tmp/hello.txt

  7. 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;">

  1. 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;">

  1. docker run --rm -it davetang/rstudio_biocasia cat /etc/os-release

  2. PRETTY_NAME="Debian GNU/Linux 9 (stretch)"

  3. NAME="Debian GNU/Linux"

  4. VERSION_ID="9"

  5. VERSION="9 (stretch)"

  6. VERSION_CODENAME=stretch

  7. ID=debian

  8. HOME_URL="https://www.debian.org/"

  9. SUPPORT_URL="https://www.debian.org/support"

  10. 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;">

  1. docker run --rm \

  2. -p 8888:8787 \

  3. -e PASSWORD=password \

  4. 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;">

  1. docker ps

  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  3. 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;">

  1. FROM rocker/rstudio:3.6.1

  2. MAINTAINER Dave Tang <me@davetang.org>

  3. RUN apt-get clean all && \

  4. apt-get update && \

  5. apt-get upgrade -y && \

  6. apt-get install -y \

  7. libhdf5-dev \

  8. libcurl4-gnutls-dev \

  9. libssl-dev \

  10. libxml2-dev \

  11. libpng-dev \

  12. zlib1g-dev \

  13. && apt-get clean all && \

  14. apt-get purge && \

  15. rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

  16. RUN Rscript -e "install.packages(c('rmarkdown', 'tidyverse', 'workflowr'));"

  17. # COPY user-settings /home/rstudio/.rstudio/monitored/user-settings/user-settings

  18. # 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;">

  1. 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;">

  1. 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;">

  1. 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;">

  1. # 下载镜像

  2. docker pull biocontainers/bcftools:v1.9-1-deb_cv1

  3. # 挂载数据

  4. docker run -it --rm -v /Users/hhu/dowload:/data biocontainers/bcftools:v1.9-1-deb_cv1

  5. # 执行分析

  6. bcftools view -v snps aln_consensus.bcf | grep -v "^#" | head -2

  7. 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

  8. 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在可重复的生信分析里面的角色,敬请大家关注。

本教程的原链接:

https://davetang.github.io/reproducible_bioinformatics/

上一篇下一篇

猜你喜欢

热点阅读