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

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

什么是Dockerfile

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

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

Docker文件采用以下格式:

# Comment
INSTRUCTION arguments

INSTRUCTION不区分大小写,但是约定是使用大写字母。

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

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

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"]

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

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

保存文件并关闭编辑器。

构建镜像

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

docker build -t myfreax/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 myfreax/redis:latest

完成构建过程后,新图像将在图像列表中列出:

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myfreax/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 myfreax/redis

-d选项告诉Docker在分离模式下运行容器,-p 6379:6379选项会将端口6379发布到主机,--name redis选项指定容器名称。最后一个参数myfreax/redis是映像的名称,用于运行容器。

启动容器时,使用以下命令列出所有正在运行的容器:

docker container ls
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
6b7d424cd915        myfreax/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的最佳实践

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

如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持