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客户端进行操作。

下面是一张官网的架构图:

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卸载 容器 docker如何卸载_容器_02


因为不让挂外链,这里阿里云的仓库地址只有放个截图在这里了。


第二步:安装docker ce

sudo yum install docker-ce

按照提示步骤进行安装,完成之后执行:

docker version

docker卸载 容器 docker如何卸载_容器_03


第三步:Docker启动与验证

sudo systemctl start docker

sudo docker run hello-world

当看到Hello from Docker!时,表示Docker已经安装成功并可以正常运行。但是服务器重启之后,又需要再次手动启动Docker服务,非常麻烦,所以我们还需要配置Docker的开机启动。

sudo systemctl enable docker

4.Docker 卸载

安装错误或需要使用新版本时,可以尝试以下的方式删除服务器中的docker,此方式只适用与使用 yum 安装的docker。

第一步:清理Docker数据

关闭正在运行中的docker容器
删除docker容器
删除docker镜像
停止docker服务

清理脚本如下:

docker kill $(docker ps -q)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
systemctl stop docker

第二步:从yum卸载

查看yum中与docker有关的依赖

yum list installed | grep docker

docker卸载 容器 docker如何卸载_运维_04


查看到所有依赖之后,可以复制第一列的依赖名进行删除,但是这种方式比较麻烦,所以可以通过通配符删除所有以docker开头的依赖。

yum remove docker*

等待提示是否删除后,输入y并回车,删除完毕后,使用 docker -v 查看,如果没有版本号则表示删除成功。

5.总结

本篇先描述了Docker的基本概念,了解Docker的架构组成与各个组件的作用,然后演示了如何在Centos中使用yum安装Docker服务。

现在基础设施已经完备了,接下来就是我们如何通过客户端的API来使用Docker,接下来的几篇文章会以循序渐进的搭建一个SpringBoot的运行环境为例,通过具体的操作来熟悉Docker的API指令。