基本架构
Docker 目前采用了标准的 C/S 架构,包括客户端、服务端两大核心组件,同时通过镜像仓库来存储镜像。客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。
服务端
服务端主要包括四个组件:
dockerd:为客户端提供 RESTful API,响应来自客户端的请求,采用模块化的架构,通过专门的 Engine 模块来分发管理各个来自客户端的任务。
docker-proxy:是 dockerd 的子进程,当需要进行容器端口映射时,docker-proxy 完成网络映射配置。
containerd:是 dockerd 的子进程,提供 gRPC 接口响应来自 dockerd 的请求,对下管理 runC 镜像和容器环境。
containerd-shim:是 containerd 的子进程,为 runC 容器提供支持,同时作为容器内进程的根进程。

runC 是从 Docker 公司开源的 libcontainer 项目演化而来的,目前作为一种具体的开放容器标准实现加入 Open Containers Initiative(OCI)。
runC 已经支持了 Linux 系统中容器相关技术栈,同时正在实现对其他操作系统的兼容。用户可以通过使用 docker -runc 命令来直接使用 OCI 规范的容器。
dockerd 默认监听本地的 unix:///var/run/docker.sock 套接字,只允许本地的 root 用户或 docker 用户组成员访问。
可以通过 -H 选项来修改监听的方式。例如,让 dockerd 监听本地的 TCP 连接 1234 端口:
$ sudo dockerd -H 127.0.0.1:1234
docker-proxy 只有当启动容器并且使用端口映射时候才会执行,负责配置容器的端口映射规则。
客户端
Docker 客户端为用户提供一系列可执行命令,使用这些命令可实现与 Docker 服务端交互。
客户端默认通过本地的 unix:///var/run/docker.sock 套接字向服务端发送命令。如果服务端没有监听在默认的地址,则需要客户端在执行命令的时候显式地指定服务端地址。例如,假定服务端监听在本地的 TCP 连接 1234 端口为 tcp://127.0.0.1:1234,只有通过 -H 参数指定了正确的地址信息才能连接到服务端:
$ docker -H 127.0.0.1:1234 info
Client: Docker Engine - Community
Version: 24.0.6
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.11.2
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.21.0
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 3
Running: 0
Paused: 0
Stopped: 3
Images: 9
Server Version: 24.0.6
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
runc version: v1.1.9-0-gccaecfc
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 3.10.0-1160.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 7.62GiB
Name: k8s
ID: f9c378bf-5ed2-41d5-89bc-d58b2cae6a36
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
192.168.10.110:5000
127.0.0.0/8
Registry Mirrors:
https://v486v7xx.mirror.aliyuncs.com/
Live Restore Enabled: false
WARNING: API is accessible on http://127.0.0.1:1234 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/go/attack-surface/
镜像仓库
Docker 使用镜像仓库(Registry)在大规模场景下存储和分发 Docker 镜像。镜像仓库提供了对不同存储后端的支持,存放镜像文件,并且支持 RESTful API,接收来自 dockerd 的命令,包括拉取、上传镜像等。
Last updated
Was this helpful?