博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker-dockerfile
阅读量:6981 次
发布时间:2019-06-27

本文共 3726 字,大约阅读时间需要 12 分钟。

  • 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 /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(常用于构建二进制包类)
    对多行参数排序
    避免安装不必要的包

  • 示例:

参考资料:

转载于:https://blog.51cto.com/12580678/2335489

你可能感兴趣的文章
三地跨区域链路 汇聚统一监控平台——国际化综合性顾问咨询公司阿特金斯
查看>>
SQL SERVER与MYSQL 的重复插入的区别
查看>>
cocos2d-x学习笔记09:动作2:持续动作
查看>>
网络嗅探软件全接触(2)
查看>>
J0ker的CISSP之路:复习-Information Security Management(4)
查看>>
使用CSS 3创建不规则图形
查看>>
SCOM 2007 R2监控系统安装部署(三)安装SCOM报表服务器和审计服务器
查看>>
服务契约
查看>>
Lync Server 2010标准版系列PART6:启用Lync
查看>>
.net framework3.5新特性1:Lambda表达式
查看>>
虚拟化系列-Citrix XenServer 6.1 网络管理
查看>>
是谁令我离开生活了16年的广州
查看>>
MySQL数据库的主从同步实现及应用
查看>>
阿里游戏云与Intel,iTechClub以及巨人网络共同发布的“TOP游戏”云生态培育计划合作...
查看>>
Hyper-V2:向VM增加虚拟硬盘
查看>>
解决 vs2010 安装过程 提示序列号非法问题
查看>>
flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
查看>>
[转载]AxureRP 7超强部件库下载
查看>>
fiddler https
查看>>
ASP.NET 2.0中合并 GridView 的表头单元格(转)
查看>>