目录
第 1 章 Docker核心概念与安装
为什么使用容器?
Docker是什么
Docker设计目标
Docker基本组成
容器 vs 虚拟机
Docker应用场景
Linux 安装 Docker
第 2 章 Docker镜像管理
Docker 容器管理
Docker 容器数据持久化
Docker 容器网络
Dockerfile 定制容器镜像
Harbor企业级镜像仓库
Prometheus+Grafana监控Docker主机
基于Docker构建企业Jenkins CI平台
第 1 章 Docker核心概念与安装
- 为什么要用容器?
- Docker是什么
- Docker设计目标
- Docker基本组成
- 容器 vs 虚拟机
- Docker应用场景
- Linux 安装 Docker
为什么使用容器?
1. 上线流程繁琐
开发->测试->申请资源->审批->部署->测试等环节
2. 资源利用率低
普遍服务器利用率低,造成过多浪费
3. 扩容/缩容不及时
业务高峰期扩容流程繁琐,上线不及时
4. 服务器环境臃肿
服务器越来越臃肿,对维护、迁移带来困难
5. 环境不一致性
Docker是什么
- 使用最广泛的开源容器引擎
- 一种操作系统级的虚拟化技术
- 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
- 一个简单的应用程序打包工具
Docker设计目标
- 提供简单的应用程序打包工具
- 开发人员和运维人员职责逻辑分离
- 多环境保持一致性
Docker基本组成
容器 vs 虚拟机
Docker应用场景
- 应用程序打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品(平台即服务)
Linux 安装 Docker
Docker版本:
- 社区版(Community Edition,CE)
- 企业版(Enterprise Edition,EE)
支持平台:
- Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)
- Mac
- Windows
# 安装依赖包
yum install -y yum-utils
# 添加Docker软件包源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker
https://docs.docker.com/engine/install/centos/
官方文档:https://docs.docker.com
阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第 2 章 Docker镜像管理
- 什么是镜像
- 镜像从哪里来?
- 镜像与容器联系
- 镜像常用管理命令
- 镜像存储核心技术:联合文件系统(UnionFS)
- 镜像存储核心技术:写时复制(COW)
镜像是什么
镜像是什么?
•
一个分层存储的文件,不是一个单一的文件
•
一个软件的环境
•
一个镜像可以创建N个容器
•
一种标准化的交付
•
一个不包含Linux内核而又精简的Linux操作系统
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共镜像仓库,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com
配置镜像加速器:
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
镜像与容器联系
镜像:类似于虚拟机镜像,一个只读模板
容器:通过镜像创建的运行实例
镜像常用管理命令
镜像存储核心技术:联合文件系统(UnionFS)
镜像怎么高效存储?
难道像虚拟机那样一个容器对应一个独立的镜像文件?这样对于密集
型容器,磁盘占用率太大!
答:引入联合文件系统,将镜像多层文件联合挂载到容器文件系统
镜像存储核心技术:写时复制(COW)
了解联合文件系统后,我们知道,镜像是只读的,类似共享形式让多
个容器使用,如果要在容器里修改文件,即镜像里的文件,那该怎么
办呢?
答:引入写时复制(copy-on-write),需要修改文件操作时,会先
从镜像里把要写的文件复制到自己的文件系统中进行修改。
优化建议
- 使用SSD固态硬盘
- 使用卷作为频繁读写文件的工作目录,绕过存储驱动,减少抽象的开销
第 3 章 Docker容器管理
- 创建容器常用选项
- 容器资源限制
- 管理容器常用命令
- 容器实现核心技术:Namespace
- 容器实现核心技术:CGroups
- Docker核心组件之间关系
创建容器常用选项
容器资源限制
示例:
内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx
CPU限额:
允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx
管理容器常用命令
容器实现核心技术:Namespace
在容器化中,一台物理计算机可以运行多个不同操作系统,那就需要解决
“隔离性”
,彼此感知不到对方存在,有问题互不影响。
Linux内核从2.4.19版本开始引入了namespace概念,其目的是将特定的全局系统资源通过抽象方法使得namespace中的进程看
起来拥有自己隔离的资源。Docker就是借助这个机制实现了容器资源隔离。
Linux的Namespace机制提供了6种不同命名空间:
- IPC:隔离进程间通信
- MOUNT:隔离文件系统挂载点
- NET:隔离网络协议栈
- PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
- USER:隔离用户
- UTS:隔离主机名和域名
容器实现核心技术:CGroups
Docker利用namespace实现了容器之间资源隔离,但是namespace不能对容器资源限制,比如CPU、内存。
如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。
如何对多个容器的资源使用进行限制就成了容器化的主要问题。
答:引入Control Groups(简称CGroups),限制容器资源
CGroups:
所有的任务就是运行在系统中的一个进程,而 CGroups 以某种标准将一组进程为目标进行资源分配和控制。
例如CPU、内存、带宽等,并且可以动态配置。
CGroups主要功能:
- 限制进程组使用的资源数量( Resource limitation ):可以为进程组设定资源使用上限,例如内存
- 进程组优先级控制( Prioritization ):可以为进程组分配特定CPU、磁盘IO吞吐量
- 记录进程组使用的资源数量( Accounting ):例如使用记录某个进程组使用的CPU时间
- 进程组控制( Control ):可以将进程组挂起和恢复
ls /sys/fs/cgroup/ -l 查看cgroups可控制的资源:
- blkio :对快设备的IO进行限制。
- cpu:限制CPU时间片的分配,与cpuacct挂载同一目录。
- cpuacct :生成cgroup中的任务占用CPU资源的报告,与cpu挂载同一目录。
- cpuset :给cgroup中的任务分配独立的CPU(多核处理器)和内存节点。
- devices :允许或者拒绝 cgroup 中的任务访问设备。
- freezer :暂停/恢复 cgroup 中的任务。
- hugetlb :限制使用的内存页数量。
- memory :对cgroup 中任务的可用内存进行限制,并自动生成资源占用报告。
- net_cls :使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制程序(tc)可以识别来自特定从cgroup 任务的数据包,并进行网络限制。
- net_prio:允许基于cgroup设置网络流量的优先级。
- perf_event:允许使用perf工具来监控cgroup。
- pids:限制任务的数量。
容器实际资源限制位置:
/sys/fs/cgroup/<资源名>/docker/<容器ID>