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镜像中。
COPY与ADD
类似,但源只能是本地文件或目录。ENV此指令可让您定义环境变量。
CMD用于在创建容器时指定运行的命令。你只能在Dockerfile中仅使用一次CMD
指令。ENTRYPOINT与CMD
相似,指令定义了运行容器时要运行的命令。
WORKDIR该指令为RUN
,CMD
,ENTRYPOINT
,COPY
和ADD
指令设置当前工作目录。这个工作目录时镜像内部的目录。
USER指令可以是用户名或者UID,它设置以指定用户运行RUN
,CMD
,ENTRYPOINT
,COPY
和ADD
指令。
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的最佳实践。
如有任何疑问,请在下面发表评论。