组成部分

  • 基础镜像信息       FROM
  • 维护者信息    MAINTAINER、LABEL
  • 镜像操作指令       RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER等
  • 容器启动时执行指令    CMD、ENTRYPOINT

1、MAINTAINER

(docker1.7以后的版本已被LABEL替代,但仍兼容此字段)

格式:

MAINTAINER <name>

2、LABEL

用键值对的方式提供比MAINTAINER更多的详细信息

LABEL maintainer="WangChuang 123@qq.com" app="httpd

3、copy和add

COPY: 拷贝数据,不会自动解压数据

从宿主机的当前工作目录中将文件copy到目标镜像文件的系统中

语法如下:

1. COPY <src>... <dest>

2. COPY ["<src1>""<src2>""<dest>"]

<src>: 要复制的源文件或目录,支持通配符

<dest>:目标路径,建议使用绝对路径

文件复制准则

<src>必须是构建目录中的文件

如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制

如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以"/"结尾

如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径

ADD:

功能和copy类似,但ADD支持使用tar文件和url网络路径

ADD http://nginx.org/download/nginx-1.15.12.tar.gz /usr/local/src/   #如果src是网络路径,就不会解压

ADD nginx-1.15.12.tar.gz /usr/local/src/  #会解压

4、WORKDIR

可以指定多次,

WORKDIR /usr/local/src/

ADD nginx-1.15.12.tar.gz ./

5、VOLUME存储卷

例:

VOLUME /data/mysql/

当容器创建好后,可以查看宿主机对应的存储目录

docker inspect 6c |grep "/data"

6、EXPOSE

语法

EXPOSE 11211/udp 11211/tcp

关于端口暴露:容器端口暴露一般有两种方式:随机暴露 、指定端口暴露

随机暴露端口-P(大写)

随机暴露,Dockerfile中需有EXPOSE关键字, 定义待暴露的端口,但容器启动时并不会直接暴露到宿主机,如果需要暴露可以加上-P

指定端口-p(小写)

指定端口就和EXPOSE没有关系了。可以用-p 80:80,直接指定宿主机和容器间对应的端口

结论:可以看到管哪种方式容,器默认启动时端口是不会主动暴露到宿主机,并且容器中必须有真实存在的端口,加上-p或者-P才生效

7、ENV

ENV NAME wang  #设置单个变量

ENV NAME=wang  PASSWD=123   #一次定义多个变量

引用

$NAME或者${NAME}

注意:

Dockerfile中的环境变量可以在两个阶段引用使用

生成镜像阶段,

运行容器阶段,启动容器加上-e还可以修改变量值

7、USER

用于指定运行image时,或运行Dockerfilez

默认情况下,container的运行身份为root用户

语法:

USER u01  #确保镜像内有这个用户

8、HEALTHCHECK

默认情况下docker是判断容器主进程运行与否,来判断容器是否健康

HEALTHCHECK:指定命令判断主进程是否真正正常提供服务,判断容器是否健康

语法:

HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost:8080 || exit 1

每隔5分钟检测一次,超时时间为3秒, CMD指定检测命令,检测成功返回0,失败返回1

参数:

CMD  #指定检测命令

--interval  #持续监测,默认每隔30秒

--timeout  #超时时间,默认30s

--start-period #有些容器比如tomcat,刚启动的时候主进程启动的慢,如果立即检测肯定是失败的,所以等容器启动多少时间以后再去检测 (默认0s,直接检测)

--retries=N    #失败多少次,判断容器为故障 (默认3)

响应值:

0:表示检测成功

1:检测失败

2:预留的值,没意义

重点:RUN、CMD 和 ENTRYPOINT

容器内没有后台服务的概念,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。

1、RUN

RUN 指令通常用于安装应用和软件包。

RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。

RUN 有两种格式:

Shell 格式:RUN

Exec 格式:RUN ["executable", "param1", "param2"]

2、CMD

CMD 指令允许用户指定容器的默认执行的命令。此命令会在容器启动且 docker run 没有指定其他命令时运行。

l  如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。

l  如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。

CMD 有三种格式:

Exec 格式:CMD ["executable","param1","param2"]  #这是 CMD 的推荐格式。

Shell 格式:CMD command param1 param2

Exec 格式,提供参数:CMD ["param1","param2"]  #为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式,shell格式无效。

3、ENTRYPOINT

ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。

ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。

不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。

ENTRYPOINT 有两种格式:

Exec格式:ENTRYPOINT ["executable", "param1", "param2"] #这是 ENTRYPOINT 的推荐格式。

Shell 格式:ENTRYPOINT command param1 param2

在为 ENTRYPOINT 选择格式时必须小心,因为这两种格式的效果差别很大。

#@ 就是代表参数,参数可调用可不调用

第一种格式:PID不为1,自动为shell的子进程

<command>通常是一个shell命令,且以"/bin/sh -c"来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号。因此当docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号

第二种格式:PID为1,不会自动成为shell的子进程

语法中的参数是一个列表,其中<executable>为要运行的命令,后面的为参数或选项;然而此种格式不会以"/bin/sh -c"来运行,因此常见的shell操作,如变量替换以及通配符(?/*等)替换将不会进行;不过如果要运行的命令依赖此shell特性的话,可以将其替换为类似下面的格式

RUN ["/bin/bash","-c","<executable>","<param1>"]

关于Shell 和 Exec 格式

Shell 格式

<instruction> <command>

例如:

RUN apt-get install python3

CMD echo "Hello world"

ENTRYPOINT echo "Hello world"

当指令执行时,shell 格式底层会调用 /bin/sh -c <command>。

例如下面的 Dockerfile 片段:

ENV name Cloud Man

ENTRYPOINT echo "Hello, $name"

执行 docker run
<image> 将输出:

Hello, Cloud Man

注意环境变量 name 已经被值 Cloud Man 替换。

下面来看 Exec 格式。

Exec 格式

<instruction> ["executable",
"param1", "param2", ...]

例如:

RUN ["apt-get", "install",
"python3"]

CMD ["/bin/echo", "Hello world"]

ENTRYPOINT ["/bin/echo", "Hello world"]

当指令执行时,会直接调用
<command>,不会被 shell 解析。
例如下面的 Dockerfile 片段:

ENV name Cloud Man

ENTRYPOINT ["/bin/echo", "Hello,
$name"]

运行容器将输出:

Hello, $name

注意环境变量“name”没有被替换。
如果希望使用环境变量,照如下修改

ENV name Cloud Man

ENTRYPOINT ["/bin/sh", "-c", "echo
Hello, $name"]

运行容器将输出:

Hello, Cloud Man

CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。

使用Dockerfile制作镜像的更多相关文章

  1. Docker 0x05: Dockerfile制作镜像

    目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...

  2. docker-使用Dockerfile制作镜像

    最近项目中有使用docker,组内做了关于docker的培训,然后自己跟着研究了一下,大概了解如何使用.我是基于tomcat镜像制作(不需要安装jdk,配置环境变量),基于centos镜像制作需要安装 ...

  3. 通过dockerfile制作镜像

    Dockerfile是一个用于构建Docker镜像的文本文件,其中包含了创建Docker镜像的全部指令.就是将我们安装环境的每个步骤使用指令的形式存放在一个文件中,最后生成一个需要的环境. Docke ...

  4. docker(9)Dockerfile制作镜像

    前言 如果我们已经安装了一个python3的环境,如果另一台机器也需要安装同样的环境又要敲一遍,很麻烦,这里可以配置Dockerfile文件,让其自动安装,类似shell脚本 Dockerfile编写 ...

  5. Docker部署运行springboot项目,并使用Dockerfile制作镜像

    前言: 本来是要搭建一个自动化部署分布式项目的服务器平台的,使用jenkins+k8s+ELK+springboot把一个简单的springboot项目给搞起来,由于工程太大,先分开把每个技术组件单独 ...

  6. Dockerfile制作镜像

    Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...

  7. dockerfile 制作镜像

    # Set the base image to UbuntuFROM ubuntu # File Author chenghanMAINTAINER chenghan ################ ...

  8. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  9. Docker build Dockerfile 构建镜像 - 二

    Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...

随机推荐

  1. mapper映射文件配置之select、resultMap(转载)

    原文地址:http://www.cnblogs.com/dongying/p/4073259.html 先看select的配置吧: <select         <!-- 1. id ( ...

  2. 分布式配置中心(Spring Cloud Config) (问题解答)

    转载:https://blog.csdn.net/forezp/article/details/70037291 1.foo是博主随意写的,实际是没有对应的文件.如果真有文件,返回的json在会有so ...

  3. node.js 实现 AES CTR 加解密

    node.js 实现 AES CTR 加解密 node aesctr 前言 由于最近我们在做一款安全的文件分享 App, 所有文件均需要使用 aes ctr 来进行加密,aes key 还有一整套完整 ...

  4. webpack 热更新

    1.安装webpack npm install webpack -g  //全局安装 npm install webpack --save-dev  //开发环境 2.使用webpack 创建一个we ...

  5. 【10】Python urllib、编码解码、requests、多线程、多进程、unittest初探、__file__、jsonpath

    1 urllib urllib是一个标准模块,直接import就可以使用 1.1get请求 from urllib.request import urlopen url='http://www.nnz ...

  6. httpClient和RestTemplate的使用

    1.httpClient的使用 <dependency> <groupId>org.apache.httpcomponents</groupId> <arti ...

  7. Spoj4060 game with probability Problem

    题目链接:Click here Solution: 刚开始还以为博弈论加概率,然而并不是... 设两个状态:\(f(i)\)表示当前剩下\(i\)个石头时,先手的获胜概率,\(g(i)\)为后手的获胜 ...

  8. Python语言中enumerate()及zip()函数的使用例子

    在Python编程语言中,enumerate()及zip()是两个常用的内置函数,这两个函数功能类似,但又有所区别,下面通过两个例子分别进行说明. enumerate()函数 该函数在字面上是枚举.列 ...

  9. 安装浏览器的vue插件

    安装浏览器的vue插件步骤: 1.在浏览器中打开 https://github.com/vuejs/vue-devtools Clone or download  vue-devtools. 2.解压 ...

  10. 一、基础篇--1.1Java基础-面向对象的特征

    面向对象的特征 封装.继承和多态 https://blog.csdn.net/jianyuerensheng/article/details/51602015 封装: 定义:封装就是将数据或函数等集合 ...