安卓系统

如何使用dockerfile构建docker镜像

Docker 入门系列基础教程(一)

Docker 入门系列基础教程(一)

目录:

Anonim

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

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

什么是Dockerfile

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

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

Docker文件采用以下形式:

# Comment INSTRUCTION arguments

INSTRUCTION 不区分大小写,但是约定是使用UPPERCASE作为其名称。

以下是对一些最常用的Dockerfile指令的简短描述的列表:

  • ARG-此指令允许您定义在构建时可以传递的变量。 您也可以设置默认值。 FROM-用于构建新图像的基本图像。 该指令必须是Dockerfile中的第一条非注释指令。 此规则的唯一例外是要在 FROM 参数中使用变量时。 在这种情况下, FROM 之前可以有一个或多个 ARG 指令。 标签 -用于向图像添加元数据,例如描述,版本,作者等。 您可以指定多个 LABEL ,每个 LABEL 指令是一个键值对。 RUN-该指令中指定的命令将在构建过程中执行。 每个 RUN 指令都会在当前图像的顶部创建一个新层。 ADD-用于将文件和目录从指定源复制到Docker映像上的指定目标。 源可以是本地文件或目录,也可以是URL。 如果源是本地tar归档文件,那么它将自动解压缩到Docker映像中。 COPY-与 ADD 类似,但源只能是本地文件或目录。 ENV-此指令可让您定义环境变量。 CMD-用于指定运行容器时将执行的命令。 您只能在Dockerfile中使用一条 CMD 指令。 ENTRYPOINT-与 CMD 相似,此指令定义运行容器时将执行的命令。 WORKDIR-此伪指令为 RUN CMD ENTRYPOINT COPY ADD 指令设置当前工作目录。 ENTRYPOINT 设置运行以下任何 RUN CMD ENTRYPOINT COPY ADD 指令时要使用的用户名或 UID VOLUME-使您可以将主机目录挂载到容器。 EXPOSE-用于指定容器在运行时侦听的端口。

要从文件和目录中排除文件和目录,请在上下文目录中创建一个 .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

让我们解释一下Dockerfile中每一行的含义:

  • 在第 1 行中,我们定义了基本映像。从第 3 行开始的 RUN 指令将更新apt索引,安装“ redis-server”软件包并清理apt缓存。 指令中使用的命令与在Ubuntu服务器上安装 EXPOSE 的命令相同 EXPOSE 指令定义了 EXPOSE 服务器 EXPOSE 的端口。最后一行,我们使用 CMD 指令设置默认命令容器运行时将执行该命令。

保存文件并关闭编辑器。

建立形象

下一步是构建图像。 为此,请从Dockerfile所在的目录中运行以下命令:

docker build -t linuxize/redis.

选项 -t 以'username / imagename:tag'格式指定图像名称以及可选的用户名和标记。

构建过程的输出如下所示:

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 ---> 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 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的最佳实践。

码头工人