docker是典型的CS架构,包括客户端和服务端两大核心组件,同时通过镜像仓库来存储镜像。客户端和服务器既可以运行在同一个机器上,也可以通过socket或者RESTful API来进行通信
服务端
docker的服务端一般在宿主主机后台运行,dockerd作为服务端接收来自客户的请求,并通过container具体处理与容器相关的请求,包括创建、运行、删除容器等。
服务端主要包括四个组件:
- dockerd:为客户端提供RESTful API,响应来自客户端的请求,采用模块化的架构,通过专门的engine模块来分发管理各个来自客户端的任务。
- docker-proxy:是dockerd的子进程,当需要进行容器端口映射时,docker-proxy完成网络映射配置
- containered:是dockerd的子进程,提供gRPC接口响应来自dockerd的请求,对下管理runC镜像和容器环境
- containered-shim:是containerd的子进程,为runC容器提供支持,同时作为容器内进程的根进程
dockerd默认监听本地的unix:///var/run/docker.socker套接字,只允许本地的root用户或者docker用户组成员访问。可以通过-H
选项来修改监听的方式。比如,让docker监听本地的TCP连接1234端口:
dockerd -H 127.0.0.1:1234
docker-proxy只有当启动容器并且使用端口映射时候才会执行,负责配置容器的端口映射规则
docker run -itd -p 80:80 ubuntu:latest /bin/sh
ps -ef | grep docker
客户端
用户使用的docker可执行命令即为客户端程序。客户端发送命令后,需要等待服务端返回;一旦收到返回后,客户端立即执行结束并退出。
客户端默认通过本地的unix:///var/run/docker.socker与服务端通信,如果服务端没有监听在默认地址,客户端必须通过-H参数指定了正确的地址才能连接到服务端:
docker -H tcp://127.0.0.1:1234 info
镜像仓库
镜像是使用容器的基础,docker使用镜像仓库存储和分发docker镜像。
用户可以从镜像仓库拉取镜像、也可以上传镜像到仓库