一、概述

自制镜像的目的不是为了解决配置更新的问题,而是为了定制化应用服务。

镜像的制作:基于容器制作;dockerfile

dockerfile的格式:注释信息+指令(约定俗成使用大写)及其参数

dockerfile中的指令是顺序执行的,第一个非注释行必须是“FROM”指令。

docker制作镜像的工作逻辑:专用的工作目录,文件名首字母大写的dockerfile文件;引用的文件或目录路径不能是工作目录的父目录,只能是当前目录或子目录,因此需要将使用的文件放到此目录下。

dockerfile中每一条指定都会生成一层镜像层,所以要尽量少写指令。

构建命令:docker build --help

二、操作

1、指令

  • From:dockerfile文件的第一个非注释行,用于为镜像文件构建过程中指定基准镜像,后续的指定运行于此基准镜像所提供的的运行环境。(FROM <repository>:<tag>)
  • LABEL:为一个镜像指定元数据,键值对。(LABEL <key>=<value> <key>=<value>)
  • COPY:用于从docker宿主机复制文件到创建的新镜像文件。src支持使用通配符,dest如果是目录,末尾一定要写/,否则会被识别为文件;src路径使用相对路径,dest使用绝对路径;src是目录,则目录中的文件会被递归复制,但src目录自身不会被复制。(COPY <src> <dest>)
  • ADD:类似COPY,支持使用tar文件和URL路径。如果<src>是一个本地系统上的tar文件,将被自动展开为一个目录,其行为类似于tar -x,但通过URL获取到的tar文件不会被展开。(ADD <src> <dest>;ADD ["<src>",..., "<dest>"])
  • WORKDIR:指定工作目录,可以使用多次。(WORKDIR <dir>)
  • VOLUME:用于在image中创建一个挂载点目录,类似于命令中docker管理的挂载卷。(VOLUME <mountpoint>)
  • EXPOSE:用于为容器打开指定要监听的端口以实现与外部通信,可一次指定多个端口。指定暴露端口,但不会自动暴露到外部,run时-P才会动态绑定到宿主机的随机端口和所有地址。(EXPOSE <port>[/<protocol>] <port>[/<protocol>]),protocol指定传输层协议,tcp或udp,默认tcp。
  • ENV:用于为镜像定义所需的环境变量,可被用于Dockerfile中位于其后的其他指令调用,调用格式为$variable_name或${variable_name}。在创建容器时是能够重新配置环境变量的。(ENV <key> <value>;ENV <key>=<value>)
  • RUN:用于指定docker build过程中运行的程序,可以是任何命令,构建镜像过程中运行的命令,是基于基础镜像中的命令执行的,可运行多次。(RUN <command>或 RUN ["<executable>","<param1>","<param2>"])。第一种用法通常以“/bin/sh -c”来运行命令,在容器中的pid不为1,但会默认执行exec操作,将该进程号替换为1;第二种用法,不会以“/bin/sh -c”来发起,直接由内核创建,不支持shell操作符和使用shell环境变量,pid为1。
  • CMD:同RUN,但二者运行时间点不同。是在创建容器时没有指定运行命令时默认运行的命令,通常与ENTRYPOINT结合使用,存在多个CMD时,只有最后一个生效。CMD指定的命令可以被docker run的命令行选项覆盖。(CMD <command>或 CMD ["<executable>","<param1>","<param2>"]或CMD ["<param1>","<param2>")。第一种用法和第二种用法同RUN;第三种用法用于为ENTRYPOINT指令提供默认参数。
  • ENTRYPOINT:类似CMD的功能,为容器指定默认运行程序。不同的是,ENTRYPOINT启动的程序不会被docker run时的参数覆盖,并且这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序。--entrypoint可覆盖ENTRYPOINT指定的默认程序。可存在多个,仅有最后一个生效。(ENTRYPOINT <command>或 ENTRYPOINT ["<executable>","<param1>","<param2>"])   ---   注:json数据中,要使用双引号。
  • USER:用于指定运行指令(RUN,CMD,ENTRYPOINT)时的用户名或UID,需要是已存在的用户,默认使用root。(USER <UID>|<UserName>)
  • HEALTHCHECK:用于定义docker检测某个容器的健康状态的行为。(HEALTHCHECK [OPTIONS] CMD <command>或HEALTHCHECK NONE -- 拒绝任何的健康状态检测)
  • SHELL:用于指定运行指令默认要使用的shell程序,默认是linux下是[“/bin/sh,"-c”],windows是[“cmd”,"/S","/C"]。( SHELL ["<executable>","<parameters>"])
  • STOPSIGNAL:接收到什么信号容器才会退出,默认是-15,docker stop就是发送的-15的信号。(STOPSIGNAL signal)
  • ARG:构建过程中使用的变量,只在build中使用,可以在build中使用--build-arg传参数替换默认值。(ARG <name>[=<default_value>])
  • ONBUILD:用于在dockerfile中定义一个触发器,即此制作的镜像作为基础镜像被使用,其他人在build他们的镜像时会触发ONBUILD定义的指令。不能自动嵌套,不会触发FROM和MAINTAINER指令。(ONBUILD <INSTRUCTION>)

三、其他

注:直接在命令行启动一个进程,该子进程的父进程是当前shell,并且占用shell的终端输出;command & 运行一个进程,不占用当前shell的终端输出,但其父进程还是当前shell,shell退出进程也会退出;nohup command &,将当前进程送到后台,剥离与当前shell的父子关系,其父进程为init。

docker stop/kill 停止容器时,容器内接收信号的都是进程号为1的进程。

shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉。

6.dockerfile的更多相关文章

  1. 如何用Dockerfile创建镜像

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5181222.html 创建镜像的目的 首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有 ...

  2. Dockerfile初探

    git上的asp.net samples工程已经写好了docker file,内容是如下   //任何dockersfile都要以FORM开头,约定是用大写. FROM microsoft/aspne ...

  3. ubuntu 16.04 Dockerfile 安装mysql

    默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们首先要设置MariaDB仓库. 配置MariaDB 仓库 # apt-get install software-prope ...

  4. 分析Mysql 5.6的Dockerfile

    Docker官方的Mysql镜像的Dockerfile托管在Github上,地址如下: https://github.com/docker-library/mysql/tree/5836bc9af9d ...

  5. 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像

    Dockerfile内容如下: FROM centos MAINTAINER Victor ivictor@foxmail.com WORKDIR /root RUN rm -f /etc/yum.r ...

  6. Docker dockerfile创建Eclipse镜像初试

    抽空初步阅读了Docker技术入门与实战 [Kindle电子书] http://www.cnblogs.com/2018/p/4600116.html 现在想首先在开发环境下引入统一的环境,由于开发中 ...

  7. 安装Nginx的Dockerfile实例

    #################################################Dockerfile to build Nginx Installed Containers##Bas ...

  8. 测试dockerfile

    测试dockerfile是否ok(比如我的Dockerfile在deploy目录下) docker build -t my_image -f deploy/Dockerfile . docker im ...

  9. 通过Dockerfile建立.NET Core mvc Image

    生成.NET core mvc code docker run -itd microsoft/dotnet:latestdocker psdocker attach containeridmkdir ...

  10. .Net Core+cenos7+Docker+Dockerfile 部署实践

    因为这段时间比较忙,同时也在抽时间将开发框架转移到 .net Core 上 所以写博客的时间就少了,这次我利用dockerfile成功将.net Core程序部署到了cenos7容器中,特抽时间把我的 ...

随机推荐

  1. mysql的my.cnf参数详解

    转载[Mysql] MySQL配置文件my.cnf的理解 一.缘由 最近要接手数据库的维护工作,公司首选MySQL.对于MySQL的理解,我认为很多性能优化工作.主从主主复制都是在调整参数,来适应不同 ...

  2. ORACLE 根据sql_id查询绑定变量的传入值

    当前查询: select b.NAME, b.POSITION, b.DATATYPE_STRING, b.VALUE_STRING, b.LAST_CAPTURED from v$sql_bind_ ...

  3. 【洛谷P1219 八皇后】

    参考思路见白书(一本通) 题目链接 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上 ...

  4. qbzt day7上午

    由于优盘咕咕咕了,所以这篇就咕咕咕了 以后还会补上的 qwq

  5. (转)datagridview 自定义列三步走

    本文转载自:http://blog.csdn.net/zx13525079024/article/details/4814642 我们如果想自定义实现datagridview的某列,例如是datagr ...

  6. npm构建vue项目

    环境搭建 我们需要先从node.js官网安装node,安装过程很简单,一路“下一步”就可以了(傻瓜式安装). 安装完成之后,打开命令行工具(Mac打开终端),输入 node -v,如图,如果出现相应的 ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_1_线程池的概念和原理

    线程的底层原理 集合有很多种,线程池的集合用LinkedList最好

  8. unique()与nunique()

    1 unique() 统计list中的不同值时,返回的是array.它有三个参数,可分别统计不同的量,返回的都是array. 当list中的元素也是list时,尽量不要用这种方法. import nu ...

  9. JMeter性能测试入门-不同类型线程组的使用

    jmeter不同线程组的详解 在做性能测试之前,我们来了解一下JMeter多个不同线程组的应用.首先,JMeter提供了三个基本的线程组,分别为: Thread Group setUp Thread ...

  10. 百度地图转腾讯地图腾讯地图转百度地图(还有方法二就是使用百度地图api 转火星坐标)

    public static double pi = 3.141592653589793 * 3000.0 / 180.0; /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转 ...