Docker Client ,也称 Docker 客户端。它其实就是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。
Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。它负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。
我们大致可以将其分为以下三部分:
Docker Server
Engine
Job
Docker Daemon的架构如下所示:
Docker Daemon 可以认为是通过 Docker Server 模块接受 Docker Client 的请求,并在 Engine 中处理请求,然后根据请求类型,创建出指定的 Job 并运行。 Docker Daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。
运行过程的作用有以下几种可能:
向 Docker Registry 获取镜像
通过 graphdriver 执行容器镜像的本地化操作
通过 networkdriver 执行容器网络环境的配置
通过 execdriver 执行容器内部运行的执行工作
由于 Docker Daemon 和 Docker Client 的启动都是通过可执行文件 docker 来完成的,因此两者的启动流程非常相似。 Docker 可执行文件运行时,运行代码通过不同的命令行 flag 参数,区分两者,并最终运行两者各自相应的部分。
启动 Docker Daemon 时,一般可以使用以下命令来完成
docker --daemon = true docker –d docker –d = true再由 docker 的 main() 函数来解析以上命令的相应 flag 参数,并最终完成 Docker Daemon 的启动。
下图可以很直观地看到 Docker Daemon 的启动流程:
默认配置下, Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。我们可以照着如下步骤进行配置:
1、编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service ,在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。
2、重启 Docker daemon
systemctl daemon-reload systemctl restart docker.service3、我们通过以下命令即可实现与远程服务器通信
docker -H 服务器IP地址 info-H 是用来指定服务器主机, info 子命令用于查看 Docker 服务器的信息
Docker Image在开篇那文中我已经提到过, Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。
镜像有多种生成方法:
从无到有开始创建镜像
下载并使用别人创建好的现成的镜像
在现有镜像上创建新的镜像
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build <docker-file> 命令可以构建出 Docker 镜像,在后续的教程中,我们会用一篇专门讨论这个问题。
Docker RegistryDocker registry 是存储 docker image 的仓库,它在 docker 生态环境中的位置如下图所示:
运行docker push、docker pull、docker search时,实际上是通过 docker daemon 与 docker registry 通信。具体内容可以参看开篇那文
Docker Container