docker可以解决什么问题对于生信领域而言,docker最主要的用途如下:
保证了生信分析的可重复性:软件版本更换,不同版本的软件可能会存在函数名字修改,而导致代码中断;不同软件版本依赖特定版本的库,依赖库的变化可能导致软件安装不上等。又或者新版本软件对函数进行了修改,导致结果略有不同,但不返回错误。例如,Python2默认执行整数除法,因此5/2将返回2。而Python 3默认执行浮点除法,因此相同的5/2命令现在返回2.5。这些都会导致其他人无法复现你的结果。
Beaulieu-Jones, Brett K., and Casey S. Greene. “Reproducibility of Computational Workflows Is Automated Using Continuous Analysis.” Nature Biotechnology 35, no. 4 (April 2017): 342–46. https://doi.org/10.1038/nbt.3780.
保证不同软件、不同软件版本的兼容问题,使得他们可以在同一个环境中被联合使用
迁移方便:Docker将软件封装到一个容器中,该容器包括软件需要运行的所有东西(操作系统、系统工具、已安装的软件库等)。使用docker,你可以方便地将你的软件运行环境整一个打包分享给别人,开箱即用,完美复现你的环境。无需重复安装环境,免去安装依赖库的挣扎,节省人力时间,也不会因为系统环境差异出现结果上的差异。
你还可以对Docker镜像的不同版本通过tag进行标记,需要使用哪个版本复现结果就使用哪个。
容器技术与虚拟机传统的虚拟机(比如VMware)是把完整的操作系统也整合进去,因此隔离性更好,使用户可以安全地在单个环境中获得 root 权限,但是也更笨重,资源损耗高,启动速度慢(分钟级),而且隔离在某些时候会造成额外的复杂性。而Docker则是与宿主机共用操作系统内核,隔离性较差,但几乎没有资源损耗,启动速度很快(秒级),可以实现类似于完整虚拟机的计算重现性。
https://www.docker.com/resources/what-container
另外,由于Docker是依赖于宿主机的操作系统内核的,因此虽然win系统也能安装Docker,win的Docker与Linux的Docker也是不能通用的。
Docker的安全性问题Docker是迄今为止最受欢迎的,基本市面上可以见到的云计算提供商,比如华为等,都使用的Docker。
对于 docker最为人诟病的大概就是它的安全问题。Docker 运行的每个容器,容器进程都是作为root用户拥有的Docker 守护进程的子进程而产生的。也就是说,用户在容器内部可以通过系统调用来与内核进行root级别的交互,以root身份运行任何代码的,如果有人别有用心或者一不小心误操作(比如将根目录挂载到Docker容器内,并rm -rf
它),是非常危险的。另外,即便用存储来区分用户的读写权限,但是Docker并不区分你进入容器的身份是否就是你本人,也就是说,正常情况下你无法访问A的任何资源,但通过Docker,在进入Docker时,你以A的身份(通过-u/--user指定用户ID和组ID)在Docker里,你可以对所属他的资源为所欲为。
但对于企业而言,这不是问题,因为系统管理员知道哪些代码会运行,哪些命令会用来调用 Docker。但HPC的系统管理员则不一样,他的任务是允许用户运行任意代码,同时确保系统不受恶意代码(无论是有意还是无意)的危害。
而Singularity解决了Docker在HPC上的这个重大缺陷。Singularity在使用上跟Docker很相似,熟悉了Docker,学习Singularity也很方便。另外Docker镜像可以很方便地转换成Singularity。但是我目前使用Docker频率更高,因此先写一下Docker。
不同容器技术的对比图如下:
来自 Kurtzer, Gregory M., Vanessa Sochat, and Michael W. Bauer. “Singularity: Scientific Containers for Mobility of Compute.” PLOS ONE 12, no. 5 (May 11, 2017): e0177459. https://doi.org/10.1371/journal.pone.0177459.
Docker下载安装Docker官网:https://www.docker.com/
安装文档参考官网:Install Docker Engine on CentOS
其他系统对应查看帮助文档查看即可。
安装方法1
在新主机上首次安装Docker Engine之前,需要设置Docker软件资源库(Repository)。之后,都是从库安装和更新Docker。
安装yum-utils
软件包:
sudo yum install -y yum-utils
可以用yum info yum-utils
查看相关介绍:
yum-utils is a collection of utilities and examples for the yum package manager. It includes utilities by different authors that make yum easier and more powerful to use.
安装yum-utils
的目的是使用其中一个工具:yum-config-manager
对docker的资源库进行设置,yum-config-manager
的功能是切换yum资源库,添加新资源库并设置主要的yum配置选项(configuration options)。
官方安装文档配置的是官方源(服务器在国外,速度会比较慢),我们改为阿里的。
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum的仓库数据存储在/etc/yum.repos.d/
文件夹下, 仓库文件以repo
作为后缀.
yum repolist all # 显示所有仓库
删除仓库可以直接在仓库文件夹下删除仓库文件.
安装docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io
安装方法2·使用脚本安装get-docker.sh
脚本其实就是将上边操作打包成了脚本。
$ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh --mirror Aliyun# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
Docker Hello World启动docker引擎
sudo systemctl start docker
通过运行hello-world
镜像来验证Docker引擎是否已正确安装。
sudo docker run hello-world
容器运行时,它会打印消息并退出。
返回的消息的第1、2行的含义:直接docker run
的时候,它会先检查本地是否存在其后边跟着的镜像名称(这里是hello-world
)是否存在,如果不存在,则自动到网上的docker公共仓库进行拉取。
docker ps
查看正在运行的容器:
由于hello-world这个容器是运行后自动退出,因此已经关闭。
docker ps -a
查看所有容器(包括已经退出的)
可以看到以镜像hello-world
,生成了一个名为cranky_rosalind
的容器,且其状态为正常退出。如果我们想再次使用这个容器,我们可以使用CONTAINER ID 来访问这个容器,也可以通过名称(NAMES)来访问。
查看docker版本
docker --version# Docker version 19.03.13, build 4484c46d9d
建立 docker 用户组此时Docker已安装但尚未启动。docker组已创建,但还没添加用户。
默认情况下,Docker Daemon会监听本地的Socket文件,而这个文件通常是由root用户来创建的,其他用户没有读写权限(也正因为如此,所以Docker Daemon需要使用root权限启动)。而一般Linux系统出于安全考虑,一般不会直接使用root用户。因此,我们需要将非root用户放入Docker组,以使得他们可以使用Docker。
# 查看docker组信息,当前docker组没有添加任何人,因此为空。 sudo cat /etc/group | grep docker# dockerroot:x:975: # docker:x:974: # 添加用户,$USER获取的就是当前用户,也就是你自己。 sudo usermod -aG docker $USER # 查看docker组信息,可以看到已经将我自己假如docker组了。 sudo cat /etc/group | grep docker dockerroot:x:975: docker:x:974:chenziru
卸载卸载Docker引擎、CLI和Containerd packages: $ sudo yum remove docker-ce docker-ce-cli containerd.io
如果上边命令没有成功删除,比如输入docker还出现docker的使用帮助页面,可以下边命令,将全称输入到yum remove
进行删除。
yum list installed|grep docker# containerd.io.x86_64 1.3.7-3.1.el7 @docker-ce-stable # docker-ce.x86_64 3:19.03.13-3.el7 @docker-ce-stable # docker-ce-cli.x86_64 1:19.03.13-3.el7 @docker-ce-stable yum remove containerd.io.x86_64 docker-ce-cli.x86_64
镜像、容器、卷( volumes)、用户的配置文件等并不会被自动删除,如果需要删除,运行下边命令 sudo rm -rf /var/lib/docker
参考资料Docker——从入门到实践:安装Docker·CentOS 官网教程:Install Docker Engine on CentOS Kurtzer, Gregory M., Vanessa Sochat, and Michael W. Bauer. “Singularity: Scientific Containers for Mobility of Compute.” PLOS ONE 12, no. 5 (May 11, 2017): e0177459. https://doi.org/10.1371/journal.pone.0177459. 最后生信的学习怕是一个永无止尽的进阶过程。生物、信息、计算机、数学……
本月9-11号是当当今年最后一次促销活动,趁着这次活动也给大家推荐几本书。
linux有原理,有具体操作。适合作为一本参考资料备着。
下边是图灵出版社销量最好的两本Linux书。更适合Linux进阶。
我们大多数人都用了多年电脑,但对电脑背后的工作机制却一无所知,而本书就是解除这一困惑的绝好途径。本书能让你对使用的计算机有所了解,熟悉软件的基本工作原理,以及理解系统作为一个整体是如何工作的。
本书讲述了Linux 系统及其他UNIX 风格的操作系统上的程序开发,主要内容包括标准Linux C 语言函数库和由不同的Linux 或UNIX 标准指定的各种工具的使用方法,大多数标准Linux 开发工具的使用方法,通过DBM 和MySQL 数据库系统存储Linux 中的数据,为X 视窗系统建立图形化用户界面等。本书通过先介绍程序设计理论,再以适当的例子和清晰的解释来阐明它的方式,帮助读者迅速掌握相关的知识。
Linux入门推荐第一本,进阶可以考虑后两本。对于像下边截图这位(猜猜他是谁)这种,可以都买。
Docker推荐适合入门和实战的两本:
薅羊毛时间步骤一:复制NRXXRY (跟之前的不一样了,请勿复制错了~) 步骤二:长摁二维码,直达专题,挑选图书至购物车,点击结算
步骤三:点击“优惠券/码”处,输入优惠码 NRXXRY