前言
云计算三层架构
- IAAS 基础设施即服务
- 应用:硬件(服务器、网络设置、防火墙等)虚拟化、网络虚拟化(大二层)。例:openstack
- PAAS 平台即服务 环境
- 例:数据库、 docker 、kubernetes
- SAAS 应用即服务 应用
- 例:应用商店的应用
而Docker就是 PAAS 中的技术。
一、Docker 概述
1.1 Docker是什么?
- 是一个开源的应用容器引擎,基于GO语言开发并遵循了 Apache2.0 协议开源。
- 是在 Linux容器里运行应用的开源工具,是一种轻量级的 “虚拟机"
- Docker 的容器技术可以在一台主机上轻松 为任何应用创建一个轻量级的、可移植的、自给自足的容器。
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker图标:鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。
Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
因此,Docker 必须部署在 Linux 内核的系统上。
如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
除了 Docker 以外,还有 Rocket 、Containerd 等常用容器。
1.2 Docker 设计宗旨
Docker 的设计宗旨:Build、Ship and Run Any App、Anywhere。
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的 "一次封装,到处运行 "的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
容器化越来越受欢迎,因为容器是:
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可维叠:可以垂直和即时堆叠服务。
以前是把服务应用部署在物理机、虚拟机上的,现在是把服务应用部署在容器中。
容器是在 linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker 与 虚拟机(KVM)的区别(重点)
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级(相当于在宿主机启动一个进程) | 分钟级 |
计算能力损耗 | 几乎无 | 损耗50%左右(隔了一层操作系统,再模拟内核,损耗性能) |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 单机支持上千个容器 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
相同点:都是运行在宿主机上面的,
容器在内核中支持2种重要技术:
- docker本质就是宿主机的一个进程,docker是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制
- 通过写时复制技术(cop-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,
Linux 的六大命令空间 namespaces
- MNT 磁盘
- IPC 进程
- Net 网络
- UTS 主机
- PID
- User
docker 和 openstack 的区别
openstack 是 通过KVM创建的虚拟机
docker 通过 cgroup 实现资源限制,k8s 通过systemd 实现资源限制
1.3 Docker 核心概念
镜像
- Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker 容器引擎的只读模板。
- **通过镜像启动一个容器,**一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和 配置文件。
- Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
容器
- Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
- 可以把容器看做是一个简易版的Linux环境〈包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
容器共有两种状态:running 和 exited.
用户也可以用 docker commit 命令将一个容器压制为image,供后续使用。
容器的特点:
●灵活:即使是最复杂的应用也可以集装箱化。
●轻量级:容器利用并共享主机内核。
●可互换:可以即时部署更新和升级。
●便携式:可以在本地构建,部署到云,并在任何地方运行。
●可扩展:可以增加并自动分发容器副本。
●可堆叠:可以垂直和即时堆叠服务。
仓库
- Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push命令将它上传到公有仓库〈Public)或者 私有仓库(Private)。
- 当下次要在另外一台机器上使用这个镜像时,只需从仓库拉取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
目录下
1.4 文件系统(Docker 架构)
Linux文件系统 和 Docker文件系统:
Linux文件系统
- Linux文件系统 由 bootfs 和 rootfs 组成**,bootfs 主要包含 bootloader 和 kernel。**
- bootloader 主要是引导加载kernel,当kernel 被加载到内存之后bootfs就被卸载掉了。
- rootfs包含的就是典型Linux系统中/dev、 /proc、 /bin、/etc 等标准目录。
Docker文件系统:
- Docker 容器是建立在 Aufs 分层文件系统基础上的,Aufs支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种 layer的概念。每一层文件系统我们叫做一层 layer,Aufs可以对每一层文件系统设置三种权限:只读(read-only),读写(read-write) 以及 写出(whiteout-able)。
- docker 镜像中每一层文件系统都是 read-only。
传统的 Linux 加载 bootfs 时会先将 rootfs 设为 read-only,
然后在系统自检之后将 rootfs 从 read-only 改为 read-write,
然后我们就可以在 rootfs 上进行写和读的操作了。
同一个内核版本的所有Linux发行版本系统的bootfs是相同的,而rootfs则是不同的。
在Docker中,基础镜像中的roofs会一直保持只读模式,Docker 会利用 AUFS 来在这个rootfs上增加更多的只读文件系统,
最后它们看起来就像一个文件系统即容器的rootfs。
在Docker的体系里把这些read-only的rootfs叫做Docker的镜像。
由此可见在一个Linux系统之中:
- 所有Docker容器都 共享宿主机系统的 bootfs,即Linux内核;
- 每个容器有自己的 rootfs,它可以来自不同的 Linux 发行版的基础镜像,包括Ubuntu,Debian和 SUSE等;
- 所有基于一种基础镜像的容器都共享这种 rootfs
二、安装 Docker
目前Docker 只支持 64 位的操作系统。
安装方式:可以使用CURL获得Docker的安装脚本(get-docker.sh)进行安装(比较慢)、或者使用yum仓库在线安装。
首先在Linux中关闭防火墙,与增强安全功能。
systemctl stop firewalld.service
setenforce 0
安装 docker 依赖包,软件包,安装源
使用 yum 在线源
yum install -y yum-utils device-mapper-persistent-data lvm2
---------------------------
yum-utils:提供了 yum-config-manager 管理工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device