Docker架构
Docker是一个CS架构的程序,由两部分组成:
服务端(server):由Docker Daemon守护进程负责接收命令或远程请求,处理Docker指令,管理镜像与容器。
客户端(client):通过命令或RestAPI向Docker服务端发送指令。
流程如下:
Client端发送指令至DockerServer,指令到达DockerServer后会被其中的docker daemon(守护进程)接收并处理。
以下列命令为例:
- docker build(构建镜像命令):docker daemon利用提供的数据去构建镜像。(流程:请看下图绿色线)
- docker pull(拉取镜像命令):docker daemon接收指令后便会去Registry(仓库)中拉取指定的镜像。(流程:请看下图红色线)
- docker run(运行镜像创建容器命令):docker daemon接收指令后便会帮助你完成指定镜像容器的创建。(流程:请看下图蓝色线)
建议:像mysql、redis、nginx等直接使用官方镜像即可,没必要自己构建;只有自己的微服务或者需要做一些深度定制的才需要构建。
镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起的一个只读文件包(以防被污染)。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,Docker会给容器进程做隔离,使其对外不可见。
上述可知,镜像是一个打包好的只读文件包,同时docker使用沙箱机制对其运行起来的进程做了隔离。也就是说,一个镜像可以安全的启动多次,进而形成多个进程。
既然镜像为只读文件包,可以安全的形成多个容器进程,那进程间的写操作又是如何隔离的?
解:如下图所示,基于镜像创建容器时,容器会各自拷贝一份目录,写操作均基于自身拷贝后的文件目录,由此便完成了各自进程间的数据隔离。
DockerHub
DockerHub是一个官方的Docker镜像的托管平台(类似于GitHub的代码托管)。这样的平台称为Docker Registry。
类似的Docker镜像托管平台还有国内的网易云镜像服务、阿里云镜像库等。
我们为什么需要Docker Registry
因为开源应用程序繁多,打包往往是重复的劳动。为了避免这些重复劳动,人们将自己打包好的应用镜像(例如Redis、MySQL镜像)放到网络上共享使用。
所以,我们一方面将自己的镜像共享到DockerHub,另一方面也可以从DockerHub中拉取镜像来使用。
如下图: