一、为什么需要Docker
3个痛点:一致性、重复性和时效性。
1、开发人员开发完成之后上线到正式环境,程序在本地环境或开发环境能够运行,但在正式环境运行失败。原因是由于Linux、mysql、redis、es、java、php等组件的版本和依赖与开发环境不同,或者组件的配置信息不同导致。运维很难在正式环境上部署和开发环境一样的环境而没有任何遗漏。
2、运维人员即使按照开发环境的软件版本和配置在正式环境搭出一套一样的正式环境,但正式环境必然是一个多集群环境。运维人员不可能一个个机器重复搭建环境。
3、线上环境运行中,可能需要对集群扩容和缩容。如果请求量瞬间提升,运维人员无法在短时间(秒级)内立刻部署出多个和集群环境相同的机器并加入到集群中。
这3个问题本质上是一个系统移植问题。docker的出现就是为了解决这几个问题。
docker是一个实现系统平滑移植的容器虚拟化技术 ,通过将操作系统发行版、系统环境和系统中所有软件打包为镜像再迁移到其他机器,达到应用程序无缝跨平台移植的目的。
二、虚拟机和容器比对
虚拟机是指在主机上通过虚拟机管理程序模拟出另一台完整的主机(包含应用程序和操作系统、以及虚拟机虚拟出来的CPU、内存等硬件)。
虚拟机技术是通过虚拟机管理程序(Hypervisor)虚拟出一套硬件后,在这套虚拟的硬件上运行一个完整的操作系统(称为客户机操作系统,Guest OS),虚拟机中的应用程序在客户机操作系统上运行,而客户机在宿主机操作系统(Host OS)运行,从而实现应用程序的隔离。
容器技术则是在隔离应用程序的基础上,让它们直接运行在主操作系统(Host OS)的内核上,容器内没有自己的内核(但使用宿主机内核)也没有进行硬件虚拟,因此容器的体量比虚拟机要轻。
每个容器之间互相隔离,有自己独立的文件系统,容器之间进程不互相影响,能区分计算资源。
虚拟机和容器的相同点:
都能实现应用的隔离。
虚拟机和容器的不同点:
虚拟机和容器相比多了一层自己的操作系统,称为客户机操作系统(Guset OS),虚拟机的应用软件要运行在虚拟机自己的操作系统上,而容器的应用软件运行在主操作系统(Host OS)上。因此虚拟机比docker要重很多。
多一层操作系统会有什么影响:
1、虚拟机多一个操作系统,则需要多占用一个操作系统镜像的磁盘空间,大概4~7G。在主机上装3个虚拟机就会占用十几二十G的磁盘空间;
2、启动一个完整的操作系统需要执行系统引导程序,将操作系统程序载入内存并运行,意味着我们启动虚拟机上的某个应用,就要等上开机时间那么长的时间;
3、客户机操作系统本身运行也需要开销,例如操作系统对进程的调度、对内存的分配和管理、操作系统内核进程需要常驻内存,这些CPU和内存资源都是主机提供给客户机的。本来这些资源可以用应用程序的开销上,现在却有很大一部分用在了虚拟机的操作系统运行上。
最后,即使Docker和虚拟机相比有这么多优点,并不意味着虚拟机会被淘汰。虚拟机适合分隔用户,将一个主机分割为完整独立的多个主机给多个用户使用,而轻量级的Docker适合分隔应用。
docker为什么比虚拟机快
1、docker比虚拟机的抽象层更少,更轻量
docker不需要像Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用实际物理机的硬件资源。因此在CPU、内存利用率上docker更高。
2、docker使用宿主机操作系统,无需加载额外的虚拟操作系统
docker避免引导、加载操作系统内核启动,该过程是分钟级别的。docker由于直接利用宿主机的操作系统内核,因此新建一个docker容器只需要几秒钟。 而且少运行一个操作系统就较少了相应OS的开销。
三、Docker应用场景
隔离应用。
通过打包系统环境(简易的系统而非完整系统)和应用程序镜像做到快速扩容和缩容。
四、Docker的基本组成3要素
镜像、容器和仓库。
用面向对象来类比,镜像就相当于一个类、容器相当于用类new出来的实例,仓库是存储镜像的地方。
镜像(Image)本质是一个文件,是一个只读的模板,可以用来创建docker容器,一个镜像可以创建多个容器。
容器(Container)用来真实运行应用,是一个虚拟化的运行环境,容器可以被启动、停止和删除。容器之间相互隔离,保证应用程序的安全性。容器 = 简易版Linux环境(只包含最基本的OS功能) + 应用程序。
仓库(Repository)是存储镜像的地方,分为公开库 和 私有库,最大的公开仓库是 Docker Hub,国内的公开仓库包括阿里云、网易云等。
Docker架构图
Docker是一个C/S结构,Docker 客户端通过TCP连接访问运行在主机上的Docker 守护进程。
docker build 可以将主机上的服务打包成镜像存到本地。
当需要创建一个容器时,如果镜像在本地,则直接docker run创建容器实例。如果镜像不在本地,则可以docker pull将镜像从远程仓库拉取到本地,再docker run。如果docker run一个本地仓库不存在的镜像,则run命令也会先从远程仓库拉取镜像再生成容器。
如下所示为 docker run 的工作流程:
五、docker的yum安装
官网安装教程:
https://docs.docker.com/engine/install/centos/
# 安装依赖
yum -y install gcc gcc-c++ yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
docker version
# 运行hello world容器
docker run hello-world
# 关于卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd