如果说docker就不得不提一下虚拟化,docker本身就是虚拟化的一种实现方式。先说虚拟化,虚拟化的诞生由来已久,这里就不再过多的讲述,只简单地说一下虚拟化的目的,虚拟化本身被提出就是为了解决硬件资源过多而浪费的这样一种情况,因此,虚拟化本身就是为了将底层硬件资源整合,切分,抽象为一种可以切割的硬件资源,以方便充分利用的一种技术。
虚拟化技术可以这么尝试去划分,硬件全虚拟化,硬件半虚拟化,软件虚拟化。为何要如此划分呢?首先要进行虚拟化,那就要对底层硬件进行整合,而这正是操作系统的功能之一。因此,首先在一台计算机构建一个操作系统来整合资源是不可缺少的。
当然现如今的大多数操作系统都是为了运行各种应用程序,所以操作系统的核心是应用为中心,更多去考虑提升效率,优化性能,提升兼容性。对于虚拟化,虽说也有支持,但不能于专业的专门用于虚拟化的系统相提并论。
但是,这种系统级别虚拟化也有一个问题,那也之前说到的,资源没有充分利用,因为系统级别的虚拟化虚拟出来的是硬件资源,我们为了利用这些虚拟的硬件资源,需要在上面再构建自己的操作系统,这无疑是非常愚蠢的,操作系统本身就需要浪费极大资源。
那么,有没有一种技术,不需要我们基于虚拟的硬件资源构建新的操作系统,又能够完成现代操作系统以应用为核心,运行各种应用的技术呢,那就是容器技术。
容器技术实际上是一种虚拟化技术。通过虚拟化提供一个服务运行的基本环境,将这个特定的服务运行于其中,这就叫一个容器。当然为了虚拟的这些环境能够正常运行,我们需要将该服务使用的这些虚拟环境与宿主机的环境分隔开,这叫隔离。我们通常来说使用容器会用到以下六种隔离类型:
- MNT Namespace:提供磁盘挂载点和文件系统的隔离
- IPC Namespace:提供进程间通信的隔离能力,包括信号,消息队列,共享内存
- TUS Namespace:提供主机名以及域名的隔离能力
- PID Namespace:提供进程隔离能力
- NET Namespace:提供网络隔离能力,包括网络设备,网络栈,端口等
- USER Namespace:提供用户与组的隔离能力(这一项技术在linux内核的3.8之后版本支持)
当然,隔离完成后,我们需要做的就是构建容器内的环境,这一步非常繁琐,这也是容器技术早些年没有火起来的最重要原因。直到docker提出镜像这一概念。
我们提前将某个服务需要运行的环境与应用本身打包成一个压缩文件,这样,我们通过一些简单的命令就可以完成读取这个压缩文件,完成整个环境的部署,并将应用在这个环境中运行,成为一个容器。
这里还有一问题,上面那么多的隔离类型,这些类型都是由内核管理的,那为什么不直接隔离内核呢?
隔离的本质还是虚拟化,一旦隔离内核,我们就需要为新的环境虚拟一个内核,这样的话又和主机级别的虚拟化有什么区别呢,浪费硬件资源。
为了避免虚拟化内核,我们就需要多个容器共享一个内核,因此容器相对于主机虚拟化来说,隔离不是非常彻底,这也是容器的一个弊病。各个容器中操作系统版本,类型可能不相同,但内核是相同的。具体内核和操作系统区别这里就不再过多阐述。
常见的容器服务:
- LXC:LXC启动容器需要模板,但制作模板比较困难,需要自己一步步步创构建文件系统、准备基础目录及可执行程序等,而且在大规模使用容器的场景很难横向扩展,另外后期代码升级也需要重新从头构建模板。
- Docker:Docker先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。
- Pouch :起源于 2011 年,并于2017年11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于 Apache 2.0 协议的容器技术 Pouch。Pouch 是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率
- Podman:Podman是一个 为 Kubernetes 而生的开源的容器管理工具,未来再聊k8s我们再谈
为了容器能够更好的发展,Linux 基金会、Docker、微软、红帽谷歌和、IBM、等公司在2015年6月共同成立了一个叫Open Container Initiative(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了两个规范,分别是runtime spec和 image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
runtime:运行时,也就是真正去部署环境,管理容器的组件常见的有以下几种
- Lxc:(早期docker使用的)linux上早期的runtime,在 2013 年 Docker 刚发布的时候,就是采用lxc作为runtime, Docker把 LXC 复杂的容器创建与使用方式简化为 Docker 自己的一套命令体系。随着Docker的发展,原有的LXC不能满足Docker的需求,比如跨平台功能
- Libcontainer:随着 Docker 的不断发展,重新定义容器的实现标准,将底层实现都抽象化到Libcontainer 的接口。这就意味着,底层容器的实现方式变成了一种可变的方案,无论是使用namespace、cgroups 技术抑或是使用 systemd 等其他方案,只要实现了 Libcontainer 定义的一组接口,Docker 都可以运行。这也为 Docker 实现全面的跨平台带来了可能。
- runc:(目前docker默认)早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范
- rkt:是CoreOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容器
接下来,我们就可以正式认识docker了。https://www.docker.com/这是docker的官方网站。
首先是docker的安装,docker有两种,一种是社区版dcoekr-ce,一种是企业版docker-ee(收费)。通常来说会使用社区版版,毕竟免费最香。
本次演示基于centos7的环境
首先安装docker方式很多,二进制安装,下载rpm包安装,yum源安装,这里我们只讲解yum安装
yum安装需要构建yum源,由于官方yum源速度较慢,因此可以选择国内的源进行安装
https://mirrors.huaweicloud.com/home
https://developer.aliyun.com/mirror/docker-ce
上面是两个国内源,可以下载docker仓库
配置yum源结束后使用以下命令安装
yum install -y docker-ce
docker安装完成以后可以通过下面这条命令启动docker,并添加为开机自启
systemctl enable --now docker
docker启动一个容器需要镜像,默认会到国外的镜像仓库去下载运行容器所需要的镜像,这个速度非常慢,因此配置一个加速器就非常重要了。阿里华为都有,每个人使用的镜像加速器地址可能不太一样,因此不建议直接使用别人的。
阿里云:搜索容器镜像服务,在容器镜像服务中可以找到镜像工具,点开里面有一个镜像加速器,点进去就可以获得自己的加速器地址
华为云:登陆控制台,搜索容器镜像服务,进去之后点击镜像资源,再点击镜像中心,就可以看到一个镜像加速器,点开就可以获得自己的加速器地址。(PS:我个人更加倾向于华为)
https://console.huaweicloud.com/
使用以下命令为docker添加加速器,并且重新启动。
tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["将引号内的内容换成自己的加速器地址"]
}
EOF
systemctl restart docker
如果之前没有启动过docker,下面命令可能会报错,因为docker文件夹不存在,执行以下命令后再一次执行上面这一条命令即可
mkdir /etc/docker
以上步骤都完成的话就可以使用docker了,docker命令以及具体使用将在下一篇进行讲解