目录
1. 项目部署时的复杂性?
2. Docker是如何解决依赖兼容问题的?
3. 众多Linux操作系统发行版的区别
4. Docker 是如何实现跨系统运行的?
5. Docker与虚拟机的差别
6. 镜像(Image)与容器(Container)
7. DockerHub
8. Docker 架构
9. Docker 基本操作
1. 项目部署时的复杂性?
在了解 Docker之前,我们需要先知道一件事,那就是在实际业务开发和部署的时候,特别是大型项目,组件会非常多,运行环境也会非常的复杂。
举些最简单的例子,前端通常会依赖于 Node.js;缓存通常会依赖于 Redis;消息队列也会有多种MQ 组件;数据库通常采用 MySQL;
而这些应用到最终通常我们都是要部署在服务器上的,在运行业务时,我们通常都会采用 Linux 操作系统。那么问题就来了,每种应用(也可以说是软件)都会依赖于不同的函数库和依赖,如果这些应用需要用到的函数库和依赖版本相同,则可以共享使用相同的依赖和函数库;如果依赖的函数库和依赖版本不同,那么它们之间就会产生很大的冲突,极其容易产生兼容性问题。而且这还只是开发环境,还有生产环境,测试环境等等,那么要处理的问题也会异常的多。
2. Docker是如何解决依赖兼容问题的?
Docker 为了解决上面说到的依赖兼容问题,采取了另外一种做法,如下图所示。
Docker会将项目需要用到的应用软件和这些应用软件运行时需要的依赖和函数库打成整体的一个包,将整个包一起运行。而且将每个应用放到不同的隔离容器中去运行,避免互相造成干扰。
3. 众多Linux操作系统发行版的区别
我们知道,Linux操作系统有众多的发行版,如下图所示,较为常用的有CentOS,Ubuntu。它们的操作系统核心内核都是Linux内核,只是系统应用层不太相同,系统应用运行时是通过函数库调用内核,内核再通过指令调用计算机硬件从而实现整个应用的运行。
所以也就是说众多Linux操作系统的发行版最大的区别就是调用Linux内核的指令(也可以说是函数库)略有不同。
4. Docker 是如何实现跨系统运行的?
Docker 不仅利用容器隔离技术实现了多应用同时运行且互不干扰,还实现了可以在不同的系统上运行的效果。
刚才在第三点,我提到了不同的Linux发行版所依赖的函数库不同,所以一个Redis应用在CentOS上可以正常运行,但如果到了Ubuntu上就不一定能正常运行了。
Docker为了实现跨系统,它采用了一种做法,就是将各种应用运行调用Linux操作系统内核的函数库跟着这些应用需要的依赖一起打包。
如下图所示,当我们去操作MySQL时,我们调用对应的指令,因为我们将MySQL对应的函数库也一起打包了,所以MySQL在调用Linux内核时,就不需要再经过系统应用,可以使用Docker打包好的函数库直接调用内核,越过了系统应用这一层,从而实现了Docker跨系统运行的问题。
5. Docker与虚拟机的差别
平常我们在自己学习的过程中,想要模拟 Linux 操作系统,通常都会在我们自己的 Windows 系统上安装一个虚拟机,然后在虚拟机中安装不同版本的 Linux 系统。
而 Docker 与虚拟机是有很大的差别的。如下图所示
Docker 在运行应用时,直接通过调用已经封装好的函数库调用系统内核,再由系统内核调用计算机硬件,从而完成应用的一系列操作。
而我们安装的虚拟机,是通过一种Hypervisor的技术(这里了解即可)在我们的 Windows 系统中又安装了另外的一个系统,当想要运行某个应用时,该应用会先调用虚拟机内部的函数库,再由函数库调用内部的操作系统,内部操作系统通过虚拟机技术调用外部 Windows 操作系统,外部 Windows 操作系统再调用计算机硬件,层层传递,系统中套系统,系统调用系统,效率是比较差的。
除了上面系统调用层面的不同,Docker与虚拟机的硬盘占用也有很大区别,虚拟机通常都是GB起步,而Docker只是对函数库和依赖做了一些封装,通常都是软件一样大小,小的甚至只有几MB;Docker 与虚拟机的启动速度也是不同的,虚拟机等于是一台新的电脑,通常要分钟级别,而Docker通常都是秒级别。
6. 镜像(Image)与容器(Container)
镜像(Image):将应用程序及其所需的依赖,函数库,环境,配置文件等打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,一个镜像可以产生多个容器。只是 Docker 会给容器做隔离,对外不可见。
如下图:有一个 MySQL5.7 的镜像,这里要知道一点,镜像都是只读的,因为如果有多个容器同时对镜像操作,会对镜像造成污染,所以各个容器当想要写数据的时候,会复制一份数据到自己的容器中操作,包括data数据文件和log日志文件,这样一来即便后续有新的容器创建,还是一个全新的镜像,可以任意操作,非常方便。
7. DockerHub
说到 DockerHub,相比我们也能联想到 GitHub,DockerHub 是一个镜像托管平台。
我们通常也可以称为Docker Registry(Docker 仓库)。在国内,也有类似的 Docker Hub 的公开服务,例如 阿里云镜像服务,网易云镜像服务等...上面有很多不同版本的已经封装好的各种应用的镜像,当我们想要使用的时候,可以拉取下来直接使用。
8. Docker 架构
Docker 是一个CS架构的程序,由两部分组成。
服务端(Server):Docker守护进程,负责处理Docker指令,管理镜像,容器等;
客户端(Client):通过命令或 RestAPI 向Docker服务端发送指令。可以在本地也可以在远程向服务端发送指令;
9. Docker 基本操作
在 Linux 操作系统中安装成功 docker 之后,我们就可以通过如下命令操作 docker 了。
(这里补充几点:各位同学可以使用虚拟机安装docker,也可以使用云服务器,我直接使用我已经有的云服务器了,各位同学完成安装之后,记得配一下加速镜像,因为docker默认采用的国外,我们配置到国内,首选阿里云,这一点与 maven 很相似;另外如果采用的是虚拟机,请关闭防火墙!关闭防火墙!关闭防火墙!否则极有可能拉取镜像失败。主要这两点普遍容易忽略,所以需要注意,如有其它问题可以自行上网搜寻)
systemctl stop firewalld:此次启动关闭防火墙;
systemctl disable firewalld:永久关闭防火墙,以后开机防火墙也是关闭状态;
systemctl status firewalld:查看防火墙状态;
systemctl start docker:启动 docker;
systemctl stop docker:停止 docker;
systemctl status docker:查看docker 状态
docker images:查看本地所有 docker 镜像;
docker -v:查看 docker 版本;
docker --help:查看所有 docker 命令;
命令展示如下图所示:
docker 拉取应用镜像有一个通用命令公式,即 docker pull [repository]:[tag]
repository 就是想要拉取的镜像名称,tag 就是镜像的版本,如果不写默认就是 latest 最新版;
如下演示拉取 nginx 镜像
docker pull nginx:拉取nginx镜像到本地,nginx后面还可以跟版本号,如果不写默认就是最新版;
docker rmi [repository]:[tag]:删除一个指定镜像;
如下图所示,拉取完成 nginx 完成,再使用 docker images 查看,可以看到 nginx 镜像已经存在了;
关于 docker 的命令,也不必死记硬背,需要哪个命令,直接上网搜索即可,但建议把常用的几个命令还是记下来的好;