将一个或多个软件封装到一个镜像中,然后使用docker运行,这样将软件在其他节点或设备使用的时候,就能避免因为软件版本或者配置问题而报错。 使用docker的软件大概得逻辑:下载或者制作好镜像后,运行镜像里的软件时,镜像会生成一个容器,你的数据是在容器中运行的。软件运行结束,容器也会消失,镜像不会发生变化。生成的结果文件权限是root权限。
1. Docker安装
CentOS/Red Hat系统
Ubuntu系统:用户组 sudo usermod -aG docker $USER
2. 镜像和容器
概念理解
镜像(image@bjtst.com)是一个打包好的、静态的文件,它包含了应用程序及其所有依赖。
容器(container)是运行时实例,是基于镜像创建的,可以独立运行,并且在运行时具有自己的文件系统和进程空间。
注意:基于镜像创建了容器之后,如果又新装了一些软件,或修改了一些环境。就需要把这个容器保存成新的镜像或者保存成.tar文件。
查看镜像和容器信息
常用命令:
好多人在头一回碰到Docker之际,会因镜像跟容器的概念而弄得丈二和尚摸不着头脑,实际上只要弄清楚他俩之间的关联,就能把握Docker的核心作业逻辑。
软件的静态模板是镜象,与安装程序的光盘相类似,它涵盖了应用程序运行所需的全部文件、依赖以及配置,然而其本身不能径直运行,当用户施行docker run命令之际,Docker会依据镜像缔造一个可运行的容器实例,此容器具备独立的文件系统以及进程空间,应用程序于容器内部运行,所有的数据操作全都在容器内部达成,每次启动容器,事实上都是于镜像的基础之上创建一个全新的运行环境 。
有两种主要方式来获得Docker镜像,借助docker pull命令能够从Docker Hub等镜像仓库把他人制作好的镜像下载下来,比如说执行docker pull ubuntu:latest便能够获取到最新的Ubuntu镜像,Docker Hub是最大的公共镜像仓库,用户能够在网站上对各种软件的官方或社区镜像进行搜索 。还有一种途径是借助docker load指令来载入于本地所储存的镜像文件,此方式适宜用于从别的环境去迁移镜像的情形之中。
可以使用docker save -o image.tar 镜像名:标签命令,将镜像打包成tar文件,当你有镜像要分享或者备份的需求时。要是对容器做了修改,能借助docker commit命令,把容器挽救成新的镜像。此命令准许用户增添描述信息以及创建者信息,便利后续的管理和使用。利用docker images能够查看本地所有的镜像列表以及其ID 。
容器管理,于日常使用里,是重点之所在。借由 docker ps -a,能够查看所有容器的状态,涵盖运行中的以及已停止的容器。每一个容器,皆具备唯一的ID与名称,用户能够凭借ID或者名称,去操作特定的容器。容器的生命周期,包含创建、启动、停止以及删除等阶段,合理地管理容器,可节省系统资源并维持环境整洁。
Nextflow等流程工具,可对Docker容器的创建以及数据映射予以自动处理。在流程里所定义的任务,若存在对特定软件的需求时,Nextflow会自动去拉取与之对应的Docker镜像,进而创建容器。更为关键的是,它会把本地数据路径自动映射至容器内部,用户并不需要手动运用-v参数来进行挂载。这样一种自动化机制,极大地简化了生物信息学分析流程的部署以及运行。
容器运行Docker时,系统资源合理分配颇为重要,用户能够借参数限制容器内存使用量,像在Nextflow流程里设containerOption="-m 74g"给某任务分配74GB内存,每个运行的process俱对应一独立容器,运用docker container ls可实时监测这些容器运行状态,确保资源有有效利用 。
# 查看当前节点的所有镜像
docker images
# 查看运行的容器,获取容器ID:
docker ps -a # -a,展示所有的,包括停止退出的,如果只展示运行的,可以不加-a
## 其中STATUS列说明:
Created:容器已创建,但尚未启动。这通常意味着还没有调用 docker start命令来启动容器。
Running:容器正在运行且处于活动状态。
Exited:容器已经停止运行。容器执行的命令已经完成或容器被手动停止。
Paused:容器已暂停,所有的进程将被挂起。
Restarting:容器正在重启中。
Removing:容器正在被删除。
3. 获取镜像的方法
Dockerfile文件制作镜像
示例:制作一个简单的miniconda镜像,并安装三代测序组装软件flye。 touch Dockerfile && vim Dockerfile
FROM ubuntu:20.04
MAINTAINER lingxu <lingxu@m.xmhaisheng.com.com>
RUN apt-get update && apt-get install -y wget gcc g++ zlib1g-dev vim less
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh \
&& bash Miniconda3-py37_4.8.3-Linux-x86_64.sh -b -p /root/Miniconda \
&& rm -rf Miniconda3-py37_4.8.3-Linux-x86_64.sh
ENV PATH=/root/Miniconda/bin:$PATH
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN source activate base
WORKDIR /
RUN conda config --add channels bioconda && conda config --add channels conda-forge
conda install flye -y -p /software/flye
使用Dockerfile制作镜像
# 需要注意的是,Dockerfile里RUN后边的conda安装软件时加 -y,因为无法在外边进行交互输入命令
# 书写完成Dockerfile,然后执行下边的命令
docker build -t <image_name>:<tag> .
docker pull 命令下载别人制作好的
docker pull <image>:<bjtst.com>
docker pull ubuntu:latest
说明: docker pull 命令告诉 Docker 从远程镜像仓库中获取指定的镜像。 ubuntu:latest 指定了要下载的镜像名称为 "ubuntu",标签为 "latest"。这表示我们要下载 Ubuntu 镜像的最新版本。 如果不指定标签,默认将使用 "latest",即下载最新版本的镜像。 dockerhub网站(https://hub.docker.com/)可以搜索想要用的软件的镜像,但是进入这个网站需要梯子。这个网站类似github,制作好的镜像也可以上传到这个网站分享给大家使用。
docker load 加载.tar文件打包好的镜像
docker load -i image.tar
4. 使用和管理镜像方法
直接docker run运行软件
使用镜像的方法大概分为两种 第一种是直接外部docker run运行 举个例子:使用线粒体组装注释软件mitoZ(参考:https://github.com/bjtst.com)
# 下载镜像
docker pull guanliangmeng/mitoz:3.6
# 运行镜像中的软件mitoZ
docker run -v $PWD:$PWD -w $PWD --rm guanliangmeng/mitoz:3.6 mitoz all --fq1 $PWD/reads_1.fq.gz --fq2 $PWD/reads_2.fq.gz --requiring_taxa Chordata --outprefix sample --thread_number 12 --clade Chordata --species_name sample
命令解释:
run 在一个新的容器运行一个命令
-v 目录挂载
就是将本地的目录映射到容器中,冒号前是本地的目录 一次性挂载多个目录,就写多个-v ,例如:
docker run -v /path1:/path1 -v /path2:/path2 -w /path1 <image>:<tag> minimap2 -ax map-hifi ref.mmi seq.fq.gz
-w 工作路径
--rm 当容器停止运行后自动删除该容器
这是常规的使用镜像软件的方法,不需要进入到容器中,能直接在工作路径生成结果文件,但是生成的文件都是root权限的。非root用户如何删除,见下一小节。
创建交互式容器
使用镜像创建一个容器并在容器中进行操作, 创建一个容器之后,交互式环境都是root环境,可以自由在里边配置软件或环境,如果要配置一个多个软件的docker镜像,建议使用这种方法 之前运行的镜像生成的结果文件,因为是root权限,一般用户无法删除,可以使用这种交互式方法,将文件夹映射到容器中,再删除。 加载镜像为容器
Ubuntu交互式容器
# 先加载一个容器
# -itd: 这是三个选项的组合,分别表示以交互方式运行容器(-i),分配一个伪终端(-t),并且在后台运行容器(-d),添加-d的好处是关闭这个窗口容器不会消失。
docker run -itd --rm image:tag
# 查看容器id
docker container ls
#在末尾加/bin/bash,可以进入了,
# 使用id或者name都可以,<NAMES>是容器的名字,名字可以自己指定,不指定会自动生成
# exec:Run a command in a running container
docker exec -it <container_id>/<container_name> /bin/bash
Python交互式容器
在宿主机拉取python官方基础镜像
docker pull python:3.9.16-alpine
运行镜像 -v 挂载目录
docker run -itd --name software_python -v /host_path/pipeline:/data python/@xmhaisheng.com.com
进入容器的命令行
docker exec -it <container_id> python
容器打包及保存
先将容器保存成镜像,然后镜像才能保存成.tar文件。 如果保存镜像时,与现有的名字重名时,会覆盖原来镜像,原来的镜像名字会变成一串字母。
# 1 容器保存为镜像
docker commit [-m="提交的描述信息"] [-a="创建者"] 容器名称|容器ID 生成的镜像名[:标签名]
-m= : 为镜像添加描述信息(可选)
-a= : 为镜像添加创建者信息(可选)
docker commit <container-id> <new_image>:<new_tag>
# 2 容器保存为.tar文件
docker save -o image.tar <镜像名称>:<tag>
eg:
docker save -o my-backup.tar my-backup:latest
# 3 更换节点或者更换设备时,可以直接加载之前报错的.tar镜像
docker load -i images.tar
删除镜像或容器
################ 删除镜像 ###############
docker image # 查看镜像id
docker rmi <image_id>
############### 删除容器 ################
docker ps -a # 查看容器id
docker rm -f <container_id>
清除垃圾镜像和容器
清理exited进程:
docker rm $(docker ps -q -f status=exited)
清理dangling volumes:
docker volume rm $(docker volume ls -qf dangling=true)
清理dangling image:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
其他内容
# 镜像重命名,相当于重新复制了一个镜像
docker tag source_image:tag target_image:tag
5. 扩展
Docker 结合Rstudio
使用场景:
在服务器生成的数据,直接连接服务器的Rstudio进行画图。不需要将数据下载到本地然后用本地的Rstudio。
服务器中安装Rstudio不是我想要的版本,我想装一个自己想要的R版本的Rstudio
服务器也可以这么用:
# 加载Rstudio镜像
docker run -itd --rm --name rstudio --privileged=true -p 8787:8787 -e PASSWORD=123456 -v /host_path/rscripts:/container_path rstudio:latest
# 一定要给映射的文件夹赋予权限,否则,Rstudio无法在这个文件夹进行读写。
chmod -R 777 /host_path/rscripts
# 打开网页,输入ip地址:8787,可以在终端输入`ip a`查看ip地址
Username即上述命令行中的rstudio ,Password即上述命令行中123456
Docker 结合Nextflow
nextflow流程调用docker镜像的软件 数据会自动映射到容器中,不需要-v映射。 数据库,添加到配置参数中,本地路径即可,运行.nf脚本时,nextflow也会自动将数据库路径映射到容器中 以宏基因组数据kraken2物种注释为例:
################## nextflow.config书写 #####################
// 原始数据和数据结果路径
params{
raw_data = "/path/to/"
work_dir="/path/to/"
}
// kraken2和centrifuge两个软件对应的数据库路径,这个数据库自动把路径映射过去,process的命令正常写就可以
params {
kraken2_db="/database/kraken2"
centrifuge_db="/database/centrifuge"
}
process {
executor = "local"
clusterOptions = '-pe smp 10'
withLabel:metagenome{
container="metagenome:2.0"
}
}
####################### 脚本书写 ####################
process kraken2{
storeDir "${params.work_dir}/03_kraken2/"
label "metagenome" // 这个标签在nextflow.config里定义了
containerOption="-m 74g" // 这个process在docker run的时候指定内存使用74g
input:
path filtlong_data
val threads
output:
path "${prefix}.output"
path "${prefix}.report.txt",emit:kraken2_report
script:
prefix=filtlong_data.getSimpleName()
"""
export PATH=${params.kraken2}:$PATH
kraken2 -db ${params.kraken2_db} --threads ${threads} --output ${prefix}.output \
--report ${prefix}.report.txt --use-mpa-style --report-zero-counts ${filtlong_data} --gzip-compressed --use-names
"""
}
workflow {
def filtlong_data=Channel.fromPath("${params.raw_data}/*q.gz")
filtlong(clean_data)
}
################### 运行.nf脚本 ####################
nf run metagenomeFlow.nf -resume -with-docker grandbox_metagenome:latest
原理说明:
运行.nf脚本之后,top查看具体的命令
docker container ls查看运行每一个process,都会加载该process对应的镜像为一个新的容器,红色框是process生成的容器。
想要用的软件的镜像,但是进入这个网站需要梯子。这个网站类似github,制作好的镜像也可以上传到这个网站分享给大家使用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048348/viewspace-3101429/ ,如需转载,请注明出处,否则将追究法律责任。