本文首发自公众号「LinuxOK」,ID为:Linux_ok,关注公众号第一时间获取更新,分享记录职场开发过程中所见所感。
Docker 是一个用 GO 语言实现的开源项目,它可以将应用程序和程序的依赖打包成一个镜像,镜像交付到用户手里可以直接运行,成为一个容器。每个容器都是一个瘦身过后的简易版本的 Linux,它相当于集装箱。
容器所处的环境(操作系统以及操作系统底层)相当于货船,程序的表现只跟容器有关,相当于集装箱内的东西只跟集装箱有关,跟集装箱所处的货船无关。
1、Docker 解决了什么问题
Docker 的出现是解决如下问题:
- 开发人员使用 Docker 技术可以消除协作编码时“在我的机器上可以正常运行,在你的机器上却不可以”的问题;在日常工作中,Docker 还可以帮助开发人员提高工作效率;
- 运维人员使用 Docker 技术可以在隔离环境中轻松部署、管理应用软件,降低运维成本;
- 软件企业使用 Docker 技术可以轻松敏捷构建软件交付通道,用更快的速度,更高的安全性,更可靠的稳定性发布、更新应用软件。
2、安装 Docker 环境
在深入学习 Docker 之前,我们先从安装 Docker 环境,简单体验 Docker 开始。
如上图所示,我的宿主机环境为 centos7,安装过程参考官网 https://www.docker.com 的帮助手册:
具体安装步骤:
(1) 更新操作系统软件源:
(2) 安装所需安装包
(3) 设置镜像仓库,帮助手册给的仓库地址是国外的,访问较慢,建议设置成阿里云的
http://mirrors.aliyun.com/Docker-ce/linux/centos/Docker-ce.repo
(4) 安装最新的 Docker 引擎(Docker-ce表明示社区版本)
(5) 启动 Docker 并运行 version 命令,如下图说明安装成功了。
(6) 配置镜像加速器
阿里云为每一个开发者提供来一个镜像加速器,我们在 Docker 环境中配置好阿里云镜像加速,方便以后我们自己下载镜像时速度更快。
具体操作方法:登录阿里云官网:控制台 -> 搜索“容器镜像服务”,得到如下页面可见加速器地址:
页面中也很贴心的给出来设置方法:
配置完成后,下载并运行镜像:
如上所示说明 Docker 安装成功。从打印信息看出,docker run 先从远程仓库中拉取hello-world,拉取到本地完成打印 Pull complete 和 sha256 等信息,然后再运行此镜像。我们再次执行 docker run 就不再有拉取的动作来:
3、虚拟机和容器的区别
我们知道,部署服务器应用程序一直是个很复杂操作流程,比如搭建一个网站,既要部署主应用程序,还需要相关组件,如数据库、消息队列、Nginx 等等,需要耗费很大人力且非常容易出错。
由于这种复杂性,促使了程序员开始关注虚拟化技术,于是就有了虚拟机和容器。
虚拟机如 VMware,它是为 CPU、内存和存储提供了一个抽象层,用户可以对这个抽象层进行修改,比如新增 CPU、内存或者磁盘,而无需购买新的硬件。抽象层之上的应用程序对硬件是虚拟的还是物理的是无感知的,这样灵活且安全。
怎么理解抽象层呢,打个比方你要往磁盘写入某些数据,没有虚拟机时你调用的是操作系统的接口,进而调用到磁盘的读写,引入抽象层后,你调用的还是操作系统的接口,但是往下要执行的操作,都交接给来虚拟机,由虚拟机模拟写入磁盘并返回,应用程序无感知。
你的应用程序可以单独运行在一个虚拟机中,也可以和其他应用运行在虚拟机,缺点是,虚拟机一次只能运行一种操作系统,如果应用程序需要不同的环境中,则需要使用多个虚拟机,另外,虚拟机将模拟完整的计算机。启动、快照等操作非常缓慢,属于分钟基本级别。
容器则可以捆绑应用程序以及依赖项,容器化应用后可以将其部署在宿主机,宿主机提供标准化的运行环境,它将抽象化操作系统(和操作以下的基础硬件),容器化应用和其他容器化应用可以运行在同一宿主机,彼此隔离,互不干扰。
简而言之,虚拟机是将硬件虚拟化,容器则是将操作系统虚拟化,启动容器,只需要等待应用程序启动,而不是像虚拟机一样等待操作系统和应用程序两者启动。Docker 是容器化中最常用的技术。
4、Docker 的基本组成和工作原理
Docker 是由镜像(Image)、容器(Container)和仓库(Repository)仓库组成。
镜像:用来创建 Docker 容器的只读模板,一个镜像可以创建很多容器。镜像文件就是应用程序和配置依赖打包好形成一个可交付的运行环境。
容器:容器是镜像运行时的实体。从面向对象的角度看,镜像等价于类,容器等价于对象。容器是一个虚拟化的运行环境,应用程序或服务运行其中。容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。每个容器都是一个简易版本的 Linux,里面有 root 用户、网络配置、进程空间等必备的系统资源,还有运行其中的应用程序和相关配置。
仓库:集中存放镜像文件的场所。Docker 公司提供的官方仓库 Docker Hub,国内的公开仓库包括阿里云等。
Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上, 客户端通过 Socket 连接访问守护进程:
/usr/bin/dockerd 为 Docker 常驻后台(daemon)进程,/usr/bin/docker 为客户端程序。整体架构图如下:
守护进程从客户端接受命令并管理运行在主机上的容器。
(1) 用户使用 Docker Client 和 Docker daemon 建立通信,Docker daemon 接受响应 Docker Client 的请求;
(2) Docker engine 执行系列工作,每一项工作都是以 Job 的形式存在;
(3) Job 从 Docker registry 下载镜像后由镜像管理驱动 graph driver 负责将镜像保存为 graph 的形式存储;
(4) 网络管理驱动 Network driver 负责创建并配置容器的网络环境;
(5) Exec driver 负责执行用户指令,根据用户设置限制容器运行资源等。
(6) libcontainer 用于容器管理的包,基于 Namespace、Cgroup 以及文件系统等控制容器。
Namespace 和 Cgroup 是 Docker 内部实现的关键的基础,是 Linux 内核提供的技术,因为这两项技术才使得容器看起来像一个独立的操作系统。
Namespace 是一种资源隔离技术,比如进程 PID、进程间通讯媒介(IPC)、网络网卡等资源在 Linux 系统中是全局的,是属于整个操作系统的,而在 Namespace 隔离技术中这些资源将属于某个特定的 Namespace。Docker 使用 Namespace 就可以使得每个容器各个 Namespace 互不干扰。
Cgroup 是一种资源消耗控制技术,比如控制进程所能消耗的最大 CPU 使用率、内存占用、网络带宽等。Docker 使用 Cgroup 就可以限制某个容器使用资源的上限。
本文首发自公众号「LinuxOK」,ID为:Linux_ok,关注公众号第一时间获取更新,分享记录职场开发过程中所见所感。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)