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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • linux 查看系统版本确认使用的docker版本 uname -a --查看Linux内核版本命令cat /pr...
    只有香如故阅读 1,205评论 1 4
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,725评论 1 21
  • docker的使用 5.1从docker镜像仓库获取镜像的命令 docker pull [选项] [Docker ...
    爱学习的ren阅读 608评论 0 0
  • docker的使用 5.1从docker镜像仓库获取镜像的命令 docker pull [选项] [Docker ...
    爱学习的ren阅读 1,370评论 0 0
  • 出去听了场音乐会 累累的 晚餐点前喝了杯咖啡 所以就没吃晚饭 音乐会途中就有点饿了 荧光棒摇不动了 之后就去街上逛...
    攸宁蓁蓁_NEVER阅读 159评论 0 1