如何获取目标软件的Docker镜像

网友投稿 684 2022-05-29

1、服务相关术语

术语

介绍

备注

镜像

类似于操作系统的快照,比如ghost系统光盘。

若无特殊说明,都是指docker镜像

DockerFile

制作Docker镜像的描述文件

2、Docker容器

Docker 出现之前,你要安装一个软件,你需要下载软件包,下载该软件所的库文件,编译,安装,配置,最终让该软件跑起来。一旦中间有个步骤出错,还需从头再来。本来想搞业务,却不得不先面对各种环境调试安装,痛苦之处可想而知。

而用了 Docker 之后,你只需要pull一个镜像,run一个容器,你的软件就跑起来。所有的依赖,都在镜像里帮你做好了,你完全不用care这个软件怎么安装的,只需要会用就行了。

Docker容器技术使得应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

它可以很好的解决测序软件的各种版本运行在各种环境下的问题。比如,同一个VM上同时运行两个不同版本的GATK软件。这在传统的VM模型中是不具备的,这就给基因测序构建复杂业务场景,提供了便捷性。因为环境如果损坏,可以通过容器技术,轻松的恢复。

2.1、Docker容器镜像

Docker镜像和Docker容器的关系,就像软件和进程的关系。跑起来叫容器,还没跑的文件叫镜像。

一个Docker镜像是运行一个软件所需要所有依赖的最小集。并不需要将整个OS系统放入镜像,所以Docker镜像相比VM镜像,会小很多。

如何获取目标软件的Docker镜像

2.2 如何获取一个软件对应的Docker镜像

要获取一个软件对应的Docker镜像,并不一定需要自己制作。有很多方式来获得一个Docker镜像:

首先就是从DockerHub仓库搜索

然后可以Google搜索一下软件名+docker关键字,也许会有Github仓库收录

再不然可以自己制作,自己制作镜像又分两个门派。快照派 vs  DockerFile派

最后就是求助华为容器镜像团队,协助帮忙制作啦。

下面我们分别介绍各个方法。

3、从DockerHub搜索

作为全球最大的Docker镜像中心,DockerHub网站提供了40万+的各类软件的公开Docker镜像下载,并以每周5K的速度在持续增长。所以除了是你自己开发的软件,一般都可以在这里找到对应的镜像版本。https://hub.docker.com/

举例来说,我们需要 bwa软件的镜像,可以搜索得到:

选择需要的软件版本就可以了。

PS:有以下几类软件,我们推荐从DockerHub获取,而不是自己制作的。

3.1 基础运行OS环境

像Ubuntu,Suse,Centos等这类基础OS类的镜像,我们建议直接从DockerHub获取官方认证版的。

3.2 基础编程语言类

像Java,Python,R语言,Golang等这类基础编程语言类的镜像,我们也建议直接从DockerHub获取官方认证版的。

3.3 基础通用类软件

像Tomcat,Mysql,Ngnix等这类常见的通用类的软件,我们也建议直接从DockerHub获取官方认证版的。

4、从Google搜索

基础运行OS环境虽然DockerHub可以搜索解决80%软件的问题。不过有些软件如果位于第三方的镜像仓库中,我们可以通过Google搜索来查找相关镜像。只需要把软件名加上docker关键就可以。比如:

可以看到,一般排第一个的也就是DockerHub仓库。

5、自己制作Docker镜像

自己制作Docker镜像,主要有两种:

找一个干净的基础镜像,比如Ubuntu,然后登陆系统里面把软件安装上。然后整体打个快照,就拥有了想要的软件的Docker镜像。这个就跟Ghost光盘一样。

第二种就是把软件安装的流程写成DockerFile,使用Docker build构建。

两个的构建原理是一样的,可以理解为第二种是对第一种的自动化。

5.1 打快照方式获得镜像(偶尔制作的镜像)

示例图如上,具体操作:

找一台主机,安装好Docker

启动一个空白的基础容器,并进入容器。比如启动一个 CentOS的容器。docker run -it centos.

执行安装任务。敲你平常敲的那些

退出容器。exit:退出容器

给刚才的容器,打个快照。docker commit -m "xx" -a "tsj" container-id tsj/image:tag

container-id : 刚才跑命令的容器id。可以使用 docker ps -a 查询得到;

-m : 提交时的说明文字;

tsj/image:tag : 仓库名/镜像名:TAG名

最后通过 docker images 查看得到的Docker镜像。

5.2      Dockerfile方式构建(经常更新的镜像)

上一步做镜像的方法,如果后续镜像都不变化,还行。如果经常要换(比如某个软件更新版本),那么你打镜像得累死。因为每变一次你就得重新执行那么多命令。

这时就需要使用自动化打镜像的方法。

就是把第一种打镜像的方法,用文件写出来(这个文件叫做DockerFile)。 然后执行:

docker build -t tsj/image:tag

命令,它就自动完成镜像制作了。

简单的DockerFile举例:

#Version 1.0.1

FROM centos:latest

MAINTAINER ***u "***u@163.com"

#设置root用户为后续命令的执行者

USER root

#执行操作

RUN yum update -y

RUN yum install -y java

#使用&&拼接命令

RUN touch test.txt && echo "abc" >>abc.txt

#对外暴露端口

EXPOSE 80 8080 1038

#添加文件

ADD abc.txt /opt/

#添加文件夹

ADD /webapp /opt/webapp

#添加网络文件

ADD https://www.baidu.com/img/bd_logo1.png /opt/

#设置环境变量

ENV WEBAPP_PORT=9090

#设置工作目录

WORKDIR /opt/

#设置启动命令

ENTRYPOINT ["ls"]

#设置启动参数

CMD ["-a", "-l"]

#设置卷

VOLUME ["/data", "/var/www"]

#设置子镜像的触发操作

ONBUILD ADD . /app/src

ONBUILD RUN echo "on build excuted" >> onbuild.txt

详细的可以参考:https://docs.docker.com/engine/reference/builder/

或者《华为云容器仓库SWR 最佳实践》

5.3      DockerFile基本语法

这里给出一些基础的信息

FROM:

指定待扩展的父级镜像(基础镜像)。除了注释以外,在文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerefile文件中创建多个镜像。

MAINTAINER:

RUN:

用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来对的指令会在新的镜像上继续执行。RUN 语句有两种形式:

RUN yum update:是在/bin/sh环境中执行的指令的命令

RUN ["yum", "update"]:直接使用系统调用exec来执行行。

RUN yum update && yum install nginx:使用&&符号将多条命令连接在同一条RUN语句中。

EXPOSE:

用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。运行容器时,通过参数-P(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,其他容器或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过-p(小写)参数将Dockerfile中EXPOSE中没有列出的端口设置成公开的。

ADD:

向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以使一个文件夹。

•第一个参数:源文件(夹)。如果是相对路径,它必须是相对于Dockerfile所在目录的相对路径。如果是URL,会先下载下来,再添加到镜像里去。

•第二个参数:目标路径。如果源文件是主机上zip或者tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。

VOLUME:

在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍热可以访问。

WORKDIR:

为接下来执行的指令指定一个新的工作目录,这个目录可以使绝对目录,也可以是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。

ENV:

设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量:

docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...

CMD:

用来设置启动容器时默认运行的命令。

ENTRYPOINT:

与CMD类似,也是用来指定容器启动时的默认运行的命令。区别在于:运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,CMD是覆盖。

• ENTRYPOINT [ "ls", "-l"]

• docker run centos ==> docker run centos ls -l

• docker run centos -a ==> docker run centos ls -l -a

• 我们在运行容器的时候可以通过--entrypoint来覆盖Dockerfile中的指定:docker run gutianlangyu/test --entrypoint echo "hello world"

USER:

为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。

ONBUILD:

触发器指令。构建镜像时,Docker的镜像构建器会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有心的镜像使用FROM指令指定父镜像为这个镜像时,便会触发执行。

•  使用FROM以这个Dockerfile构建出的镜像为父镜像,构建子镜像时:

•  ONBUILD ADD . /app/src:自动执行ADD . /app/src

5.4      把本地镜像上传到华为云镜像仓库

华为云Docker镜像仓库SWR服务,在它的界面有提示你如何把本地的镜像提交到云上。

6      华为云容器团队帮忙制作

如果客户已经存在一定业务量,或者开始POC,可提供适当的免费制作服务。

如果制作镜像需求上量后,可提供培训课程关于如何制作Docker镜像。并收取一定的合理费用。

Docker镜像 Docker

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据仓库服务 GaussDB(DWS)——快速创建DWS集群并导入数据(一)——创建集群
下一篇:读书笔记——《图解HTTP》第五章、第六章(上)
相关文章