• dockerfile


    一、简介

    从应用软件的角度看,DockerFile,Docker镜像与Docker容器分别代表软件的三个不同阶段
    
        #DockerFile是软件的原材料
        #Docker镜像是软件的交付品
        #Docker容器可以认为是软件的运行态
    
     DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

    如图

    #是什么
        Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
    
    #常用命令
        FROM             定义了使用哪个基础镜像启动构建流程
        MAINTAINER   镜像维护者的姓名和邮箱
        RUN                 容器构建时需要的命令
        EXPOSE            容器对外暴漏的端口
    
        ENV                  设置环境变量 (可以写多条)
        WORKDIR         终端默认登陆进来的落脚点   
        ADD                 将宿主机目录下的文件拷贝进镜像,并且会自动处理URL和解压tar包
        copy                类似ADD,只不过没有解压功能
        VOLUME           容器数据卷,用于数据保存和持久化
        CMD                指定一个容器启动时的命令,
              dockerfile中有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
    
        ENTRYPOINT           同上
    
    
        ONBUILD    当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild会触发

     1、自定义centos

    [root@linuxxx ~]# docker pull centos        #新拉下来一个centos镜像
    
    [root@linuxxx ~]# docker run -it centos /bin/bash     #运行镜像
    
    [root@220f2981c7b6 /]# pwd           #落脚点是根
    /
    [root@220f2981c7b6 /]# vim a.txt        #精简版的centos,不支持vim
    bash: vim: command not found
    [root@220f2981c7b6 /]# ifconfig               #不支持ifconfig
    bash: ifconfig: command not found
    
    ---------------------------------------
    #此时想给centos定制自己需要的功能
    
    [root@linuxxx /]# mkdir mydocker      #创建文件夹
    
    [root@linuxxx /]# cd /mydocker/         #进入文件夹
     
    [root@linuxxx mydocker]# vi dockerfile        #编写dockerfile文件
    ------------------------------------------------
    #编写内容如下
    FROM centos
    MAINTAINER moker<moker@1231.com>
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "success------ok"
    CMD /bin/bash
    
    
    --------------------------------------------
    #然后绑定,注意最后有一个点
    [root@linuxxx mydocker]# docker build -f /mydocker/dockerfile -t  mycentos:1.6 .
    
      #发现自定义的centos比较大,dockers只把最需要的内核留下来,其他的舍弃
    [root@linuxxx mydocker]# docker images   
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mycentos            1.6                 23dad1e39517        2 minutes ago       481MB
    centos              latest              9f38484d220f        4 months ago        202MB
    
    
    [root@linuxxx mydocker]# docker run -it mycentos:1.6    #运行自定义的
    [root@9c69ba4ba1de local]#  
    [root@9c69ba4ba1de local]# 
    [root@9c69ba4ba1de local]# pwd        #落脚点是自己定义的
    /usr/local
    [root@9c69ba4ba1de local]# 
    [root@9c69ba4ba1de local]# 
    [root@9c69ba4ba1de local]# vim a.txt       #有vim了
    [root@9c69ba4ba1de local]# cat a.txt
    Moker
    [root@9c69ba4ba1de local]# ifconfig        #支持ifconfig了
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    自定义centos

    2、CMD与ENTRYPOINT

    #共同点
      都是指定一个容器启动时要运行的命令
    
    #不同点
         Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
        ENTRYPOINT  docker run 之后的参数会当作参数传递给ENTRYPOINT,之后形成新的命令组合
    
    ------------------------------------------------------------------
    例:
    #1、会正常执行dockerfile中的最后一行
      [root@linuxxx ~]# docker run -it -p 8888:8080 tomcat 
        CMD["catalina.sh","run"]
    #2、会在最后一行追加一行CMD,并且只执行最后一行添加的
      [root@linuxxx ~]# docker run -it -p 8888:8080 tomcat  ls -l 
        CMD["catalina.sh","run"]
        CMD ls -l
    #CMD
    [root@linuxxx /]# cd mydocker/
    [root@linuxxx mydocker]# vi dockerfile1
    
    ----------------------------------
    FROM centos
    RUN yum install -y curl     #下载curl
    CMD ["curl","-s","http://ip.cn"]
    #执行docker run -it myip -i
    #相当于
        CMD ["curl","-s","http://ip.cn"]
        CMD ["-i"]
    
    ----------------------------
    [root@linuxxx mydocker]# docker build -f /mydocker/dockerfile1 -t myip .
    [root@linuxxx mydocker]# docker run -it myip
    
    [root@linuxxx mydocker]# docker run -it myip -i
    
    #报错
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: "-i": executable file not found in $PATH": unknown.
    
    
    --------------------------------------------------------
    [root@linuxxx mydocker]# cp dockerfile1 dockerfile2
    [root@linuxxx mydocker]# vi dockerfile2
    -----------------------------
    FROM centos
    RUN yum install -y curl
    ENTRYPOINT ["curl","-s","http://ip.cn"]
    
    # 执行这一句,docker run -it myip1 -i
        相当于ENTRYPOINT ["curl","-s","i"  ,"http://ip.cn"]
    
    
    ---------------------------------
    [root@linuxxx mydocker]# docker build -f /mydocker/dockerfile2 -t myip1 .
    [root@linuxxx mydocker]# docker run -it myip1 -i 
    
    #可以正常输出结果
    HTTP/1.1 301 Moved Permanently
    Date: Wed, 07 Aug 2019 09:12:27 GMT
    Transfer-Encoding: chunked
    Connection: keep-alive
    Cache-Control: max-age=3600
    Expires: Wed, 07 Aug 2019 10:12:27 GMT
    Location: https://ip.cn/
    Server: cloudflare
    CF-RAY: 502821016efc92b6-SJC
    CMD与ENTRYPOINT练习
  • 相关阅读:
    python 发送带有附件的邮件
    【转】python的定时任务
    git 日常命令
    go之基础语法等相关内容-148
    redis集群等相关内容-147
    redis高级部分等相关内容-146
    sqlachemy之增删改查等相关内容-145
    flask之wtforms、信号、sqlalchemy等相关内容-144
    flask之上下文源码、flask-session、数据库连接池、flask-script等相关内容-143
    flask之中间件、蓝图、请求上下文等相关内容-142
  • 原文地址:https://www.cnblogs.com/pdun/p/11315089.html
Copyright © 2020-2023  润新知