zoukankan      html  css  js  c++  java
  • Docker篇章7:Docker-Dockerfile

    Docker篇章7:Docker-Dockerfile

    • Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成脚本。

      构建三个步骤:编写dockerfile文件,docker build , docker run

    dockerFile构建过程

    • dockerfile内容基本要求:

      • 每条保留字指令都必须为大写字母并且后面要跟随至少一个参数
      • 指令按照从上到下,顺序执行
      • 表示注释

      • 每条指令都会创建一个新的镜像层,并对镜像进行提交
    • Docker执行Docker的大致流程

      • docker 从基础镜像运行一个容器
      • 执行一条指令并对容器作出修改
      • 执行类似docker commit操作提交一个新的镜像层
      • docker再基于刚刚提交的镜像运行一个新的容器
      • 执行dockerfile中的下一条指令直到所有指令都执行完毕
    • 从应用角度看,DockerFile,Docker镜像与Docker容器分别代表软件三个不同阶段:

      • DockerFile是软件的原材料
      • Docker镜像是软件的交付品
      • Docker容器则可以认为是软件的运行态
      • DockerFile面向开发,Docker镜像成为交付标准,Docker容器则设计部署与运维,三者缺已不可,合力充当Docker体系基石。

    DockerFile 需要定义一个Dockerfile,Dockerfile定义进程需要的一切东西,Dockerfile设计的内容包括执行代码或者是文件、环境变量、依赖包、运行环境、动态链库、操作系统的发型版,服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)
    
    Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务。
    
    Docker容器,容器是直接提供服务
    

    DockerFile保留的字指令

    • FROM

      基础镜像,当前新镜像是基于那个镜像
      
    • MAINTAINER

      镜像维护者的姓名和邮箱地址
      
    • RUN

      容器构建时候需要运行的命令
      
    • EXPOSE

      当前容器对外暴露出的端口
      
    • WORKDIR

      指定在创建容器后,终端默认登录进来工作目录。
      
    • ENV

      用来在构建镜像过程中设置环境变量
      
    • ADD

      在宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
      
    • COPY

      类似于ADD,拷贝文件和目录到镜像中
      将从构建上下文目录中<源路经>的文件/目录复制到新的一层的镜像内的<目标路径>位置。
      书写方式有2种:
      	COPY src dest
      	COPY ['src', 'dest']
      
    • VOLUME

      容器数据卷,用于数据保存和持久化工作
      
    • CMD

      指定一个容器启动时运行的命令
      
      

      注意:dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。

    • ENTRYPOINT

      指定一个容器启动时运行的命令
      

      注意:ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数,会在docker run之后追加

    • ONBUILD

      当构件一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
      

    DockerFile案例:

    1.dockerFile构建自己centos:

    • 关闭所有容器

      docker rm -f $(docker ps -q)
      
    • 编写DockerFile

      vim mydockerfile2
      
      # 继承于centos
      FROM centos
      # 编写作者
      MAINTAINER xkl<xxx@163.com>
      # 环境目录
      ENV MYPATH /usr/local
      # 进入容器默认到此目录
      WORKDIR $MYPATH
      # 安装 vim,net-tools
      RUN yum -y install vim
      RUN yum -y install net-tools
      # 暴露80端口
      EXPOSE 80
      # 打印信息
      CMD echo $MYPATH
      CMD echo 'success---------[OK]'
      # 以shell脚本进入
      CMD /bin/bash
      
    • 构建

      # 构建镜像mycentos,1.3版本成功。
      docker build -f /mydocker/mydockerfile2 -t mycentos:1.3 .
      
    • 运行

      docker run -it REPOSITORY:TAG
      docker run -it centos:1.3
      [root@37911b322ad0 local]# ifconfig
      # 可以查看网卡
      
    • 查看镜像构建顺序

      docker history [IMAGE ID]
      

    2.CMD和ENTRYPONIT案例

    • Dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。

      当我们执行:
      docker run -it -p 7777:8080 tomcat ls -l
      # 则会覆盖构建tomcat的dockerFile的最后一个CMD命令。并且会进入容器内执行ls -l
      # 相当于,dockerFile中加了一句 CMD ["ls", "-l"]。并且容器没有被启动。
      
    • 制作CMD版本的查询IP

      vim mydockerfile3
      
      # 写入dockerFile
      FROM centos
      RUN yum install -y curl
      CMD ["curl", "-s", "http://ip.cn"]
      
      # 构建镜像
      docker build -f /mydocker/mydockerfile3 -t myip .
      
      #运行,会返回ip 所在地。
      docker run -it myip
      
      # 但是存在问题,当我想看详细头信息时候,就会报错,原因是当前执行curl为CMD命令,而 -i会覆盖之前curl命令,导致dockerfile结尾添加依据 curl -i .所以会报错
      docker run -it myip -i
      
      
    • ENTRYPONIT版本的查询IP

      vim mydockerfile4
      
      # 写入dockerFile
      FROM centos
      RUN yum install -y curl
      ENTRYPOINT ["curl", "-s", "http://ip.cn"]
      
      # 构建镜像
      docker build -f /mydocker/mydockerfile4 -t myip2 .
      
      #运行,会返回ip 和 头信息 因为添加-i 可在 原有ENTRYPOINT命令下添加 -i
      docker run -it myzip2 -i
      

    3.ONBUILD案例

    • ONBUILD 应用在原有mydockerfile4中添加此句

      # 表示别的继承我这个镜像会打印此句,在原有mydockerfile4添加一句
      ONBUILD RUN echo "father....1111"
      
    • 构建父镜像

      # 构建一个父镜像
      docker build -f /mydocker/mydockerfile4 -t myip_father .
      
    • 另写一个dockerfile 为mydockerfile5

      # 另写一个dockerfile 为mydockerfile5
          FROM myip_father	#继承my_father的镜像
          RUN yum install -y curl
          ENTRYPOINT ["curl","-s","http://ip.cn"]
      # 此时用mydockerfile5 构建镜像
      docker build -f /mydocker/mydockerfile5 -t myip_son .
      # 构建镜像myip_son时,因mydockerfile5继承my_father 镜像,会执行ONBUILD,构件时候会打印"father......1111"这句话
      
  • 相关阅读:
    深度学习代码注解(一)—— mnistdeepauto
    只属于你我的共同记忆
    只属于你我的共同记忆
    道教的认识
    道教的认识
    作家、文学大家、大师的艺术风格
    作家、文学大家、大师的艺术风格
    视频、画面、语言、文字与脑海、心灵
    视频、画面、语言、文字与脑海、心灵
    URAL 1963 Kite 四边形求对称轴数
  • 原文地址:https://www.cnblogs.com/xujunkai/p/13031767.html
Copyright © 2011-2022 走看看