zoukankan      html  css  js  c++  java
  • 如何获取目标软件的Docker镜像

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

    1、服务相关术语 

    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构建。

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

    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镜像。并收取一定的合理费用。

    来源:华为云社区  作者:tsjsdbd

  • 相关阅读:
    Java开源内容管理CMS系统J4CMS支持静态化直接ftp上传到你的空间了
    JAVA数组的定义及用法
    从本地上传整个目录到hdfs的java程序
    图片轮显效果大全
    Windows 自己主动关机命令 shuntdown
    Android源码是这样搞到的(图解)
    JSONObject与JSONArray的使用
    教你用笔记本破解无线路由器password
    tomcat配置文件server.xml具体解释
    SQLite的SQL语法
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165950.html
Copyright © 2011-2022 走看看