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. 企业级Nginx服务基础到架构优化详解

    1.隐藏nginx header版本号 2.更改源码隐藏软件名称 3.更改nginx默认用户及用户组 4.配置nginx worker进程个数 5.根据CPU核数进行nginx进程优化 6.nginx ...

  2. redhat 网络配置

    1. 查看网络 ifconfig 网卡名字(eth0.wlan0) ifconfig -a //查看所有网卡配置 2. 网卡打开\关闭 ifconfig eth0 down ifconfig eth0 ...

  3. jquery的push()

    JavaScript push() 方法 JavaScript Array 对象 定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法 arrayObject.pus ...

  4. 通过pyenv进行多版本python管理

    1.安装pyenv brew install pyenv 2.配置.zshrc文件 export PYENV_ROOT=/usr/local/var/pyenv if which pyenv > ...

  5. 11 Memcached 缓存雪崩现象

    一:Memcached 缓存雪崩现象(1)造成原因:一般是由某个节点失效,导致其他的节点的缓存命中率下降,缓存中缺失的数据查询,短时间内造成的数据库服务器奔溃.重启DB,短期内又被压垮,但缓存的数据增 ...

  6. VC++ 读写注冊表,注冊文件图标关联

    #include <string> #include <iostream> #include <Windows.h> #include <shlobj.h&g ...

  7. PopupWindowFromBottom 从底部弹出popupwindow

    自定义PopupWindowFromBottom public class PopupWindowFromBottom extends PopupWindow { public PopupWindow ...

  8. 研究怎么运用xcode处理常见的调试问题

    本文转载至 http://blog.csdn.net/zhuzhihai1988/article/details/7749022 所谓磨刀不误砍柴工,这里菜鸟我在研究怎么运用xcode处理常见的调试问 ...

  9. vue实现简易留言板

    首先引入vue.js <script src="vue.js"></script> 布局 <div id="div"> &l ...

  10. 九度OJ 1347:孤岛连通工程 (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1522 解决:314 题目描述: 现在有孤岛n个,孤岛从1开始标序一直到n,有道路m条(道路是双向的,如果有多条道路连通岛屿i,j则选择最短 ...