了解Docker架构前,需要先知道Docker中几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
比如之前讲过的MySQL镜像,它里面就有各种各样所需要的依赖,这些东西最终落地到硬盘,其实就是硬盘中的文件,例如下图有MySQL写数据的data目录文件、还有logs日志文件、bin里的可执行文件,还有就是MySQL所需要的各种各样的函数库了。所以也就是说,镜像就是硬盘中的文件。

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
镜像 就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
而容器就是将这些文件中编写的程序、函数加载到内存中形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
例如你下载了一个,如果我们将在磁盘上的运行文件及其运行的操作系统依赖打包,形成镜像。然后你可以启动多次,双开、甚至三开,跟多个妹子聊天。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
可以理解成:MySQL的应用给它跑起来,形成的进程就是容器,只不过在Docker里面,容器还需要做隔离。容器可以看做下图里面的小盒子,这个盒子里面将来会利用Linux手段给它形成隔离空间,里面会有自己的独立的cpu资源、内存资源甚至于还有独立的文件系统。那一次在这个容器内运行的这个进程,它就会以为自己是这台计算机上唯一的进程了,从而起到一种隔离的效果。将来我们MySQL镜像不管是启动成一个容器还是启动成多个容器,它们之间都是相互隔离的。
那么当容器运行中,必然会出现数据读写操作。比如MySQL将来需要存数据,需要存到data目录,那些盒子能不能把自己的数据写到镜像的data目录里面呢,显然不能,因为如果它们这么做了,不就等于对镜像产生了污染吗,所以镜像都是只读的。

也就是 容器 在运行的过程中,不能往镜像里写东西,可以基于镜像去创建容器,而容器可以从里面去读数据,但是不能写。
那将来MySQL容器往哪写数据呢?很简单,将镜像中的文件拷贝一份到自己的独立文件系统当中,在写数据的时候写到自己的容器里面,并不会对别人的容器产生影响,也不会对镜像产生影响。只有这样,我们的镜像才可以放心大胆的交给别人去使用,因为镜像不会被干扰,也不会被影响。

那问题来了,我们怎样将镜像共享给别人使用呢?
开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样,GitHub是做代码托管的,而DockerHub是做镜像托管的。
- DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry(镜像服务器)。
程序员可以利用我们的Docker提供的一些命令去完成镜像的构建:MySQL、Redis等各种各样的镜像,然后把这些镜像上传到DockerHub这样的服务器上面去。当然Docker官方也写了很多很多优良的镜像,把它都放到了DockerHub这样的服务器上。
- 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
但是如果你觉得这些服务器在外网公开太危险,公司内部的东西不想公开,我们将来也可以搭建私有云服务器,这些都叫Dcker Registry(镜像服务器)。
我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:

那么我们该怎么利用Docker完成镜像构建,或者从远端拉取镜像呢?又该怎么样去运行容器呢?
这就需要去了解Docker架构了。
我们要使用Docker来操作镜像、容器,就必须要安装Docker。
Docker是一个CS架构的程序,由两部分组成:
- S:服务端(server):Docker守护进程,负责接收处理Docker指令,管理镜像、容器等,例如构建镜像、从远端拉取镜像、运行容器等
- C:客户端(client):通过命令或RestAPI向Docker服务端发送指令,或者发送restAPI的请求。可以在本地(使用命令)或远程(RestAPI)向服务端发送指令。
例如使用的命令,这个命令到达DockerServer以后,会被Docker的守护进程Docker deamon接收和处理,它会利用你提供的这些数据给它构建成一个镜像。
除了这种构建镜像的方式以外,我们还可以去Docker Registry拉取镜像,因为Docker Registry里会有Docker官方提供的各种优质镜像,拉取的时候可以通过 的命令, 也会把请求发送到DockerServer端,而docker daemon守护进程就回去registry里拉取指定的镜像了。然后就会通过 指令运行镜像创建容器,然后守护进程就会帮助我们完成容器的创建,然后部署就完成了。
但一般情况下,nginx、MySQL、redis等等这样的一些应用,建议大家直接使用官方的镜像就可以了,没必要自己构建。只有一些自己的微服务,或者需要去做一些深度定制才需要构建。所以我们一般使用Docker,主要就是像DockerServer发命令,想办法得到镜像,然后再把镜像创建成容器运行,然后完成部署就行了。
镜像:
- 将应用程序及其依赖、环境、配置打包在一起
容器:
- 镜像运行起来就是容器,一个镜像可以运行多个容器,将来形成集群。只不过容器需要形成隔离空间,里面有自己独立的cpu、内存、文件系统,避免容器去修改镜像、污染镜像。
Docker结构:
- 服务端(S):接收命令或远程请求,操作镜像或容器
- 客户端(C):发送命令或者请求到Docker服务端
DockerHub:
- 一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry(镜像服务器)
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-yjs/69041.html