Docker篇章7:Docker-Dockerfile

yss0 2020-06-02

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体系基石。

Docker篇章7:Docker-Dockerfile

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被触发

Docker篇章7:Docker-Dockerfile

DockerFile案例:

1.dockerFile构建自己centos:

  • 关闭所有容器

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

    vim mydockerfile2
    
    # 继承于centos
    FROM centos
    # 编写作者
    MAINTAINER xkl<>
    # 环境目录
    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
    [ 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"这句话

相关推荐