道听途说分享 http://blog.sciencenet.cn/u/lucky7

博文

长大后我就成了root - Docker入门

已有 1659 次阅读 2021-6-14 15:23 |个人分类:生信|系统分类:科研笔记

​Docker类似(但不是)虚拟机,能为某一个/一系列软件构建一个自己的宇宙/环境,让不同的软件之间不用相互影响,为用户解决所需下级软件/包/库的版本依赖。现在很多软件都提供了Docker的安装方式。现以基因预测软件augustus(https://github.com/Gaius-Augustus/Augustus)为例,介绍其使用方法。


首先保证你的电脑上已经安装好了Docker。Linux系统貌似会自带Docker。你可以试着运行一下`$which docker`看它有没有安装,安装在哪里。我们组两台Ubuntu,都是18.04,一个在`/usr/bin/docker`,一个在`/snap/bin/docker`,第二个还是作为一个snap包安装的。看下版本,不要太旧,如果太旧就要重新安装,具体见官网(https://docs.docker.com/engine/install/ubuntu/)。


如果有root权限,Augustus可以通过`sudo apt install`进行安装,但不一定是最新版本。如果没有,官网对其Docker安装方式介绍如下:


git clone https://github.com/Gaius-Augustus/Augustus.git
cd Augustus
docker build -t augustus .

第一行,下载该git repo

第二行,进入下载好的文件夹

第三行,在当前目录构建名叫augustus的docker镜像(image)


如果是第一次使用docker,可能会在第三行/步遇到权限问题:


Got permission denied while trying to connect to the Docker daemon socket ***

这个主要涉及到谁能运行docker的问题,解决办法详见这个帖子(https://www.digitalocean.com/community/questions/how-to-fix-docker-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket)。好吧,这里还是需要你的管理员。


太长不看版:


1. 创建一个叫docker的用户组(如果已经有了,忽略此步)

$ sudo groupadd docker

2. 把需要用docker的用户加入这个组

$ sudo usermod -aG docker ${user}

就好啦。


接下来,重复第三步,构建镜像。这里其实就是运行dockerfile里面的各种命令。好奇宝宝们可以`less`一下你的dockerfile。

$ docker build -t augustus .

安装完毕之后检查是否构建成功:

$ docker image list

嗯,能看见,最新版。那下面就是使用啦。如何使用一个docker镜像呢?有交互式(interactive)和离线式(detached)两种。按常规先学习交互式。

$ docker run -it augustus

it就是iteractive的缩写。`docker run -it augustus` 是根据augustus这个镜像(模版)新建一个容器(container)。容器相当于镜像的一个实现(instance),大概类似于python里面的类(class)和对象(object),如果像是巧乐滋生产线,那容器就是一个一个拿在手上正被吃的巧乐滋雪糕。


有没有发现,自己提示符前面变成了`root@我是一串随机数字加符号:~/augustus`。虽然在local host上面不是root,在Augustus的这个容器里面可是正主。当然,这个主要看Dockerfile怎么写的,不一定需要root。这一串随机数字加符号就是你新建的augustus牌容器的ID。不信可以新打开一个终端,输入:

$ docker ps

就能看见还在运行的容器里。其中第一列就是你的容器ID。等一下,最后一列的NAMES是什么鬼?程序员的笑点虽怪却high。

注:本文以augustus3.4.0的docker安装版为准,不同软件可能有细节出入,比如有可能是docker@容器ID,$pwd的结果自然也不一样,后面不再赘述。


回到容器所在的终端,看看自己在哪里(后面有用):

$ pwd

我这里是/root/augustus. 还可以欣赏一下容器里面有什么。

$ ls

是不是跟你`git clone`下来的差不多,只是安装完成了,多了一个bin。看到这里你已经了解了,在augustus牌容器里面,linux命令可以照用。为啥?

$ cat /etc/os-release

原来这是一个以Ubuntu20.04为操作系统的容器,linux的命令自然可以用啦。如果是一个windows的容器就没法这么干了。所以尽管我的机器是Ubuntu18.04(好吧,我承认现在已经是2021年6月了),在这个容器里面是2020年4月后的新天地。


好了,下面要介绍如何在容器内读取容器外的文件。毕竟,我们要把基因组序列给augustus,它才能帮我们预测基因啊。方法有很多种,这里介绍一个加载卷(volumn)的办法。假装你的输入文件是`/home/xuegao/data/qiaolezi.fasta`现在我们新建一个能看见它的augustus容器。语法如下:


docker run -it -v <path on host>:<path in container> <image>


填完括号之后就是:

$ docker run -it -v /home/xuegao/data/:/root/augustus augustus


`ls`一看,完蛋,之前/root/augustus里面所有的东西都看不见了,只能看见/home/xuegao/data里面的东西。这可以通过在容器里新建文件夹解决,不过不影响程序的运行,这里就不越写越长了。

root@containerID:~/augustus# augustus --species=snack --gff3=on qiaolezi.fasta > qiaolezi.gff3


发现文件太大,因为是远程登录,网络一不好就掉线了,交互式的container随即停止工作,看来还是要采取离线式。一旦提交之后,即使所在终端离线也没有关系,相当于后台提交了。离线式的语法是:


docker run -d -v <path on host>:<path in container> <image> <command>


你没有猜错,这里的d就是detached的意思了。套用到我们现在的情况就是:


$ docker run -d -v /home/xuegao/data/:/root/augustus augustus augustus --species=snack --gff3=on qiaolezi.fasta > qiaolezi.gff3

注:本文专注docker,对augustus的功能选项不做探究,因此不构成分析建议。


由于Augustus的输出是直接以stdout的形式,没法通过选项写入到某个文件,所以用了大于号想要重定向到qiaolezi.gff3。然而docker并不知道augustus命令到哪里结束,于是将docker runstdout写入到了qiaolezi.gff3,导致运行了半天,qiaolezi.gff3里面只有该容器ID。要得到augustus的结果,需要使用 `$docker logs containID` 调出来。


在使用`docker run`的时候可以考虑添加选项`--rm`表示任务完成后自动删除该容器,如果你没有加这个选项,就不要每次都新建一个容器,不然就等着手动删除吧(别问我是怎么知道的)。当然也可以批量删除:

$ docker rm -f $(docker ps -a -q)

好了奥古斯都,下面请开始你的表演。


关于如何给自己的软件构建dockerfile,先挖一个坑。也可根据以下链接自行学习:

https://matthewfeickert.github.io/intro-to-docker/。


祝大家docker/duān wǔ/愉快。










https://blog.sciencenet.cn/blog-257922-1291130.html

上一篇:宏基因组序列的抗菌潜力预测
下一篇:homologs, orthologs 和 paralogs,傻傻分不清楚?
收藏 IP: 159.226.249.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-23 17:51

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部