如何使用Dockerfile构建Docker映像
Docker映像是Docker容器的蓝图,其中包含应用程序以及运行该应用程序所需的一切。 容器是映像的运行时实例。
在本教程中,我们将解释什么是Dockerfile,如何创建Dockerfile以及如何使用Dockerfile构建Docker映像。
什么是Dockerfile#
Dockerfile是一个文本文件,其中包含用户可以在命令行上运行以创建映像的所有命令。 它包括Docker生成映像所需的所有指令。
Docker映像由一系列文件系统层组成,这些文件系统层表示映像的Dockerfile中的指令,该指令构成可执行软件应用程序。
Docker文件采用以下形式:
# Comment
INSTRUCTION arguments
INSTRUCTION
不区分大小写,但是约定是使用UPPERCASE作为其名称。
以下是对一些最常用的Dockerfile指令的简短描述的列表:
- ARG -此指令允许您定义在构建时可以传递的变量。 您还可以设置默认值。
- 从 -用于建立新图像的基本图像。 该指令必须是Dockerfile中的第一条非注释指令。 该规则的唯一例外是,当您想在
FROM
论据。 在这种情况下,FROM
可以在一个或多个之前ARG
说明。 - 标签 -用于向图像添加元数据,例如描述,版本,作者等。 您可以指定多个
LABEL
,以及每个LABEL
指令是一个键值对。 - 跑 -该指令中指定的命令将在构建过程中执行。 每
RUN
指令在当前图像的顶部创建一个新层。 - 加 -用于将文件和目录从指定源复制到Docker映像上的指定目标。 源可以是本地文件或目录,也可以是URL。 如果源是本地tar归档文件,那么它将自动解压缩到Docker映像中。
- 复制 – 相似
ADD
但源只能是本地文件或目录。 - ENV -该指令允许您定义环境变量。
- CMD -用于指定运行容器时将执行的命令。 您只能使用一个
CMD
Dockerfile中的指令。 - 入口点 – 相似
CMD
,此指令定义运行容器时将执行的命令。 - 工作目录 -该指令设置当前的工作目录
RUN
,CMD
,ENTRYPOINT
,COPY
和ADD
说明。 - 用户 -设置用户名或
UID
运行以下任何命令时使用RUN
,CMD
,ENTRYPOINT
,COPY
和ADD
说明。 - 卷 -使您可以将主机目录挂载到容器。
- 暴露 -用于指定容器在运行时侦听的端口。
要排除将文件和目录添加到映像中,请创建一个 .dockerignore
上下文目录中的文件。 的语法 .dockerignore
与Git的其中之一相似 .gitignore
文件。
有关Dockerfile指令的完整参考和详细说明,请参阅官方Dockerfile参考页面。
创建一个Dockerfile
创建Docker映像时,最常见的情况是从注册表(通常是从Docker Hub)中提取现有映像,并指定要在基础映像上进行的更改。 创建Docker映像时,最常用的基础映像是Alpine,因为它很小并且经过优化,可以在RAM中运行。
Docker Hub是基于云的注册表服务,除其他功能外,还用于将Docker映像保存在公共或私有存储库中。
在此示例中,我们将为Redis服务器创建一个Docker映像。 我们将使用最新的ubuntu 18.04作为基本映像。
首先,创建一个包含Dockerfile和所有必需文件的目录:
mkdir ~/redis_docker
导航到目录并创建以下Dockerfile:
cd ~/redis_docker
nano Dockerfile
Docker文件
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"]
让我们解释一下Dockerfile中每一行的含义:
- 上线
1
我们正在定义基本图像。 - 的
RUN
在线开始的指令3
将更新apt索引,安装“ redis-server”软件包并清理apt缓存。 说明中使用的命令与在Ubuntu服务器上安装Redis所使用的命令相同。 - 的
EXPOSE
指令定义redis服务器侦听的端口。 - 在最后一行,我们使用
CMD
设置容器运行时将执行的默认命令的指令。
保存文件并关闭编辑器。
建立映像
下一步是构建图像。 为此,请从Dockerfile所在的目录中运行以下命令:
docker build -t linuxize/redis .
选项 -t
以“用户名/图像名:标签”格式指定图像名称以及可选的用户名和标签。
构建过程的输出如下所示:
Sending build context to Docker daemon 3.584kB
Step 1/4 : FROM ubuntu:18.04
---> 7698f282e524
Step 2/4 : RUN apt-get update && apt-get install -y gosu redis-server && apt-get clean
---> Running in e80d4dd69263
...
Removing intermediate container e80d4dd69263
---> e19fb7653fca
Step 3/4 : EXPOSE 6379
---> Running in 8b2a45f457cc
Removing intermediate container 8b2a45f457cc
---> 13b92565c201
Step 4/4 : CMD ["redis-server", "--protected-mode no"]
---> Running in a67ec50c7048
Removing intermediate container a67ec50c7048
---> d8acc14d9b6b
Successfully built d8acc14d9b6b
Successfully tagged linuxize/redis:latest
构建过程完成后,新图像将在图像列表中列出:
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
linuxize/redis latest d8acc14d9b6b 4 minutes ago 100MB
ubuntu 18.04 7698f282e524 5 days ago 69.9MB
如果要将映像推送到Docker Hub,请参阅将Docker容器映像推送到Docker Hub。
运行容器
现在已经创建了映像,您可以通过运行以下命令从中运行一个容器:
docker run -d -p 6379:6379 --name redis linuxize/redis
的 -d
选项告诉Docker以分离模式运行容器, -p 6379:6379
选项会将端口6379发布到主机,并且 --name redis
选项指定容器名称。 最后一个论点 linuxize/redis
是映像的名称,用于运行容器。
容器启动时,使用以下命令列出所有正在运行的容器:
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b7d424cd915 linuxize/redis:v0.0.1 "redis-server '--pro…" 5 minutes ago Up 5 minutes 0.0.0.0:6379->6379/tcp redis
要验证一切正常,应使用 redis-cli
连接到Docker容器:
redis-cli ping
Redis服务器应响应 PONG
。
结论#
本教程仅涵盖使用Dockerfile生成映像的基础知识。 要了解有关如何编写Dockerfile的更多信息以及建议的最佳实践,请参阅编写Dockerfile的最佳实践。
如有任何疑问,请在下面发表评论。
码头工人