• docker文件存储驱动
  • dockerfile镜像构建
  • 指令
  • 示例

dockekr镜像是只读的,对容器修改的内容,一旦容器退出,所有的内容将会丢失。镜像是分层的,最上的一层为读写层(写时复制和用时分配)

  • 文件系统存储驱动:

    • AUFS:UnionFS,Another UFS, Alternative UFS, Adanced UFS
      UnionFS:把不同的物理位置的目录合并到同一个目录中。
    • Device mapper:类似AUFS
      Linux 2.6内核引入的最重要的技术之一,用于在内核中支持逻辑卷管理的通用设备映射机制;
    • Mapped Device
      Mapping Table
      Target Device:源设备
    • overlayFS:Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层
  • Docker Images:镜像的构建方法:
    docker commit:不建议使用,不知道构建过程,“黑盒子”
    Dockerfile:文本文件,镜像文件构建脚本;
  • Dockerfile
    由一些系列用于基础镜像构建新的镜像文件的专用指令序列组成。指令:选定基础镜像、安装必要程序、、复制配置文件和数据文件、自动运行的服务以及要暴露的端口等
    语法:指令行、注释行、空白行
    指令行:由指令及指令参数构成,指令其字符不区分大小写,约定俗成,使用全大写;
    注释行:#号开头,必须单独位于一行中
    空白行:忽略

  • 例如简单运行一个Web服务
    FROM centos:latest
    #基础镜像centos最新版本来自dockerhub官方
    ADD CentOS7-Base-163.repo /etc/yum.repos.d/Centos.repo
    #把本地的yum配置文件复制到构建容器的yum仓库
    RUN yum makecache fast && yum install nginx -y && yum clean all
    #安装Nginx并清除缓存
    EXPOSE 80
    #暴露80端口
    CMD ["nginx","-g","daemon off;"]
    #运行nginx于前台,在镜像构建完成后才会执行
  • 指令:

    • FROM指令:必须是第一条非注释行,用于指定用到的基础镜像,一般使用构建好的官方镜像,也可以自己构建
      语法:
      FROM [:]
      FROM [:]@ #校验码防止异常
      FROM busybox:latest 、FROM centos:7

    • MAINTAINER:用于提供信息,如提供构建者相关信息,建议紧跟FROM指令后,非必须指令
      语法:
      MAINTAIN
      MAINTAINER maintainer xuetong

    • COPY:用于从docker宿主机复制文件到所要创建的镜像文件系统中,源文件的元数据会保留
      语法:
      COPY [--chown=:] ... #空格隔开多个源文件,要复制的源文件或目录,支持使用通配符
      COPY [--chown=:] ["",... ""]:(文件名中有空白字符时使用此种格式)
      例如:
      COPY flanneld.service /etc/systemd/system/flanneld.service
      COPY *.conf /etc/httpd/conf.d/
      由于构建过程将本地dockerfile和相关文件发送至server端构建,路径需使用上下文目录,源文件不能使用类似“../some_dir/some_file”类的路径;
      可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录

    • ADD :类似COPY指令,但更高级用法,额外还支持复制TAR文件,以及URL路径下载
      语法:
      ADD [--chown=:] ...
      ADD [--chown=:] ["",... ""]
      例如:
      ADD haproxy.cfg /etc/haproxy/haproxy.cfg
      ADD http://www.magedu.com/download/nginx/conf/nginx.conf /etc/nginx/ #文件权限为600
      ADD epel.repo.tar.gz /etc/yum.repos.d/ #会自动解压
      如果使用copy:COPY epel.repo.tar.gz /etc/yum.repos.d/ RUN cd /etc/yum.repos.d/ && tar xf epel.repo.tar.gz

    • ENV:设置环境变量,可以被当前Dockerfile文件中其他指令使用,调用格式为:$Var_name/${Var_name},相当于在本地执行export USER_HOME="/root"
      语法:
      ENV #一次只能设置一个
      ENV = ... #可以设置多个变量 ,中有空白字符,要使用\字符进行转义或加引号;换行 \
      ENV name="xiao qin"

    • USER: Dockerfile文件中的任何RUN/CMD/ENTRYPOINT指令指定的程序时的用户名或UID
      语法:
      USER |

    • WORKDIR: 用于指定当前镜像的工作目录,可以多次使用
      语法:
      WORKDIR
      WORKDIR /etc/sysconfig/network-scripts
      WORKDIR $STATEPATH #变量名ENV中定义

    • VOLUME:用于目标镜像文件中创建一个挂载点目录,用于挂载主机上的卷
      语法:
      VOLUME
      VOLUME ["", ""...]

    • EXPOSE:用于为容器指定要暴露的端口;当使用-大P时可以把默认端口映射至主机
      语法:
      EXPOSE [/] [[/]] ... #为tcp或udp二者之一,默认为tcp;
      例如:
      EXPOSE 11211/tcp 11211/udp 80

    • RUN:用于指定docker build过程中要运行的命令,而不是docker run 此dockerfile构建成的镜像时运行;
      语法:
      RUN #shell来执行命令
      RUN ["", "", "", ...] #不会启动shell,不支持通配符、命令替换

    • CMD:似于RUN指令,用于运行程序;但二者运行的时间点不同;CMD在docker run时运行,而非docker build;
      CMD指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束;不过,CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。
      语法:
      CMD ["executable","param1","param2"] #使用exec执行,推荐的方式
      CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用
      CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
      注意:如果dockerfile中存在多个CMD指令,仅最后一个生效;

    • ENTRYPOINT:似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序;可以使用该指令做一些初始化操作,写成脚本,若要让CMD指令继续往下走,可以在脚本中添加:exec "$@",否则后面指令不会执行
      语法:
      ENTRYPOINT ["executable","param1","param2"]
      ENTRYPOINT command param1 param2 (shell中执行)

    • jq工具:用来解析json格式 yum install jq
      docker inspect web | jq .[]."Mounts" #查看web的挂载json信息

  • dockerfile最佳实践
    镜像尽可能减少分层、基础镜像尽可能小,如Ubuntu、Debian、alpine(常用于构建二进制包类)
    对多行参数排序
    避免安装不必要的包

  • 示例:

参考资料:
http://dockone.io/article/1513
https://hub.docker.com/explore/