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

举报
tsjsdbd 发表于 2018/09/11 19:45:09 2018/09/11
【摘要】 指导Docker入门者,如何获得想要的软件的Docker镜像。先找,找不到则自己做。自己制作又分:简单方式和DockerFile方式。 方便刚入Docker坑的同学使用。

1、服务相关术语 

术语

介绍

备注

镜像

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

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

DockerFile

制作Docker镜像的描述文件


2、Docker容器

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


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

image.png                                               

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


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


2.1、Docker容器镜像

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


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


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

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

  1. 首先就是从DockerHub仓库搜索

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

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

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

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


3、从DockerHub搜索

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

3e.jpg

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

2e.jpg

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

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

3.1 基础运行OS环境

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

image.png


3.2 基础编程语言类

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

image.png


3.3 基础通用类软件

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

image.png


4、从Google搜索

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

image.png

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


5、自己制作Docker镜像

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

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

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

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

spacer.gifspacer.gif

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

 image.png


示例图如上,具体操作: 

  1. 找一台主机,安装好Docker

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

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

  4. 退出容器。exit:退出容器

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

  • -a : 提交的镜像作者;

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

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

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

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


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

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

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

image.png

就是把第一种打镜像的方法,用文件写出来(这个文件叫做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服务,在它的界面有提示你如何把本地的镜像提交到云上。

 image.png


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

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

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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200