社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

生信猿的Docker入门课1

生信媛 • 3 年前 • 596 次点击  

docker可以解决什么问题

对于生信领域而言,docker最主要的用途如下:

  1. 保证了生信分析的可重复性:软件版本更换,不同版本的软件可能会存在函数名字修改,而导致代码中断;不同软件版本依赖特定版本的库,依赖库的变化可能导致软件安装不上等。又或者新版本软件对函数进行了修改,导致结果略有不同,但不返回错误。例如,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.

  2. 保证不同软件、不同软件版本的兼容问题,使得他们可以在同一个环境中被联合使用

  3. 迁移方便: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 # 显示所有仓库

删除仓库可以直接在仓库文件夹下删除仓库文件.

  1. 安装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

卸载

  1. 卸载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
  1. 镜像、容器、卷( volumes)、用户的配置文件等并不会被自动删除,如果需要删除,运行下边命令
sudo rm -rf /var/lib/docker

参考资料

  • 中文安装教程:CentOS 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



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/75059
 
596 次点击