FROM:指定ase镜像

MAINTAINER:设置镜像作者,可以是任意字符

COPY:将文件从build  context复制到镜像。支持两种形式:1.COPY src dest 2.COPY [“src”,“dest”]

注意:src只能指定build context中的文件或目录

ADD:与COPY类似,从build context复制文件到镜像。不同的是。如果src是归档文件(tar,zip,tgz,xz等),文件会自动解压到dest。

ENV:设置环境变量,环境变量可被后面的指令使用。

例如:ENV MY_VERSION 1.3

RUN yum install -y mypackage=$ENV MY_VERSION 1.3

EXPOSE:制定容器中的进程会监听牧歌端口,Docker可以将该端口暴露出来

VOLUME:将文件或者是目录声明为volume

WORKDIR:为后面的RUN CMD ENTRYPOINT ADD   COPY   指令设置镜像中的当前目录

RUN: 在容器中运行相应的指令

CMD:容器启动时运行的相应的命令,dockerfile中可以有多个cmd指令,但只有最后一个生效。CMD可以被docker run 之后的参数代替

ENTRYPOINT:设置容器启动的时候运行的命令。Dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个生效,CMD或docker run之后的参数都会被当作参数传递给ENTRYPOINT

下面做一个实验

编辑dockerfile

创建镜像进行验证:

创建完成

进行验证:

证明,运行容器时默认会进入WORKDIR指定的目录下,RUN和COPY也会在WORKDIR下执行,输出ENV的变量hello

 

注:build context值得是Dockerfile所在的目录以及子目录

分析RUN CMD ENTRYPOINTDE 区别

1.RUN:执行命令,创建新的镜像层,通常执行安装的命令

2.CMD:容器启动后默认执行的命令,可以被docker run后面的参数代替

3.ENTRYPOINT:容器启动时执行的命令,CMD的参数可以执行给ENTRYPOINT

RUN  CMD  ENTRYPOINT执行的时候会有两种形式:SHELL 和 EXEC

SHELL格式:<说明><命令>

例如:RUN yum install -y tree

          CMD echo “hello”

          ENTRYPOINT echo “likun”

SHELL 会调用/bin/sh -c <命令>

例如:ENV  name  likun

         ENTRYPOINT echo “hello,$name”

执行 docker run <镜像>

会输出 hello,likun   这里的环境变量被likun代替

EXEC格式:<说明>["executable","param1","param2",...]

例如:RUN ["yum","install","tree"]

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

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

当命令执行的时候,会直接调用<命令>,不会被shell解析

例如:ENV name likun

           ENTRYPOINT [“/bin/echo”,“hello,$name”]

实验充分证明:exec格式不会解析shell,以上的实验直接将$HELLO输出,而不是hi,hello

如果希望使用环境变量,可以做一下修改:

ENV HELLO "hello"

ENTRYPOINT ["/bin/sh",-c","echo hi,$HELLO"]

运行容器时输出  hi,hello

下面做一下实验:

修改Dockerfile

创建新的镜像:

创建成功

运行镜像:

直接输出hi,hello

注:EXEC格式可读性更强,更容易被理解。CMD 和ENTRYPOINT 推荐使用EXEC格式,RUN则两种格式都可以

以上说明了两中格式,下面研究一下他们的区别,什么时候用什么格式

RUN

RUN有两种格式:

1.Shell格式:RUN

2.EXEC格式:RUN ["executable",“param1”,“param2”]

使用RUN安装多个安装包的例子

RUN yum insatll -y tree httpd vim

注意:1.yum install  update和yum install -y最好放在一个指令中执行,如:RUN yum install update && yum install -y tree,这样能够保证每次安装的都是新的安装包。如果他们分开使用的话会分别为yum install update 和yum install -y分别创建一个镜像层,下次创建新的镜像的时候会直接使用cache这个镜像,不能保证安装的是最新的安装包。

2.也可以使用docker build -t 镜像名字 --no-cache也可以保证install是最新的。

3.--no-cache适用于任何场景,update&install仅适用于安装软件

CMD

容器启动且docker run 没有指定其他命令时运行的命令

1.如果docker run指定了新的命令,CMD指定的默认命令将被忽略

2.如果Dockerfile中有多个CMD,,只有最后一个CMD生效

CMD有三种格式:

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

2.CMD[“param1”,“param2”]为ENTRYPOINT提供额外的参数,此时ENTRYPOINT必须使用Exec格式,这种格式要与ENTRYPOINT配合使用,为ENTRYPOINT提供默认参数

3.SHELL格式:CMD command param1 param2

param是参数的意思

进行实验

同样是修改Dockerfile

制作镜像

查看镜像

运行镜像,输出hi likun

在docker run it  centos-cmd:cmd加命令,CMD会被忽略,下面进行实验

CMD直接被忽略,输出hello docker

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

ENTRYPOINT和CMD很像,都可以指定要执行的命令及参数。但是ENTRYPOINT不会被忽略,一定会被执行,即使docker run后面指定了其他命令。

ENTRYPOINT有两种格式:

1.Exec格式:ENTRYPOINT [“executable”,“param1”,“param2”],这个是ENTRYPOINT的推荐格式

2.SHELL格式:ENTRYPOINT command param1 param2

注:在为ENTRYPOINT选择格式时一定要注意,因为两种格式差别很大。

再次强调:ENTRYPOINT的exec格式中的参数始终会被使用,CMD的参数会被docker run后面的参数替换;shell格式会忽略任何CMD或docker run提供的参数

总结

1.使用RUN 指令安装应用和软件包,构建镜像

2.使用ENTRYPOINT运行应用程序或服务,比如运行一个MySQL,应该优先使用EXEC格式的ENTRYPOINT指令

3.CMD可为ENTRYPOINT提供额外的默认参数,同时可以利用docker run后面的参数进行更改。

centos7下安装docker(dockerfile常用的指令)的更多相关文章

  1. docker(一) Centos7下安装docker

    docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...

  2. centos7下安装docker与镜像加速

    1.背景 centos7下安装docker 2.安装 第一步:检查是否为centos7版本 第二步:依赖环境安装 执行如下两个命令: yum -y install gcc yum -y install ...

  3. CentOS7下安装docker(Docker系列1)

    CentOS7下安装docker 系统要求 为了安装docker,需要准备 64-bit的CentOS 7 删除非官方的Docker包 yum的仓库中有一个很旧的Docker包, 现在Docker官方 ...

  4. centos7 下安装docker报错:You could try using...

    搞了台VPS,想要装docker,发现死活装不上,各种报错.之前系统是centos6,发现官方现在已经不支持centos6了,遂升级到centos7,然后还是出现下面这个错误. Error: Pack ...

  5. Centos7下安装Docker(详细的新手装逼教程)

    早就听说过Docker,一直不清楚是个啥,今天捣鼓了一下,这里做个记录. --------------------------------------------------------------- ...

  6. Centos7下安装Docker[z]

    [z]https://www.cnblogs.com/qgc1995/p/9553572.html https://yq.aliyun.com/articles/691610?spm=a2c4e.11 ...

  7. Linux(centos7)下安装Docker

    近期公司开始推Docker技术.这个系列的文章都是基于CentOS7系统下进行讲解的. Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器 ...

  8. centos7下安装docker(21docker swarm集群创建)

    创建swarm集群: 实验环境:盗图 swarm-manager是manager node,swarm-worker1和swarm-worker2是worker node. 所有节点的docker版本 ...

  9. centos7下安装docker(19容器架构)

    What,Why,How What:什么是容器? 说起容器大家想到的是什么?      集装箱(container),虚拟机,docker,k8s 1. 没毛病,因为容器与集装箱的英文都可以翻译成co ...

  10. centos7下安装docker(14安装docker machine)

    之前我们做的实验都是在一个host上面的,其实在真正的环境中有多个host,容器在这些host上面启动,运行,停止和销毁,相关容器会通过网络相互通信,无论他们是否运行在相同的host上面. 对于这种歌 ...

随机推荐

  1. python内置方法大全

    数学运算 abs:求数值的绝对值 >>> abs(-2) 2 divmod:返回两个数值的商和余数 >>> divmod(5,2) (2, 1) >> ...

  2. 如何机智判断页面是刷新还是关闭,背景:vue项目,需求:关闭页面,下次直接跳到登陆页

    最近项目有这么个需求:要在关闭当前系统的窗口的时候,退出登录, 因为如果不退出登录可能存在安全风险,其实我想说,电脑没事别借给别人活着离开工位记得一定要锁屏,其实我们设置了cookie失效时间的,过了 ...

  3. openLayers 3知识回顾

    openlayers 知识 前段时间帮助同事重构一个地图类的项目,然后就学习了openLayer3这个框架,但是官网上没有中文版,也没有详细的例子解释,我只能遇到看不懂的就翻译成中文来用,为了方便以后 ...

  4. 《HelloGitHub》第 30 期

    公告 截止到第 30 期,贡献者 终于到达 3 位数-- 100 位.谢谢各位的支持和贡献,想要加入的小伙伴,快来推荐项目吧! <HelloGitHub>第 30 期 兴趣是最好的老师,H ...

  5. 使用EOLINKER做接口测试最佳路径(上)

    本文内容: 测试脚本管理:讲述如何在 EOLINKER 上设计测试项目目录结构. 编写测试脚本:讲述如何在 EOLINKER 上编写接口测试脚本. 测试脚本执行及报告:讲述如何在 EOLINKER 上 ...

  6. MySQL优化小建议

    背景 "那啥,你过来一下!" "怎么了?我代码都单元测试了的,没出问题啊!"我一脸懵逼跑到运维大佬旁边. "你看看!你看看!多少条报警,赶快优化一下! ...

  7. Git认证方式https和ssh的原理及比较

    常见的代码托管平台GitHub.GitLab和BitBucket等,基本都会使用Git作为版本控制工具.平台一般都提供两种认证方式https和ssh.了解该过程能够更加自由的配置和使用,本文就来简单聊 ...

  8. C# 实体类转json数据过滤掉字段为null的字段

    C# 实体类转json数据过滤掉字段为null的字段 语法如下: var jsonSetting = new JsonSerializerSettings {NullValueHandling = N ...

  9. Redis分布式队列和缓存更新

    原文链接:https://www.cnblogs.com/hua66/p/9600085.html 在使用Redis中,我们可能会遇到以下场景: 例如: 某用户向服务器中发送一个请求,服务器将用户请求 ...

  10. Java开发笔记(八十一)如何使用系统自带的注解

    之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...