码迷,mamicode.com
首页 > 其他好文 > 详细

docker-dockerfile

时间:2018-12-26 16:52:59      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:服务   nat   .com   group   命令行参数   交互   explore   二进制   ofo   

  • 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/

    docker-dockerfile

    标签:服务   nat   .com   group   命令行参数   交互   explore   二进制   ofo   

    原文地址:http://blog.51cto.com/12580678/2335489

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!