1.什么是Docker?

Docker由dotCloud公司于2013使用go语言实现的开源容器项目。Docker作为容器化代表允许让开发者可以打包项目以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何影响。

我们可以将Docker容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器可以通过网络相互通信。容器的创建和停止十分快速,几乎跟创建和终止的原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,我们甚至直接把容器当作一个应用本身也没有任何问题。

2.Docker与虚拟化

2.1.为什么需要虚拟化

主机时代比拼的是单个服务器物理性能(如CPU主频和内存)的强弱,而在云时代最看重的是凭借虚拟化技术所构建的集群处理能力。

2.2.虚拟化的定义

虚拟化(Virtualization)技术是一个通用的概念,在维基百科是这样定义的:
在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储
虚拟化的核心是对资源的抽象、目标往往是为了在同一主机上运行多个系统或应用,从而提高系统资源的利用率,并带来降低成本、方便管理、容错容灾等好处。

虚拟化技术大致上可以分为基于硬件的虚拟化和基于软件的虚拟化。基于硬件的技术化技术并不多见,少数如网卡的单根多IO虚拟化等技术。基于软件的虚拟化技术解决方案有很多,例如:VMware、Workstation、Docker等等。而容器技术则更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。因此有人容器技术成为”新一代的虚拟化”技术,并将基于容器打造的云平台亲切的称为”容器云”,而Docker就是众多容器技术的佼佼者

2.3 Docker和传统虚拟化方式的不同

上面说了虚拟化技术大致可分为基于硬件的虚拟化和基于软件的虚拟化,而基于软件的虚拟化从对象所在的层次,有可分为应用虚拟化和平台虚拟化。应用虚拟化一般是指一些模拟设备或诸如Wine这样的软件,而平台虚拟化又可以细分为以下几个子类:

(1)完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如IBM p和z系列的虚拟化、VMware Workstation、VirtualBox、QEMU等;
(2)硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如VMware Workstation, Xen, KVM;
(3)部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化;
(4)超虚拟化(paravirtualization)。部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen;
(5)操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。

Docker以及其他容器技术都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。

Docker和传统虚拟化方式的不同之处如下图:
2020-08-06_5f2b2c93947db.png

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

3.为什么需要Docker?

(1).软件更新发布及部署低效,过程繁琐且需要人工介入。
(2).环境一致性难以保证。应用开发一般分为开发环境和生产环境,往往开发环境跟生产环境有所差异,光项目的所需要的环境配置起来都很繁杂
(3).不同环境之间迁移成本太高。假设有一个项目部署在A服务器上,有一天出现了问题需要将项目移植到B服务器上,在移植前需要保证B服务器提供项目运行所需要的环境,这个过程是比较繁杂费时费力的,可能还会影响项目的运行

4.Docker在开发和运维中的优势

(1).更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试、部署的大量时间。并且,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

(2).更高效的资源利用。运行Docker容器不需要额外的虚拟化管理程序(Virtual Machine Manager, VMM,以及Hypervisor)的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。与传统虚拟机方式相比,Docker的性能要提高1~2个数量级。

(3).更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。

(4).更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

5.Docker与虚拟机的比较

(1).Docker容器效率高。启动和停止可以在秒级实现,这笔传统虚拟化方式(数分钟)快很多
(2).Docker容器对系统资源需求少。一台主机上可以同时运行数千个Docker容器
(3).Docker管理方便。Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,支持增量更新
(4).Docker扩展性更强。Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提供工作效率,并标准化流程

Docker容器技术与传统虚拟机比较表格如下:

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生应用 较弱
内存代价 很小 较多
硬盘使用 一般为MB 一般为GB
运行密度 单机支持运行数千个容器 一般几十个
隔离性 安全隔离 完全隔离
迁移行 优秀 一般

6.安装Docker

Docker官网是:https://www.docker.com/,Docker cli命令行文档地址:https://docs.docker.com/engine/reference/run/

6.1 centos8安装Docker

centos8安装docker内核必须是3.1或以上。不然会导致安装失败

  1. #查看内核版本,如果内核版本低于3.1,那么就需要升级内核
  2. uname -r
  3. 使用rpm升级内核:
  4. #安装key
  5. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  6. rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
  7. #yum安装内核包,Kernel-lt是长期维护版一般选这个,Kernel-ml是Linus亲自维护的主分支版本
  8. yum --enablerepo=elrepo-kernel install kernel-ml -y
  9. #安装后查看内核列表,一般最新的版本都是在列表第一个位置
  10. egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d '
  11. #设置内核列表中第一个内核为默认启动内核,这样在启动机器时不需要我们在去选内核版本启动了
  12. grub2-set-default 0

安装docker:

#如果你之前安装了较旧的Docker,首先卸载它,较旧的Docker版本称为docker或docker-engine
sudo yum remove docker 
docker-client 
docker-client-latest 
docker-common 
docker-latest 
docker-latest-logrotate 
docker-logrotate 
docker-engine
#安装yum-utils软件包(提供yum-config-manager 实用程序)
sudo yum install -y yum-utils
#设置稳定的存储库,下面是使用的是阿里源
#https://download.docker.com/linux/centos/docker-ce.repo(官网源)
#http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里源)
#https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo(清华大学源)
sudo yum-config-manager 
--add-repo 
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
#查看docker版本列表。如果你想安装制定docker版本,那么可以使用yum排列出来,此示例按版本号(从高到低)对结果进行排序,并被截断
yum list docker-ce --showduplicates | sort -r
#开始安装指定版本,VERSION_STRING就是你要安装的docker版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#启动docker
sudo systemctl start docker
#停止docker
sudo systemctl stop docker
#如果你不想每次开机都启动docker,那么你可以设置开机自动启动docker
systemctl enable docker
#测试docker Engine是否安装成功。运行hello-world镜像测试docker Engine是否安装成功
sudo docker run hello-world

为了加快docker镜像下载速度,设置阿里云镜像源:
(1).编辑/etc/docker/daemon.json,没有就新建

vim /etc/docker/daemon.json

(2).加入以下内容:

{ "registry-mirrors": ["https://73xomdvb.mirror.aliyuncs.com"] }

(3).重启守护程序

sudo systemctl daemon-reload

(4).重启docker

sudo systemctl restart docker