Docker Context

理解 Docker Context

通常我们构建 Docker 镜像时,一般会按下面步骤进行:

  1. 跳转至 Dockerfile 所在目录

  2. 执行 docker build 命令

    1
    docker build -t <IMAGE_NAME:IMAGE:TAG> .

. 表示当前目录,Dockerfile 就在当前目录,很容易误解为最后的路径是指定 Dockerfile 所在路径;但其实并不是,要理解其代表的含义,需要先了解 Docker 架构以及 docker build 工作原理。

Docker 架构

Docker 是一个典型的 C/S 架构的应用,分为 Docker 客户端和 Docker 服务端(守护进程)。

Docker 客户端通过 REST API 和服务端进行交互,docker 客户端每发送一条指令,底层都会转化成 REST API 调用的形式发送给服务端,服务端处理客户端发送的请求并给出响应。

Docker 镜像的构建、容器创建、容器运行等工作都是 Docker 服务端来完成的,Docker 客户端只是承担发送指令的角色。

Docker 客户端和服务端可以在同一个宿主机,也可以在不同的宿主机,如果在同一个宿主机的话,Docker 客户端默认通过 UNIX 套接字(/var/run/docker.sock)和服务端通信。

Docker build

docker build 命令构建镜像的大概流程如下:

  1. 客户端将构建命令后指定路径(.)下的所有文件打包成一个 tar 包,发送给服务端
  2. 服务端接收到客户端发送的 tar 包后进行解压,然后根据里面的 Dockerfile 脚本指令进行对象的分层构建

docker build 命令如果没有指定 Dockerfile,那么客户端默认会在命令中指定的上下文路径下找 Dockerfile 文件,当然也可以通过 -f 参数指定 Dockerfile 文件。

1
docker build -f DockerfilePath -t registryName:tag path

构建上下文

客户端把构建所需要的文件传输给服务端,服务端以客户端发送的文件为上下文;也就是 docker build 命令中指定的路径目录就是 Dockerfile 脚本内指令的工作目录。