**
Docker的框架结构
**
Docker框架结构基于docker源码响应的框架
Server与Client
监听端口
一个完整的docker程序,由client和server两个端组成,客户端和服务端都会在本地安装好,在生产环境中,是可以将client和server分离的
docker默认是没有监听端口的,没有监听端口之前是不可以将client和server分离的。所以添加监听端口就可以将server与client分离了
现在就来开启以下docker的监听端口,修改docker的启动文件中的内容
1 [root@localhost ~]# vim /usr/lib/systemd/system/docker.service
2 # 14行的ExecStart添加 -H tcp://0.0.0.0,监听所有ip
3 ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0 --containerd=/run/containerd/containerd.sock
修改完配置文件需要重启docker
1 [root@localhost ~]# systemctl daemon-reload
2 [root@localhost ~]# systemctl restart docker
查看docker的监听状态
1 [root@localhost ~]# netstat -anput | grep docker
2 tcp6 0 0 :::2375 ::😗 LISTEN 70021/dockerd
然后就可以使用远程机器使用docker的命令,并对这台机器的docker可以操作
重新开一台已经安装docker客户端的虚拟机
1 docker -H 192.168.1.11 images # 查看1.11主机docker的本地镜像
2 docker -H 192.168.1.11 info # 查看docker信息
3 …
通常是不会去更改监听端口的,一般只用于远程管理,需要远程管理通过ansible等程序即可
为了方便之后的操作,将以上的修改,改回默认即可
**
Docker总体框架结构
**
Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。
松耦合:Docker的每个模块中的依赖性不是特别强
紧耦合:程序的每个模块有这紧密相关的联系,同时性能也是较强的
在docker version命令输出信息中,可以看到有两个端,一个Client,一个Server,默认情况下两个端口是在一起使用的,也可以通过手动将它们分开,也就是我们以上所做的监听端口的内容
接下来我们来介绍结构图的总览
方便接下来对逐个模块的理解
用户使用Docker Client与Docker Daemon建立通信,并发送请求给Daemon。
而Docker Daemon作为Docker架构中的主体部分,首先提供了Server的功能,使其可以接收Docker Client的请求;而后由Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在。
Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。
而libcontainer是一项独立的容器管理包,networkdriver和execdriver都是通过libcontainer来实现具体容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。
**
框架结构中各模块的功能与实现分析
**
先来看一下要从那些开始分析,在整个架构中,主要的模块有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。
Docker Client
Docker Client是Docker架构中用户用来和Docker Daemon建立通信的客户端。用户使用的可执行文件docker,通过docker命令行工具可以发起众多管理container(容器)的请求。
Docker Client可以通过三种方式和Docker Daemon建立通信:
• tcp://host:port
• unix://path_to_socket
• fd://socketfd
为了简单起见,一般Client和Server是不会分开的,一律使用第一种方法tcp://host:port进行通信。与此同时,与Docker Daemon建立连接并传输请求的时候,Docker Client可以通过设置命令行flag参数的形式设置安全传输层协议(TLS)的有关参