环境配置的烦恼
- 软件开发最大的麻烦事之一,就是环境配置
- 相信每位编程初学者都会在环境配置上倒腾很久,而作为老师也会因为不同机器出现五花八门的环境配置问题而烦恼
- 想要软件正常运行,那么系统的设置和各种库、组件正确的安装才能如期运行
- 举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量
- 当你需要换机器的时候,你之前所配置的环境又要重头来一遍,非常麻烦
虚拟化技术出现后的应用部署方式
- 一个主机部署多个虚拟机,每个虚拟机可以部署多个应用
- 比如在 Windows 系统里面运行 Linux 系统的 VM
- 对于底层系统(主机)来说,虚拟机就是一个普通文件,不需要就删掉,对主机没有影响
虚拟化优点
- 资源池:一个物理机的资源分配到了不同的虚拟机
- 易扩展:添加物理主机或虚拟机
- 易云化:阿里云、AWS 提供虚拟化技术
虚拟化局限性
- 资源占用多:每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,物理主机本身消耗的资源势必增多
- 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录
- 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行
容器为什么会出现
- 上面也讲述了单机部署应用和虚拟机技术的局限性
- 容器的诞生就是为了解决这些局限性的
什么是容器
- 对应用软件和其依赖的包进行标准化打包
- 应用之间相互隔离
- 共享同一个 OSKernel
- 可以运行在很多主流操作系统上
- 可以理解成:标准化软件单元
容器解决了什么问题
- 解决了开发和运维之间的矛盾
- 在开发和运维之间搭建了一个桥梁,是实现 devops 的最佳解决方案
为什么 docker 比 vm 快
- docker 有着比虚拟机更少的抽象层
- docker 不需要 Hypervisor 实现硬件资源虚拟化
- 运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源
Docker 简介
- Docker 是一个开源的应用容器引擎,基于 Go 语言
- 可以打包应用以及依赖包到一 个轻量级、可移植的容器中
- Docker 打包好了的容器,可以发布到任何流行的 Linux 机器上,也可以实现虚拟化
- 容器是完全使用沙箱机制,相互之间不会有任何接口(独立)
- 容器性能开销极低
- Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器
- Docker 是实现容器技术的一种工具
- Docker 容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
工作中的应用场景
- Web 应用的自动化打包和发布
- 自动化测试和持续集成、发布(我们的重点)
- 组建微服务架构,通过多个容器,一台机器可以跑多个服务,因此在本机可以模拟出微服务架构
将软件打包到容器中,以进行开发,运输和部署
- 容器是打包代码及其所有依赖项的软件的标准单元,所以该软件可以从一个计算机环境快速可靠地在另一个计算机环境进行运行
- Docker 容器镜像是一个轻量级、独立的、可执行的软件包,它包含运行应用程序所需的一切:运行环境、系统工具、系统库、配置
- 容器镜像在运行时成为容器
- 容器化软件都可用于基于 Linux 和 Windows 的应用程序,始终运行相同
- 容器将软件与其环境隔离开来,即使存在差异,但软件仍然可以运行
在 Docker 镜像上运行的 Docker 容器的优势
标准
Docker 创建了容器的行业标准,因此它们可以在任何地方移植
轻巧
- 容器共享机器的操作系统内核,因此不需要每个容器都有完整的操作系统
- 容器本身没有自己的内核,也没有虚拟硬件
- 提高了服务器效率,并降低了服务器资源的消耗
隔离安全性
- 容器中的应用程序更安全,Docker 提供业界最强大的默认隔离功能
- 每个容器都是相互隔离,内部有属于自己的文件系统,互不影响
Docker 架构
仓库(Registry)
- 集中存放镜像文件的场所
- 每个镜像文件有不同的标签(不同的版本)
- 最大的开放仓库是Docker Hub: Docker Hub 存放了数量庞大的镜像供用户下载
- 国内的公开仓库包括阿里云,网易云等
- 仓库分为公开仓库( public )和私有仓库( private )两种形式
镜像(Images)
- 创建容器的模板
- 一个镜像可以创建很多容器
容器(Containers)
- 容器是镜像生成的运行实例
- Docker 利用容器独立运行一个或一组应用(服务)
- 每个容器之间是相互隔离的
- 它可以被启用、开始、停止、删除
主机(HOST)
- 一个物理机或虚拟机
- 用于运行 Docker 守护进程和多个容器
- 可存放多个镜像
- 也称为宿主机,node节点
Docker 守护程序(daemon)
- 监听 Docker API 请求
- 也会管理 Docker 对象,如:镜像、容器、网络、卷
- 守护程序还可以与其他守护程序通信以管理 Docker 服务
Docker 客户端(client)
- 客户端使用 Docker 命令或其他工具调用 Docker API
- 当然也可以在 HOST 直接敲 Docker 命令
- 客户端可以与多个 Docker 守护程序通信