Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
Dockerfile由一行行命令语句组成,并支持以#开头的注释行。
一般而言,Dockerfile分为四部分:基础镜像信息维护者信息镜像操作指令容器启动时执行的命令

一、Dockerfile指令说明:

下面是指令详情:

1.FROM

说明:指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。
格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>

任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创造多个镜像,可以使用多个FROM指令,每个镜像一个。

2.MAINTAINER

说明:指定维护者信息
格式:
  MAINTAINER <name>

该信息会写入生成镜像的Author属性域中。

3.RUN

说明:运行指定命令
格式:
  RUN <command>
  RUN ["executable","param1","param2"] (RUN ["可执行文本","参数1","参数2"]) 指令会被解析为Json数组,因此必须用双引号。
实例:
  RUN echo hello
  RUN ["/bin/bash","-c","echo hello"]

RUN <command> 默认会在shell终端中运行命令,即/bin/sh -c
RUN ["","",""] 使用exec执行,不会启动shell环境
每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。
当命令较长时,可以使用\来换行。

4.CMD

说明:指定启动容器时默认执行的命令
格式:
  CMD ["executable","param1","param2"] 使用exec执行,推荐使用的方式
  CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用
  CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数

每个Dockerfile只能有一条CMD命令,如果指定了多条命令,只有最后一条会被执行
如果用户启动容器时,手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令。

5.LABEL

说明:用来指定生成镜像的元数据标签信息
格式:
  LABEL <key>=<value> <key>=<value> <key>=<value>...
实例:
  LABEL version="1.0"
  LABEL description="This is test_label"

6.EXPOSE

说明:声明镜像内服务所监听的端口
格式:
  EXPOSE <port> [<port> <port> ...]
实例:
  EXPORT 22 80 443

注意,该指令只是起到声明作用,并不会自动完成端口映射。
如果你要完成映射还是要在创建的时候使用-p/-P参数。

7.ENV

说明:指定环境变量,在镜像的生成过程中会被后续RUN指令调用,在启动的容器中也会存在。
格式:
  ENV <key> <value>
  ENV <key>=<value>
实例:
  ENV PG_MAJOR 9.8.3

指令指定的环境变量在运行时可以被覆盖。

8.ADD

说明:复制指定的<src>路径下的内容到容器中的<dest>路径下
格式:
  ADD <src> <dest>
实例:
  ADD *.c /code/

其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,
还可以是一个tar文件(如果是tar文件会自动解压到<dest>路径下)。
<dest>可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径。

9.COPY

说明:复制本地主机的<src>(Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下,目标路径不存在时,会自动创建。
格式:
  COPY <src> <dest>

当使用本地目录为源目录时,推荐使用COPY

10.ENTRYPOINT

说明:指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所以传入值作为该命令的参数
格式:
  ENTRYPOINT ["executable","param1","param2"] exec调用执行
  ENTRYPOINT command param1 param2 shell中执行

此时,CMD指令指定值将作为根命令的参数。
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
在运行时,可以被 --entrypoint参数覆盖掉。

11.VOLUME

说明:创建一个数据卷挂载点。
格式:
VOLUME ["/data"]

可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等

12.USER

说明:指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。
格式:
  USER daemon

当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户。
RUN groupadd -r postgres && useradd -r -g postgress postgress
要零时获取管理员权限可以使用gosu或sudo

13.WORKDIR

说明:为后续的RUN、CMD和ENTRYPOINT指定配置的工作目录。
格式:
  WORKDIR /path/to/workdir

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
  WORKDIR /a
  WORKDIR b
  WORKDIR c
则最终路径为/a/b/c

14.ARG

说明:指定一些镜像内使用的参数(例如版本号信息),这些参数在执行docker build命令时才以--build-arg<varname>=<value>格式传入。
格式:
  ARG <name> [=<default value>]

15.ONBUILD

说明:配置当前所创建的镜像作为其它镜像的基础镜像时,所执行的创建操作指令。
格式:
  ONBUILD [INSTRUCTION]

例如,Dockerfile使用如下类容创建的镜像image-A

    [...]
ONBUILD ADD . /app/src
[...]

如果基于镜像image-A创建新的镜像,那么新的镜像就会自动执行上面的ONBUILD指定的内容,类似于继承的关系。

16.STOPSIGNAL

说明:指定所创建镜像启动的容器接收退出的信号值
实例:
  STOPSIGNAL signal

17.HEALTHCHECK

说明:配置所启动容器如何进行健康检查(如何判断健康与否)
格式:
  HEALTHCHECK [OPTIONS] CMD command 根据所执行命令返回值是否为0来判断
OPTION支持的选项:
  --interval=DURATION(默认为:30s) 过多久检查一次
  --timeout=DURAION(默认为:30s) 每次检查等待结果的超时
  --retries=N(默认为:3) 如果失败了,重试几次才最终确定失败

HEALTHCHECK NONE 禁止基础镜像中的健康检查

18.SHELL

说明:指定其它命令使用shell时的默认shell类型
实例:
  SHELL ["executable","parameters"]

默认值为 ["/bin/sh","-c"]

二、创建镜像

编写完Dockerfile之后,可以通过docker build来创建镜像。下面两种写法都是可行的

docker build -t centos_nginx:v1 /docker_demo
docker build -t centos_nginx:v1

如果没有指定Dockerfile的路径,那么就会默认读取当前目录下(包括子目录)的Dockerfile。
并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。
如果使用非内容路径下的Dockerfile,可以使用-f选项来指定其路径。
要指定生成镜像的标签信息,可以使用-t选项。
建议放置Dockerfile的目录为空目录。

三、简单应用

centos镜像+nginx.tar

切换目录:

cd /

创建工作路径:

mkdir docker_demo

创建Dockerfile文件:

touch Dockerfile

编辑文件:

# base image
FROM docker.io/centos # MAINTAINER
MAINTAINER @qq.com # put nginx-1.9..tar.gz into /usr/local/src and unpack nginx
#将当前目录下的包复制到/usr/local/src目录下
ADD nginx-1.9..tar.gz /usr/local/src # running required command
#执行命令,安装依赖包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx # change dir to /usr/local/src/nginx-1.9.
#指定工作路径
WORKDIR /usr/local/src/nginx-1.9. # execute command to compile nginx
#安装软件包
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install #声明被监控的端口
EXPOSE

创建镜像:

docker run -d -P centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"

/usr/local/nginx/sbin/nginx:nginx的启动命令

访问32774端口:

注意:
daemon on | off 默认on
是否以守护进程的方式运行nginx。守护进程是指脱离终端在后面运行的进程。

变化一:
添加一个环境变量

ENV PATH /usr/local/nginx/sbin:$PATH

这样在创建容器的时候,就可以省去前面的路径

docker run -d -P centos_nginx:v1 nginx -g "daemon off;"

变化二:
添加一个CMD(启动容器时默认执行的命令)

CMD /bin/sh -c 'nginx -g "daemon off;"'    

这样在创建容器的时候就不需要那么麻烦。

docker run -d -P centos_nginx:v1

变化三:
添加一个ENTRYPOINT指令,默认的入口命令,CMD命令将作为其参数

ENTRYPOINT ["nginx"]

CMD ["-g","daemon off;"]

docker——Dockerfile(一)的更多相关文章

  1. docker Dockerfile指令ADD和COPY的区别,添加目录方法

    docker Dockerfile指令ADD和COPY的区别,添加目录方法 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中.其格式是: ADD 源 ...

  2. Docker Dockerfile简述

    原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html 作用 Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL) ...

  3. Docker - Dockerfile - 常见命令简介

    概述 感觉是个 比较重要的东西 有个疑问 我是先讲 docker build 还是 先讲 Dockerfile 穿插讲 docker build 最基本的东西 原理 -t -f docker file ...

  4. [第十二篇]——Docker Dockerfile之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Dockerfile 什么是 Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 使用 Dockerfile 定制 ...

  5. Docker dockerfile创建Eclipse镜像初试

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

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

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

  7. Docker Dockerfile详解

    http://blog.csdn.net/wsscy2004/article/details/25878223 如何使用 Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等 ...

  8. Docker Dockerfile COPY vs ADD

    http://blog.163.com/digoal@126/blog/static/163877040201410341236664/   在Dockerfile中, 我们可以使用ADD和COPY拷 ...

  9. docker——Dockerfile创建镜像

    写在前面: 继续docker的学习,昨天用docker成功跑了tomcat,但是在centos中镜像跑的容器手动装jdk和tomcat,今天学习用Dockerfile创建镜像,并在上面搭建java环境 ...

  10. docker~Dockerfile优化程序的部署

    回到目录 一些理论 我们都知道docker这个容器工具可以帮助我们快速进行环境的部署,这对于运营人员来说,无疑是个福音,而这个工作大叔认为不应该是运营人员干的,而是由开发人员来做,因为只有你知道你干的 ...

随机推荐

  1. 【BZOJ】1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店(背包+高精度)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1655 背包就没什么好说的了,裸的完全背包.. 但是我一开始交开了ull都wa了T_T.. 精度太大. ...

  2. duilib Webkit内核dui化浏览器控件

    參考http://blog.csdn.net/zhuhongshu/article/details/38540711 改进: 1.跟其它duilib控件一样,不包括窗体 2.将onURLChanged ...

  3. MySQL--执行mysql脚本及其脚本编写

    http://www.cnblogs.com/kex1n/archive/2010/03/26/2286504.html

  4. 使用 composer 下载更新卸载类库

    前言:要下载什么包,可以去 https://packagist.org/ 找一下包名及其版本信息 1)配置composer.json文件,并使用composer install 命令下载类包,下面以下 ...

  5. Android 防破解技术简介

    Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改 ...

  6. 模拟http请求 带 chunked解析办法二

    以PHP代码为例 //这个是解析chuned块 get_chunk_data($fsock) { $data = ''; while(true) { $len = hexdec(fgets($fsoc ...

  7. iPhone 6 Screens Demystified

    http://www.paintcodeapp.com/news/iphone-6-screens-demystified

  8. MyBatis笔记——EhCache二级缓存

    介绍 ehcache是一个分布式缓存框架. 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式)  不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发.所以要使用分布式缓 ...

  9. Action请求流程分析

    Strut2流程分析-----从请求到Action方法() 首先请求会调用strutsPrepareAndExcuteFliter----(这个就是我们在web.xml文件中所配置的那个拦截器吧,所有 ...

  10. java nio探险

    区别于io: nio是基于通道和缓冲区的,io是基于字节流和字符流的,(千万别被这些破名词唬住).以读取文件为例,文件就是自来水厂,通道就是自来水管道,缓冲区就是你家的缸(或者盛水的xx容器,例如你的 ...