Dockerfile构建Docker镜像

Docker镜像是Docker容器的蓝图,其中包含应用程序以及运行应用程序所需的一切。容器是镜像的运行时实例

5 min read
By myfreax
Dockerfile构建Docker镜像

Docker镜像是Docker容器的蓝图,其中包含应用程序以及运行应用程序所需的一切。容器是镜像的运行时实例。

在本教程中,我们将解释什么是Dockerfile,如何创建Dockerfile以及使用Dockerfile构建Docker镜像。

Dockerfile是一个文本文件,其中包含用户可以在命令行上运行以创建镜像的所有命令。它包含Docker构建镜像所需的所有指令。

Docker镜像由一系列文件系统层组成,这些层代表镜像的Dockerfile中的指令,指令构成了可执行的软件应用程序。

Dockerfile使用的是yaml文件编写,在语法的问题上你可参考yaml文件的语法与基本的格式。

但在Dockerfile有一些社区惯例,比如指令使用大写。不区分大小写,但是约定是使用大写字母。以下是一些最常用的Dockerfile指令的简短描述。

ARG此指令允许您定义在构建时可以传递的变量。您还可以设置默认值。

FROM用于构建镜像的基础镜像。FROM指令基本是Dockerfile中的第一个指令。

唯一例外是要在FROM指令的参数中使用变量时。在这种情况下,FROM之前可以有一个或多个ARG指令。

LABEL用于向镜像添加元数据,例如描述,版本,作者等。您可以指定多个LABEL,每个LABEL指令是一个键值对。

RUN指令指定的命令在构建镜像的时候运行。在dockerfile可以有多个RUN指令。每一个RUN指令都会在当前镜像之上创建一个层。

ADD用于将文件和目录从指定源复制到docker镜像。源可以是本地文件或目录,也可以是URL。如果源是本地tar存档,则它将自动解压缩到Docker镜像中。

COPYADD类似,但源只能是本地文件或目录。ENV此指令可让您定义环境变量。

CMD用于在创建容器时指定运行的命令。你只能在Dockerfile中仅使用一次CMD指令。ENTRYPOINTCMD相似,指令定义了运行容器时要运行的命令。

WORKDIR该指令为RUNCMDENTRYPOINTCOPYADD指令设置当前工作目录。这个工作目录时镜像内部的目录。

USER指令可以是用户名或者UID,它设置以指定用户运行RUNCMDENTRYPOINTCOPYADD指令。

VOLUME使您可以将主机目录映射到容器。EXPOSE用于指定容器监听的端口。

要从文件和目录中排除文件和目录,请在docekrfile所在目录中创建.dockerignore文件。.dockerignore的语法类似于Git的.gitignore文件

有关Dockerfile指令的完整参考和详细说明,请参见官方Dockerfile参考页面。

创建镜像

创建Docker镜像时,最常见的情况是从Docker Hub中合并镜像,并在指定基础镜像上进行的更改。

最常用的基础镜像是Alpine,因为它很小并且经过优化,可以在RAM中运行。

Docker Hub是基于云的注册表服务,除其他功能外,还用于将Docker镜像保存在公共或私有存储库中。

在此示例中,我们将为Redis服务器创建Docker镜像。我们将使用ubuntu 18.04作为基础镜像。

首先运行命令mkdir ~/redis_docker创建目录,其中将包含Dockerfile和所有必需的文件。导航到目录cd ~/redis_docker并创建以下Dockerfile文件。

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y redis-server && \
    apt-get clean

EXPOSE 6379

CMD ["redis-server", "--protected-mode no"]

FROM指令指定基础镜像是ubuntu:18.04。RUN指令将更新ubuntu软件索引,安装redis-server并清理apt缓存。

RUN指令中使用的命令与在Ubuntu安装Redis的命令相同。EXPOSE指令定义容器暴露的的端口。在最后一行中,我们使用CMD指令设置在创建容器时要运行的命令。

当文件创建完成后,你下一步是构建镜像。请从Dockerfile所在的目录中运行docker构建镜像的命令。

docker build -t myfreax/redis .命令将会开始构建过程,使用选项-t指定镜像的名称,一般都是以用户名/应用名称的格式作为名称。

完成构建过程后,运行docker image ls命令列出镜像,你将会看到刚创建的镜像名称。

运行容器

现在已创建镜像,您可以运行docker run -d -p 6379:6379 --name redis myfreax/redis命令创建容器。

-d选项指示在后台运行容器,-p 6379:6379选项映射主机端口6379到容器的端口6379,--name redis选项指定容器名称。

最后一个参数myfreax/redis是镜像的名称,指定创建容器时使用的镜像。启动容器后,运行docker container ls命令可列出所有正在运行的容器。

本教程仅介绍了使用Dockerfile生成镜像的基础知识。要了解有关如何编写Dockerfile的更多信息以及建议的最佳实践,请参阅编写Dockerfile的最佳实践

如有任何疑问,请在下面发表评论。