ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Docker从入门到精通(教程大全)核心运行逻辑与实战指南!

Docker从入门到精通(教程大全)核心运行逻辑与实战指南!

原创 Linux操作系统 作者:坐忘道2筒 时间:2025-11-13 20:00:31 0 删除 编辑

将一个或多个软件封装到一个镜像中,然后使用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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2025-11-13

  • 博文量
    1
  • 访问量
    984