传统服务部署方式
手动部署-->脚本部署 (单服务机)
新型自动化部署
自动化部署(批量)
1.容器
容器:装东西的器皿
特点:
- 可完全封闭
- 可移动
- 可拆卸
2.传统虚拟化和容器的区别
虚拟化分类:
- 主机级虚拟化
- 全虚拟化
- 半虚拟化
- 容器级虚拟化
容器分开的资源:
- UTS主机名和域名
- Mount文件系统挂载树
- IPC
- PID进程树
- User
- Network
//查看内核
[root@node0 ~]# uname -r
4.18.0-193.el8.x86_64
3.linux容器技术
Linux容器其实并不是什么新概念。最早的容器技术可以追遡到1982年Unix系列操作系统上的chroot工具(直到今天,主流的Unix、Linux操作系统仍然支持和带有该工具)。
4.Linux Namespaces
命名空间(Namespaces)是Linux内核针对实现容器虚拟化而引入的一个强大特性。
namespaces | 系统调用参数 | 隔离内容 | 内核版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.6.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 挂载点(文件系统) | 2.4.19 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
5.CGroups(控制组)
对共享资源进行隔离,限制,审计。
CGroups限制资源有:
- blkio:块设备IO
- cpu:CPU
- cpuacct:CPU资源使用报告
- cpuset:多处理器平台上的CPU集合
- devices:设备访问
- freezer:挂起或恢复任务
- memory:内存用量及报告
- perf_event:对cgroup中的任务进行统一性能测试
- net_cls:cgroup中的任务创建的数据报文的类别标识符
控制组的功能有:
- 资源限制
- 优先级
- 资源审计
- 隔离
- 控制
安装docker后,通过修改该目录文件来限制docker应用资源
[root@localhost ~]# ls /sys/fs/cgroup/memory/
6.LXC(LinuXContainer)
LXC(LinuX Container)把容器技术做得更加易用,把需要用到的容器功能做成一组工具,从而极大的简化用户使用容器技术的麻烦程度。
由于需要学习LXC一系列的命令工具,且批量数据迁移困难隔离性差,普及难度也很大
docker的出现则是优化版LXC
7.docker基本概念
容器技术的前端工具,docker将其简化并普及
从操作系统功能上看,docker底层依赖的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。
自docker 0.9版本起,docker除了继续支持LXC外,还开始引入自家的libcontainer,试图打造更通用的底层容器虚拟化库。如今的docker基本上都已经是使用libcontainer而非LXC了。
项目封装镜像上传网络仓库-->下载本地-->基于镜像启动容器
7.1docker工作方式
docker采取在一个容器内只运行一个进程,比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。
docker的特点
- 删除一个容器不会影响其他容器
- 调试不便,占空间(每个容器中都必须自带调试工具,比如ps命令)
- 分发容易,真正意义上一次编写到处运行,比java的跨平台更彻底
- 部署容易,无论底层系统是什么,只要有docker,直接run就可以了
- 分层构建,联合挂载
++在容器中有数据称作有状态,没有数据称作无状态。在容器的使用中,我们应以有状态为耻,以无状态为荣。数据不应该放在容器中,而应放置于外部存储中,通过挂载到容器中从而进行数据的存储。++
8.docker容器编排
为解决项目依赖关系安装顺序的问题,在docker基础上能将应用程序之间的依赖关系、从属关系、隶属关系等等反映在启动、关闭时的次序和管理逻辑中,这种功能被称为容器编排
常见容器编排工具
- machine+swarm(把N个docker主机当一个主机来管理)+compose(单机编排)
- mesos(实现统一资源调度和分配)+marathon
- kubernetes --> k8s