2.3.1.1. 前言
在实际使用中镜像构建都是通过 Dockerfile 进行构建。Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它
们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile 从 FROM
命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器
的镜像。
Dockerfile 文件主要定义容器内的环境中发生的事情。比如对网络接口和磁盘驱动器等资源的访问是在此环境中都是虚拟化的,该环境与系统的其他部分是隔离的, 因此需要将端口映射到外部世界,并具体说明希望将哪些文件 复制到 该环境。
注意: Dockerfile 是一个文件!
下面就来看下 Dockerfile 中语法的使用:
2.3.1.2. 简单示例
在看具体语法与命令之前先看一个简单的栗子,该栗子 Dockerfile 内容如下所示:
# This Dockerfile uses the ubuntu as base image
# Version v1.0.0 - EDITION V1
# Author: MinGRn
# Command format: Instruction [arguments / command] ..
# Base image to use, This must be set as first line
FROM ubuntu
# Maintainer: MinGRn <[email protected]>
Maintainer: MinGRn [email protected]
# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu raring main universe" >> /etc/apt/source.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /use/sbin/njinx
2.3.1.3. 指令集
从上面的栗子中的 FROM ubuntu
、RUN echo ..
等语句不难看出,Dockerfile 指令一般格式为 INSTRUCTION arguments
,而这些指令包括
FROM
、MAINTAINER
、RUN
等指令,下面就将最为常用的指令介绍下:
CMD
指令格式有如下三种:
CMD ["executable", "param1", "param2" ...]
使用exec
执行,推荐方式。CMD executable param1 param2 ...
在/bin/sh
中执行,提供给需要交互的应用。CMD ["param1", "param2" ...]
提供给ENTRYPOINT
的默认参数。
CMD
指令是指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD
指令。如果指定多条 CMD
指令,只有最后一条会被执行。指的说明的是,
如果用户启动容器时指定了运行的命令,则会覆盖掉 CMD
指定的命令。具体原因见:RUN & CMD & Entrypoint。
ENTRYPOINT
指令格式有如下两种:
ENTRYPOINT ["executable", "param1", "param2" ...]
使用exec
执行,推荐方式。ENTRYPOINT executable param1 param2 ...
在/shell
中执行。
ENTRYPOINT
指令与 CMD
指令相同都是用于指定启动容器时执行的命令。但是该指令与 CMD
指令有些区别,具体见
RUN & CMD & Entrypoint。同样的,每个 Dockerfile 只能有一条 ENTRYPOINT
指令。如果指定多条
ENTRYPOINT
指令,只有最后一条会被执行。
2.3.1.4. 镜像构建
上面主要介绍 Dockerfile 中的指令集,在实际应用中需要注意 CMD
和 Entrypoint
指令集的使用。关于之间的区别你可以参考 RUN & CMD & Entrypoint,
本篇是国外作者文章,这里直接进行摘录。因为该文章介绍的特别详细和清晰,所以笔者并没有进行翻译。
以上如果否理解后这里就说下如何基于 Dockerfile 进行构建镜像。Dockerfile 是一个文件,并没有任何后缀名,其实就是使用如下命令进行创建的:
$ touch Dockerfile
$ ls
Dockerfile
在该文件中即可编写自己的应用,具体见上面示例。下面就说下编写完成后如何进行构建镜像!
Dockerfile 镜像构建指令是:
$ docker build .
其中 .
表示当前目录,执行该命令需要在 Dockerfile 同级目录,即:
$ ls
Dockerfile
$ docker build .
另外,如果 Dockerfile 在另外一个文件夹中可以指定 -f
参数。如 Dockerfile 所在目录是 /home/docker/
,则执行命令为:
$ ls /home/docker/
Dockerfile
$ pwd
/home/data
# 执行命令
$ docker build -f /home/docker/Dockerfile .
除此之外,你还可以为构建的镜像使用 -t
参数指定标签(也可以理解为名称):
$ docker build -t itumate/myapp .
这里使用的标签为 itumate/myapp
,这是一个标准的标签。即 itumate
其实是 DockerHub 的组织名称,myapp
是 itumate
组织下的一个镜像。
使用该命令构建完成的镜像可以直接推送到远程仓库。
不过,使用该命令构建的没有指定具体版本。docker 会理解它是一个 dangling 镜像。所以,这里可以为该镜像指定标签版本好:
$ docker build -t itumate/myapp:v1.0.0 .
or
$ docker build -t itumate/myapp:1.0.0 .
版本号可以随意指定,不一定是数字。还有一点需要说明,版本号还可以指定为 latest
版本,如下所示。但尽量不要使用该命令,还是使用上面的那种形式比较好:
$ docker build -t itumate/myapp:latest .
2.3.1.5. 总结
本篇只是简单介绍下 Dockerfile 的使用,介绍的指令集也是最常用的。除此之外,还有许多其他指令集。比如创建 .dockerignore
。
想了解更多指令信息可以参考:Dockerfile 指令集官网