我们先来看看Docker的整体架构:
实际上分为三个部分:
- Docker 客户端:也就是我们之前使用的docker命令,都是在客户端上执行的,操作会发送到服务端上处理。
- Docker 服务端:服务端就是启动容器的主体了,一般是作为服务在后台运行,支持远程连接。
- Registry:是存放Docker镜像的仓库,跟Maven一样,也可以分公有和私有仓库,镜像可以从仓库下载到本地存放。
当我们需要在服务器上部署一个已经打包好的应用和环境,我们只需要下载打包好的镜像就可以了,我们前面执行了:
sudo docker run -d -p 80:80 nginx
实际上这个命令输入之后:
- Docker客户端将操作发送给服务端,告诉服务端我们要运行nginx这个镜像。
- Docker服务端先看看本地有没有这个镜像,发现没有。
- 接着只能从公共仓库Docker Hub去查找下载镜像了。
- 下载完成,镜像成功保存到本地。
- Docker服务端加载Nginx镜像,启动容器开始正常运行(注意容器和其他容器之间,和外部之间,都是隔离的,互不影响)
所以,整个流程中,Docker就像是一搜运输船,镜像就像是集装箱,通过运输船将世界各地的货物送往我们的港口,货物到达港口后,Docker并不关心集装箱里面的是什么,只需要创建容器开箱即用就可以了。相比我们传统的手动安装配置环境,不知道方便了几个层次。
不过容器依然是寄托于宿主主机的运行的,所以一般在生产环境下,都是通过虚拟化先创建多台主机,然后再到各个虚拟机中部署Docker,这样的话,运维效率就大大提升了。