Dockerfile是一个文本格式的配置文件,用户可以使用Docker来快速创建自定义的镜像

基本结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行

一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和启动时执行指令

FROM ubuntu

MAINTAINER docker_user docker_user@email.com

RUN echo “deb http://archive.ubuntu.com/ubuntu/ raring main universe” >> /etc/apt/sources.list
RUN apt-get update && apt-get install –y nginx
RUN echo “\ndaemon off;” >> /ect/nginx/nginx.conf CMD /usr/sbin/nginx

其中,一开始必须指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。最后是CMD指令,用来指定运行容器时的操作指令

指令说明

指令的一般格式为 INSTRUCTION arguments,指令包括FROM、MAINTAINER、RUN等,如下

FROM : 
指定所创建镜像的基础镜像
MAINTAINER :
指定维护者信息
RUN :
运行命令
CMD :
指定启动容器时默认执行的命令
LABEL :
指定生成镜像的元数据标签信息
EXPOSE :
声明镜像内服务所监听的端口
ENV :
指定环境变量
ADD :
复制指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件,会自动解压到<dest>路径下
COPY :
复制本地主机的<src>路径下的内容到镜像中的<dest>路径下,一般情况下推荐使用COPY,而不是ADD
ENTRYPOINT :
指定镜像的默认入口
VOLUME :
创建数据卷挂载点
USER :
指定运行容器时用户名或UID
WORKDIR :
配置工作目录
ARG :
指定镜像内使用的参数(例如版本号信息等)
ONBUILD :
配置当缩创建的镜像作为其他镜像的基础竟像是,所执行的创建操作指令
STOPSIGNAL :
容器退出的信号值
HEALTHCHECK :
如何进行健康检查
SHELL :
指定使用shell时的默认shell类型

1. FROM
指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。
格式为FROM<image>,或FROM<image>:<tag>,或FROM<image>@<digest>。
任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)
2. MAINTAINER
指定维护者信息,格式为MAINTAINER<name>。例如
MAINTAINER image_creator@docker.com
该信息会写入生成镜像的Author属性域中
3. RUN
运行指定命令
格式为RUN<command>或RUN [“executable”, “param1”, “param2”].注意,后一个指令会被解析为json数组,因此必须用双引号
前者默认将在shell终端中运行命令,即/bin/sh –c;后者则使用exec执行,不会启动shell环境
指定使用其他终端类型可以通过第二种方式实现,例如RUN [“/bin/bash”, “-c”,”echo hello”]
每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行

RUN apt-get updata \
&& apt-get install –y libsnappy-dev zliblg-dev libbz2-dev \
&& rm –rf /var/cache/apt

4. CMD
CMD指令用来启动容器时默认执行的命令。它支持三种格式:
(1)CMD [“executable”,”param1”,”param2”]使用exec执行,是推荐使用的方式
(2)CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用
(3)CMD [“param1”,”param2”]提供给ENTRYPOINT的默认参数
每个Dockerfile只能有一条CMD命令。如果指定了多条命令,之后最后一条命令会被执行
如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令
5. LABEL
LABEL指令用来指定生成镜像的元数据标签信息
格式为 LABEL <key>=<value> <key>=<value> ….
例如

LABEL version=“1.0”
LABEL description=”This text illustrates \ that label-values can span multiple lines.”

6. EXPOSE
声明镜像内服务所监听的端口
格式为EXPOSE <port> [<port>...]
例如

EXPOSE 22 80 8443

注意,该指令只是起到声明作用,并不会自动完成端口映射
在启动容器时需要使用-P,docker主机会自动分配一个宿主机的临时端口转发到指定的端口;使用-p,则可以具体指定哪个宿主机的本地端口会映射过来
7. ENV
指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在
格式为ENV<key><value>或ENV<key>=<value>...
例如

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl –SL http://example.com/postgres-$PG_VERSION.tar.xz | tar –xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

指令指定的环境变量在运行时可以被覆盖掉,如
docker run –env <key>=<value> built_image
8. ADD
该命令将复制指定的<src>路径下的内容到容器中的<dest>路径下
格式为ADD<src> <dest>
其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(如果为tar文件,会自动解压到<dest>路径下)。<dest>可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径
路径支持正则格式,例如
ADD *.c /code/
9. COPY
格式为COPY <src> <dest>
复制本地主机的<src>(为Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下。目标路径不存在时,会自动创建。
路径同样支持正则格式
当使用本地目录为源目录时,推荐使用copy
10. ENTRYPOINT
指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数
支持两种格式
ENTRYPOINT [“executable”, “param1”, “param2”](exec调用执行);
ENTRYPOINT command param1 param2(shell中执行)
此时,CMD指令指定值将作为跟命令的参数
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效
在运行时,可以被--entrypoint参数覆盖掉,如docker run --entrypoint
11. VOLUME
创建一个数据卷挂载点
格式为VOLUME[“/data”]
可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等
12. USER
指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。
格式为USER dameon.
当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户。例如
RUN groupadd –r postgres && useradd –r –g postgres postgres
要临时获取管理员权限可以使用gosu 或 sudo
13. WORKDIR
为后续的RUN、CMD和ENTRYPOINT指令配置工作目录
格式为 WORKDIR /path/to/workdir
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

则最终路径为/a/b/c
14. ARG
指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以--build-arg<varname>=<value>格式传入
格式为ARG<name>[=<default value>]
则可以用docker build --build-arg<name>=<value>,来指定参数值
15. ONBUILD
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
格式为ONBUILD [INSTRUCTION]
例如,dockerfile使用如下的内容创建了镜像image-A

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像,会自动执行ONBUILD指令的内容,等价于在后面添加了两条指令

FROM image-A
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild
16. STOPSIGNAL
指定所创建镜像启动的容器接收退出的信号值,例如
STOPSIGNAL signal
17. HEALTHCHECK
配置所启动容器如何进行健康检查(如何判断靖康与否),自docker1.12开始支持
格式有两种
HEALTHCHECK [OPTIONS] CMD command:根据所执行命令返回值是否为0来判断
HEALTHCHECK NONE:禁止基础镜像中的健康检查
OPTION支持
--interval=DURATION(默认为30s):过多久检查一次
--timeout=DURATION(默认为30s):每次检查结果的等待超时
--retries=N(默认为3):如果失败了,重试几次才最终确定失败
18. SHELL
指定其他命令使用shell时的默认shell类型
SHELL [“executable”,”parameters”]
默认值为[“/bin/sh”,”-c”].
注意:对于Windows系统,建议在Dockerfile开头添加#escape=`来指定转义信息

创建镜像

编写完成Dockerfile之后,可以通过docker build命令来创建镜像
基本的格式为docker build[选项]内容路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。因此除非生成镜像需要,否则一般建议放置Dockerfile的目录为空目录。有两点经验
如果使用非内容路径下的dockerfile,可以通过-f选项来指定其路径
要指定生成镜像的标签信息,可以使用-t选项
例如,指定Dockerfile所在路径为/tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image,可以使用以下命令
docker build -t build_repo/first_image /tmp/docker_builder/

示例

基于centos安装nginx

FengZhendeMacBook-Pro:docker_demo FengZhen$ ll
total 1984
-rw-r--r-- 1 FengZhen staff 919 6 18 18:26 Dockerfile
-rw-r--r--@ 1 FengZhen staff 981687 6 18 18:29 nginx-1.12.2.tar.gz

Dockerfile内容如下

# base image
FROM centos #MAINTAINER
MAINTAINER FengZhen@163.com ADD nginx-1.12.2.tar.gz /usr/local/src 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-devel
RUN useradd -M -s /sbin/nologin nginx WORKDIR /usr/local/src/nginx-1.12.2 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 80

指定docker build开始构建

FengZhendeMacBook-Pro:docker FengZhen$ docker build -t centos_nginx:v1 docker_demo/

查看本地镜像

FengZhendeMacBook-Pro:docker FengZhen$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx v1 9f9e5add9182 About a minute ago 519MB

发现该镜像已存在
使用该镜像启动一个container并开启nginx服务

FengZhendeMacBook-Pro:docker FengZhen$ docker run -d centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"
0896b5bc727871bbdd4287a9af149c1bcdc3efbc0e63a6079bd8c919c6e72ea2

docker ps看下该容器是否在运行

FengZhendeMacBook-Pro:docker FengZhen$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0896b5bc7278 centos_nginx:v1 "/usr/local/nginx/sb…" 8 seconds ago Up 12 seconds 80/tcp festive_visvesvaraya

虽然nginx服务开启了,但是port并没有映射到本机host,所以这个container并不能进行访问,重新启动一个并指定映射端口

FengZhendeMacBook-Pro:docker FengZhen$ docker run -d -P centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"
a8a29716b2590934bae0100a5ae6b9694ae7d508a846f05d209b2b87169b6533
FengZhendeMacBook-Pro:docker FengZhen$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8a29716b259 centos_nginx:v1 "/usr/local/nginx/sb…" 6 seconds ago Up 10 seconds 0.0.0.0:32784->80/tcp compassionate_darwin

可以看到容器的80端口映射到宿主机的32784端口,此时通过32784端口访问

成功。

Docker-使用Dockerfile创建镜像的更多相关文章

  1. docker——Dockerfile创建镜像

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

  2. Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...

  3. docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。

    一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...

  4. Dockerfile创建镜像

    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像. Dockerfile由一行行命令语句组成,并且支持易#开头的注释行. 一般而言Dockerfil ...

  5. docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)

    本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...

  6. [转]Docker基础-使用Dockerfile创建镜像

    本文转自:https://www.cnblogs.com/jie-fang/p/7927643.html 1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # T ...

  7. Docker基础-使用Dockerfile创建镜像

    1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - ED ...

  8. Docker学习笔记之通过 Dockerfile 创建镜像

    0x00 概述 由于 Docker 镜像的结构优势,使它的占用空间远小于普通的虚拟机镜像,而这就大幅减少了 Docker 镜像在网络或者其他介质中转移所花费的时间,进而提高了我们进行迁移部署的效率.不 ...

  9. docker Dockerfile 创建镜像

    Docker 组件 1. docker client : docker的客户端 2. docker server : docker daemon的主要组成部分,接受用户通过docker client发 ...

  10. Docker实战(六)之使用Dockerfile创建镜像

    Dockervile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义镜像. 1.基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行. 一般而言,Do ...

随机推荐

  1. mysql中的for update

    Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...

  2. docker教程之从一头雾水到不一头雾水(3)

    本文主要是介绍Docker容器的相关内容 容器创建 我们已经知道,镜像是只读的,而基于镜像创建出来的容器是可读写的,所以,一般我们实际中,会经常使用对应镜像创建容器并且使用这些容器.同样,如果我们想要 ...

  3. Python内置函数之super()

    super(type[,object-or-type]) super()的作用在于类继承方面. 他可以实现不更改类内部代码,但是改变类的父类. 例子: 一般我们继承类的方式: >>> ...

  4. jeecms搜索结果排序-二次开发

    jeecms搜索用的是apache Lucene,要实现此功能得先去学习它. 直接上代码 package com.jeecms.cms.lucene; import java.io.IOExcepti ...

  5. 【cocos2dx 3.3】口袋空战5 总结与公布

    打包好的APK:点击下载

  6. Linux中的提示符

    root的提示符:# 一般用户的提示符:$

  7. swift中的?和!理解

    本文转载至 http://www.cnblogs.com/dugulong/p/3770367.html 首先贴cocoachina上某位大大的帖子:     Swift语言使用var定义变量,但和别 ...

  8. 字符串HASH模板

    //注意MAXN是最大不同的HASH个数,一般HASHN是MAXN的两倍左右,MAXLEN表示字符串的最大长度 //K表示正确率,越大正确率越高,当时也越费空间,费时间. //使用前注意初始化hash ...

  9. WCF基础之大型数据和流

    在WCF的实际应用中,有可能存在10M,100M甚至G级别的传输,这个时候我们就不得不考虑编码和传输模式,当然得选择相应的绑定(binding) 如上图所示,我可以直接使用系统提供的相应绑定,然后设置 ...

  10. Pipeline outbound

    netty源码死磕8 Pipeline outbound 出站流程揭秘 1. Pipeline outbound流程 1.1. 出站的定义 简单回顾一下. 出站(outbound) 操作,通常是处于上 ...