查看原文
其他

我学会docker啦!希望你也可以学会

2017-07-07 曾健明 生信技能树

写在前面

以前胡兄为我们生信技能树公众号写一个阿里云服务器处理RNA-seq和ChIP-seq数据(点击阅读)的教程的时候提到了docker这个打包技术,可以迅速的重现一个pipeline。虽然我以前也偶尔看到过这个名词,但是这是它第一次以生物信息学相关角色进入我的知识库。

这么神奇的东东,我岂能错过。下面就简单描述一下我的学习过程及理解:

首先安装docker

需要root权限,我们一般是在亚马逊等云服务器上面折腾!你可以先搜索一些它的基础知识,再回来看我的教程,因为我不喜欢照搬基础。

我是通过谷歌找到的下面的安装代码:

  1. sudo apt-get update

  2. sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

  3. sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

  4. sudo apt-get update

  5. apt-cache policy docker-engine

  6. sudo apt-get install -y docker-engine

  7. sudo systemctl status docker ## 查看docker服务启动情况

  8. ps -Af | grep docker ##查看是否有这个docker进程。

  9. sudo usermod -aG docker $(whoami)

  10. id $(whoami) ## 需要把自己的用户添加docker权限,因为docker需要root权限,但我们不能随便乱用root用户操作。

  11. #  you need to close you session in order to have the change taken into account.

  12. sudo usermod -aG docker jimmy

可以看到代码略微有点复杂,亲测可用。如果不是计算机专业也没必要去全部弄懂,反正运行代码在ubuntu 16上面肯定是能成功的。其余的报错就谷歌,这是生信工程师的基本技能。

docker 的基本指令

这个其实没什么好讲的,docker这个软件安装好了,就可以运行下面的命令,看一遍就知道啥意思了,而且这些命令都是有参数的,慢慢熟悉呗。

  1. docker

  2. docker info

  3. docker version

  4. sudo docker search ubuntu

  5. sudo docker run hello-world

  6. ## 上面代码下载了一个镜像,启动了一个容器,下面就可以查看它们

  7. docker ps -a -q

  8. docker images -a -q

  9. docker volume ls -q

  10. docker network ls

上面的命令都是安全的,可以随便玩,玩的过程会产生很多垃圾image和container~

镜像和容器

一般人是不需要自己构建镜像的,这个比较麻烦,初学者下载一些公共的镜像玩一玩就好了。下载的镜像启动一次就是一个容器!

Docker 两个基本步骤:

  1. 构建一个镜像。 sudo docker pull busybox

  2. 运行容器。 docker run busybox /bin/echo Hello Docker

Docker 三个基本要素分别是:

  • Docker Containers负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。

  • Docker Images是一个只读模板,用来运行Docker容器。

  • DockerFile是文件指令集,用来说明如何自动创建Docker镜像。

先看容器

前面说到 Docker两个基本步骤,下载镜像和运行容器。下载很简单,就 docker pull即可,我们主要讲容器( docker run)的各种花式操作。虽然就一个run的命令,但是参数非常多,大家自己看help,我随便描述几个常见的用法。

后台进程的方式运行

  1. sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done)

-d参数把该次运行的容器的ID保存下来了,赋值给了sample_job变量。

运行docker logs命令来查看job的当前状态:

  1. docker logs $sample_job

改变容器的状态

各种命令,我就不一一介绍了。

  1. restart / stop / rm /

我们在镜像的基础上面启动的容器经常是需要丢弃的,如果要删除,需要先stop再rm

将容器的状态保存为镜像

  1. docker commit $sample_job job1

注意,镜像名称只能取字符[a-z]和数字[0-9]。

构建镜像

上面提到了可以把正在运行着的容器保存为镜像,但是通常镜像不是这样产生的,也不建议大家这样构建镜像。构建镜像的两种方法:

  • 使用docker commit 命令从已经创建的容器中更新镜像,并且提交这个镜像

  • 使用docker build命令和Dockerfile文件创建一个新的镜像

一般来说不是真的“创建”新镜像,而是基于一个已有的基础镜像,比如Ubuntu、Fedora等,构建新的镜像而已。

用 commit 命令创建镜像

首先进入下载一个镜像,并以此创建运行容器,这样就可以在容器里面操作它了,比如下面在里面安装了wget/make等等小工具

  1. sudo docker pull ubuntu

  2. docker run -it ubuntu    

  3. ## -it运行的容器是交互式的,直接进入了容器里面,进行下面的操作

  4. cat /etc/issue.net

  5. uname -a

  6. cat /etc/lsb-release

  7. apt update && apt upgrade

  8. apt install wget

  9. apt install make

  10. apt install cmake

  11. apt install bzip2 # tar

  12. apt install zip unzip

  13. apt install zlib1g-dev #samtools

  14. apt install libncurses5-dev #samtools

  15. apt install g++ # vcftools

  16. exit

要把它当前状态保存下来,就不必每次都创建一个新容器并再次安装 wget/make这些小工具 先用exit命令退出容器,再运行docker commit命令!

  1. docker images

  2. sudo docker commit ff5f5009cb28 ubuntu/jimmy

  3. docker images

命令中,指定了要提交的修改过的容器的ID、目标镜像仓库、镜像名。commit提交的知识创建容器的镜像与容器的当前状态之间的差异部分,很轻量。

还可以加入一些参数:

  • -m:提交的描述信息

  • -a:指定镜像作者

PS:不推荐为运行中的容器创建镜像,换言之,不要使用 docker commit命令来创建镜像。

Docker自动创建镜像

Docker为我们提供了Dockerfile来解决自动化创建镜像,

所有Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像!

胡兄的 Docker 文件如下:https://github.com/huboqiang/tangEpiNGSInstall

这里我们把上面用 docker commit命令来创建镜像用dockerfile再来一次!

  1. FROM ubuntu

  2. MAINTAINER jianmingzeng<jmzeng1314@163.com>

  3. RUN apt -y update

  4. RUN apt -y upgrade

  5. RUN apt install -y wget curl make cmake

  6. RUN apt install -y bzip2 # tar

  7. RUN apt install -y zip unzip

  8. RUN apt install -y zlib1g-dev #samtools

  9. RUN apt install -y libncurses5-dev #samtools

  10. RUN apt install -y g++ # vcftools

请注意那些-y参数,因为dockerfile里面是不交互的,所以没办法像上面那种情况那样进入容器,慢慢运行代码,而且批量的一次性的构建好这个镜像,构建的代码如下:

  1. docker build -t="test" .

需要保证运行命令的目录有一个文件叫做dockerfile,而且这个dockerfile里面存储的内容就是上面那些FROM,RUN,至于它们命令的意思,可以自己去搜索。如果想建立自己的镜像,需要学习的路还很长哦。

可以查看docker images,发现本来基本的ubuntu只有117MB,我在此基础上面安装了几个小工具,就变成了427MB啦!

写在最后

很早以前就有人建议我把我的1000个生物信息学软件安装代码以及100个生物信息学数据库文件下载一起打包成一个docker供大家使用,但是在深入学习docker之后发现其实意义不大,现在软件管理我还是比较推荐conda,数据库文件下载放在docker那样这个镜像就会变的非常巨大,可能超过50G,这就违背了docker轻量级的初衷了。

参考资料: 

优先用dockerfile: http://www.oschina.net/translate/10-things-to-avoid-in-docker-containers

报错解决:https://linux.cn/article-7276-1.html

dockerFiles: http://dockone.io/article/103

Dockerfile的最佳实践:http://crosbymichael.com/dockerfile-best-practices.html

Docker 命令大全 http://www.runoob.com/docker/docker-command-manual.html

正好有朋友在连载亚马逊云的使用,你们可以马上申请一个一年的免费服务器,试一下这个docker技术。

亚马逊云教程3:文件传输,扩大存储,S3,快速输入命令

亚马逊云教程2:新建用户,sudo权限,安装软件

亚马逊云教程1:云是什么,创建并连接EC2



猜你喜欢

基因组 游记 | 工作资讯 

学习课程 | 好书分享 


菜鸟入门

Linux | Perl | R语言 | 可视化 

R包 | perl模块 | python模块


数据分析

ChIP-seq(上)ChIP-seq(下)RNA-seq | miRNA

WGS,WES,RNA-seq组与ChIP-seq之间的异同


编程实践

第0题 | 探索人类基因组序列 | 最后一题


直播基因组分析

我的基因组 | 解惑帖

一个标准的基因检测报告目录

生信技能树




编辑:吃瓜群众

点击阅读原文试试看呗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存