zoukankan      html  css  js  c++  java
  • docker学习笔记-06:自定义DockerFile生成镜像

    一、自定义centos的DockerFile

    1、从阿里源里拉的centos镜像新建的容器实例中,没有vim编辑器和ifconfig命令,所以自定义centos的DockerFile,创建自己想要的镜像。

    FROM centos
    MAINTAINER dyy <dyyjxcjdx@163.com>
    
    ENV MYPATH /tmp      # 设置环境变量
    
    WORKDIR $MYPATH   # $表示引用上面的路径
    
    RUN yum -y install vim   # 安装vim
    RUN yum -y install net-tools
    
    EXPOSE 80   # 端口为80
    
    CMD echo $MYPATH
    CMD echo "success------ok"
    CMD /bin/bash

    2、执行DockerFile生成自定义的镜像,-f后面指定DockerFile文件的路径,-t后面加新镜像的名称和TAG,最末尾要加上一个 “ . ”号。

    docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .       # 注意最后要加一个 . 号

    3、基于自定义创建的镜像,创建新的容器实例。

    docker run -it mycentos:1.3

    二、CMD和ENTRYPOINT的区别

    1、CMD

    (1)tomcat在Docker Hub上的DockerFile,最后一行为CMD命令,表示启动tomcat服务。

    CMD ["catalina.sh", "run"]

    (2)如果在创建tomcat的容器实例时,在docker run 后面加了命令参数  ls -l:

    docker run -it -p 7777:8080 tomcat ls -l

    (3)那就相当于在DockerFile最后一行加了如下命令。那么会把启动tomcat服务的命令替换掉,那么docker run 执行之后,不会启动服务。

    CMD ls -l

    (4)所以DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换。

    2、ENTRYPOINT

    (1)docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合。

    (2)制作CMD版可以查询ip信息的容器,编辑DockerFile文件,文件内容如下:

    FROM centos
    
    RUN yum install -y curl
    
    CMD ['curl','-s','https://ip.cn']     # 执行不了的话改为 CMD curl -s https://ip.cn

    然后执行DockerFile文件,用docker build创建镜像 myip01,再docker run得到一个容器实例,输出ip地址。

    docker build -f /mydocker/DockerFile3 -t myip01 .
    docker run -it myip01

    问题是如果需要扩展功能,希望在得到ip地址的同时得到HTTP头信息,那么要加上 -i 参数。那么用CMD就会出问题了。

    (3)制作ENTRYPOINT版的查询ip地址的容器,编辑的DockerFile文件的内容如下:

    FROM centos
    
    RUN yum install -y curl
    
    ENTRYPOINT ["curl","-s","https://ip.cn"]

    同样的docker build ---> docker run 执行。希望在得到ip地址的同时得到HTTP头信息,那么要加上 -i 参数,此时不会出问题。

    docker build -f /mydocker/DockerFile4 -t myip02 .
    docker run -it myip02 -i

    得到结果:

    HTTP/1.1 200 OK
    Date: Tue, 10 Sep 2019 03:40:49 GMT
    Content-Type: application/json; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Set-Cookie: __cfduid=dcd0856220b503fa61946688c0a7210bb1568086849; expires=Wed, 09-Sep-20 03:40:49 GMT; path=/; domain=.ip.cn; HttpOnly
    Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
    Server: cloudflare
    CF-RAY: 513e61fadc756e54-SJC
    
    {"ip": "220.248.17.218", "country": "上海市", "city": "联通"}

    三、ONBUILD命令

    1、当构建一个将要被继承的父镜像的DockerFile时,加入ONBUILD命令。只要子镜像继承了父镜像,就会执行ONBUILD后面的命令,也就是ONBUILD被触发。

    2、编写DockerFile文件,用于创建新的父镜像。

    FROM centos
    
    RUN yum install -y curl
    
    ENTRYPOINT ["curl","-s","https://ip.cn"]
    ONBUILD RUN echo "father onbuild -----886"

    3、执行DockerFile创建父镜像

    docker build -f /mydocker/DockerFile4 -t myip_father .

    4、编写子镜像的DockerFile文件,明确继承自父镜像。

    FROM myip_father      # 继承自父镜像
    
    RUN yum install -y curl
    
    CMD curl -s https://ip.cn

    5、执行子镜像的DockerFile创建子镜像。

    docker build -f /mydocker/DockerFile5 -t myip_son .

    得到结果:Executing 1 build trigger     ------->表明onbuild被触发

    Sending build context to Docker daemon  6.144kB
    Step 1/3 : FROM myip_father
    # Executing 1 build trigger                    '''执行onbuild触发器'''
     ---> Running in eb2da8cf92a0
    father onbuild -----886
    Removing intermediate container eb2da8cf92a0
     ---> 78a71071f237
    Step 2/3 : RUN yum install -y curl
     ---> Running in 2e7f7f3070bf
    Loaded plugins: fastestmirror, ovl
    Loading mirror speeds from cached hostfile
     * base: mirrors.163.com
     * extras: mirrors.163.com
     * updates: mirrors.cn99.com
    Package curl-7.29.0-51.el7_6.3.x86_64 already installed and latest version
    Nothing to do
    Removing intermediate container 2e7f7f3070bf
     ---> 9083e355b88f
    Step 3/3 : CMD curl -s https://ip.cn
     ---> Running in 84b3520173ef
    Removing intermediate container 84b3520173ef
     ---> c83251bcff40
    Successfully built c83251bcff40
    Successfully tagged myip_son:latest

  • 相关阅读:
    008. 限制上传文件的大小
    007. 实现登录验证的方式
    006. 创建包含公共类的文件夹
    005. asp.net页面常用指令
    004. 连接默认错误页
    003. 连接access数据库代码
    VS2013生成Release版本MFC程序在其他机器上运行
    MFC WebBrowser判断网页加载完成
    第一课 JAVA环境与第一个HelloWorld运行
    HTTP协议详解&TCP&OSI七层概念模型
  • 原文地址:https://www.cnblogs.com/Luv-GEM/p/11496618.html
Copyright © 2011-2022 走看看