1.概述
最近学习了Docker的使用,想通过一个系列的笔记来记录学习的过程与收获,并为以后的生产工作提供指导。
我一直认为学习一门技术时,需要先了解这门技术的基本概念,了解它能解决的问题,这样才能定位明确的学习目标,学以致用。同时,在运维技术中需要使用到的中间件与各类技术设施,都需要亲手安装使用,理论与实践结合起来,才能帮助我们理解这门技术,用好这门技术。
本篇是这个系列笔记中的第一篇笔记,记录的就是Docker中的基本概念与安装方法。
2.Docker中的基本概念
对于Docker的概念、使用教程、API文档,在《Docker官方文档》中都可以找到,有一定英文能力的同学,推荐直接跳转阅读原汁原味的官方文档。
本篇以下的内容是参考官方文档结合自身的理解来总结出的笔记,对官网中没有写到一些小细节做了一点补充。
2.1. 什么是Docker
在我学习Docker之前,经常听到这么一种说法,说Docker是一种容器,这种说法不能说是错的,但是没有描述完整,我们可以从多个角度来看Docker到底是什么。
- 从程序的角度来看,容器就是包含了程序运行所需环境的轻量级虚拟服务器,而Docker是一种容器化技术。
- 从使用者的角度看,Docker是一种可以帮助我们更加轻松的完成程序安装部署的工具。
从Docker本身来看,它是一个用于传输、存储、部署、运行应用程序的综合开放平台,它既是一个服务,也是一个工具。
2.2.Docker的作用
Docker容器中包含了程序运行的一切,也就是说,一旦我们按照Docker提供好的流程构建了程序,我们将不再需要担心,由于不同服务器中对于应用程序运行所需依赖的文件、环境变量不同,而造成的各种异常、报错等问题,直接运行Docker就可以轻松的得到一个可正常使用的应用程序。
由于Docker容器有良好的移植性,我们可以使用别人已经构建好的image镜像文件,快速的安装应用程序,如分布式中间件中的Redis,MQ,ES等等。
同时,我们也可以将自己的服务打包之后,做成image,以供在各个环境中运行。
也就是说,使用Docker会显著的降低运维工作的繁琐程度与困难程度,让开发人员也可以参与到业务相关的运维工作中,也是实现DevOps
的基础。(当然,容器化技术并不只有Docker这一种,只是Docker更具代表性)
2.3.Docker的组成
与多数的中间件架构一样,Docker也是C/S架构,包含客户端与服务端,安装完成Docker之后,我们可以在任意一台与Docker服务端网络连通的机器上,使用Docker客户端进行操作。
下面是一张官网的架构图:
接下解释一下,架构图中各个组成部分以及操作代表的含义。
2.3.1.Client
Docker的客户端,以调用API的形式,向Docker的服务端发送请求,上图中的3个API的作用分别是:
docker build
:构建镜像文件docker pull
:拉取镜像文件docker run
:使用镜像文件,生成Docker 容器
2.3.2.Docker Daemon
Docker的守护进程,主要做两件事:
- 监听由客户端发送过来的请求,按照请求的内容,指挥服务端中的其他Docker组件处理。
- 与其他Docker服务端的守护进程通信,协调多个不同服务器上的容积进行协同工作。
2.3.3.Images
Docker的镜像文件,可以理解为创建Docker容器的模板,如果用Java
来进行类比的话,image就相当于Java
中的类。在绝大对数情况下,一个镜像文件除了本身需要运行的应用程序之前,还包含其他的镜像(思考一下为什么)。
以一个简单的例子来解释,假如我们现在需要构建一个可运行的SpringBoot
应用,按照传统的方式,我们需要:
- 准备一台服务器
- 在这台服务器上安装Java环境
- 将
Springboot
打包成一个jar
,复制到服务器中运行
上面这三步是应用运行必不可少的,现在我们换成Docker的方式也是一样的,我们也需要三步:
- 构建一个服务器镜像
- 以这个服务器镜像为基础,构建一个包含了Java环境的服务器镜像
- 以这个Java环境镜像为基础,构建一个
SpringBoot
应用程序镜像
Docker的优势在哪里?
对比一下发现,这两种方式不是一样的吗,都是需要这么多步骤,Docker的优势在哪里呢?
其实两者的区别是在于,使用Docker的方式,并不需要每次构建SpringBoot
应用程序镜像的时候,都完整的执行者三个步骤,前面的两个步骤执行了一次之后,获取到的镜像是可以重复使用的。也就是说,如果我们继续迭代了这个服务,想重新部署一个新的版本,只需要做第三步,就可以获取到一个新版本的应用程序镜像。
同时,如果服务需要做扩展,相比于使用传统方式增加服务器,需要在服务器中重复繁琐的搭建工作而言,使用Docker的方式,一旦我们构建完成了可执行的应用程序镜像,就可以在任意一个有Docker服务端的服务器中直接运行了。
更进一步说,前面的两步所构建的镜像,我们甚至可以直接从在Docker的镜像仓库中下载,对于这种基础环境类型的镜像,在镜像仓库中可以很容易找到。
2.3.4.Registry
Docker的镜像仓库,类似于Maven远程仓库,我们可以在这个仓库中找到官方或其他开发者上传的镜像,直接拉取使用,也可以将我们自己构建好的镜像上传到仓库中。
Docker Hub是官方镜像仓库,而我们生产中可能会使用国内云厂商的镜像仓库,如阿里云、腾讯云等。
Docker Hub地址:https://hub.docker.com/
2.3.5.Containers
Docker容器,由运行镜像文件生成,如果将Image看作是Java
中的类的话,Container就可以看作是Java
中的对象。
使用docker run
指令生成容器,映射好主机与容器中的虚拟服务器之间的端口关系之后,我们就可以正常的访问应用程序了。
3.Docker的安装
Docker Desktop具有图形化的界面,可以在具有图形化界面的操作系统中使用,例如:MacOS、Windows、Ubantu等,可以参考官方文档下载安装包进行安装, Docker Desktop下载
需要注意的是,如果已经在Windows上安装了VMware虚拟机,再安装Windows版本的Docker Desktop的话,有可能会因为两者不兼容导致虚拟机无法启动。
Docker有个人版和企业版,分别对应 docker ce 与 docker ee ,这里我们选择安装docker ce
如果已经有了Centos服务器,推荐使用以下方法。
第一步:安装yum工具,并配置docker的repository地址。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
这里建议配置为阿里云的镜像,加速下载。
因为不让挂外链,这里阿里云的仓库地址只有放个截图在这里了。
第二步:安装docker ce
sudo yum install docker-ce
按照提示步骤进行安装,完成之后执行:
docker version
第三步:Docker启动与验证
sudo systemctl start docker
sudo docker run hello-world
当看到Hello from Docker!
时,表示Docker已经安装成功并可以正常运行。但是服务器重启之后,又需要再次手动启动Docker服务,非常麻烦,所以我们还需要配置Docker的开机启动。
sudo systemctl enable docker
4.总结
本篇先描述了Docker的基本概念,了解Docker的架构组成与各个组件的作用,然后演示了如何在Centos中使用yum安装Docker服务。
现在基础设施已经完备了,接下来就是我们如何通过客户端的API来使用Docker,接下来的几篇文章会以循序渐进的搭建一个SpringBoot
的运行环境为例,通过具体的操作来熟悉Docker的API指令。