• 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 <IMAGE>[:<TAG>] FROM <IMAGE>[:<TAG>]@<DIGEST> #校验码防止异常 FROM busybox:latest 、FROM centos:7

    • MAINTAINER:用于提供信息,如提供构建者相关信息,建议紧跟FROM指令后,非必须指令 语法: MAINTAIN <author‘ detail> MAINTAINER maintainer xuetong xuetong@linux.com

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

    • ADD :类似COPY指令,但更高级用法,额外还支持复制TAR文件,以及URL路径下载 语法: ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] 例如: 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 <KEY> <VALUE> #一次只能设置一个 ENV <key>=<value> ... #可以设置多个变量 ,中有空白字符,要使用\字符进行转义或加引号;换行
      ENV name="xiao qin"

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

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

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

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

    • RUN:用于指定docker build过程中要运行的命令,而不是docker run 此dockerfile构建成的镜像时运行; 语法: RUN <command> #shell来执行命令 RUN ["<executeable>", "<param1>", "<param2>", ...] #不会启动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/