啃Docker大骨头所必备的基础理论
前言
- Docker三要素:容器,仓库,镜像
- Dockfile工具制作成镜像,上传到仓库,如果要添加服务,只需要仓库下载镜像,速度非常快
- 只要能装docker-engine引擎,在任意平台上都能部署docker
- 容器不依赖于系统,而是依赖于引擎
一:Docker概述
1.1:Docker是什么?
-
是一种轻量级别的“虚拟机”,与虚拟机相比是不依赖于系统
-
是Linux容器里运行应用的开源工具
-
Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。
-
Docker从一开始就以提供标准化的运行时环境为目标,真正做到“build once, run anywhere”,可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了CaaS(容器即服务)技术。
-
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。
-
是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
-
沙箱(Sandbox):沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响
-
Docker的logo
1.2:Docker的使用场景
- 打包应用程序简单部署
- 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
- 持续集成和持续交付(CI/CD):开发到测试发布
- 部署微服务
- 提供PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的ECS,属于IAAS、Docker(K8S) 属于PAAS}
1.3:Docker容器与传统虚拟机的比较
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力消耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
安全 | 共享内核,不安全 | 系统逻辑隔离,安全 |
服务 | 一个容器只跑一个服务 | 可以运行多个服务 |
1.4:Docker引擎(Docker Engine)
- Docker Engine是具有以下主要组件的客户端-服务器应用程序:
- 服务器是一种长期运行的程序,称为守护程序进程(
dockerd
命令)。 - REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
- 命令行界面(CLI)客户端(
docker
命令)。
1.5:Docker的架构
- Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
- Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快
- Docker Client:客户端
- Docker客户端(
docker
)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run
,客户端会将这些命令发送到dockerd
,以执行这些命令。该docker
命令使用Docker API。Docker客户端可以与多个守护程序通信。
- Docker客户端(
- Docker daemon:守护进程
- Docker守护程序(
dockerd
)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
- Docker守护程序(
- Docker images:镜像
- 容器可以被打包成镜像
- Docker container:容器
- Docker registry:镜像仓库
- 存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库。
1.6:Docker的核心概念
1.6.1:镜像(image)
- Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向Docker容器引擎的只读模式,比如:一个镜像可以是一个完整的CentOS操作系统环境,称为一个CentOS镜像;可以是一个安装了MySQL的应用程序,称之为一个MySQL镜像等等
- Docker提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经做好的应用镜像来直接使用
1.6.2:容器(container)
- Docker的容器是从镜像创建的运行实例,他可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不看见的,可以保证平台的安全性。
- 还可以把容器看作是一个简易版的Linux环境,Docker利用容器来运行和隔离应用
1.6.3:仓库(repository)
- Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公共仓库(public)或者私有仓库(private),这样一来当下次要在另一台机器上使用这个镜像的时候,只需要从仓库上pull下来就可以了。
- 仓库注册服务器(registry)是存放仓库的地方,其中包含了多个仓库,每个仓库集中存档某一类镜像,并且使用不同的标签(tag)来区分他们。目前最大的公公仓库是Docker Hub,其中存放了数量庞大的镜像供用户下载使用。
1.7:名称空间(Namespaces)
- Docker使用一种称为
namespaces
提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组 名称空间。 - 这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
- Docker Engine在Linux上使用以下名称空间:
- **该pid命名空间:**进程隔离(PID:进程ID)。
- **该net命名空间:**管理网络接口(NET:网络)。
- **该ipc命名空间:**管理访问IPC资源(IPC:进程间通信)。
- **该mnt命名空间:**管理文件系统挂载点(MNT:mount)。
- **该uts命名空间:**隔离内核和版本标识符。(UTS:Unix时间共享系统)。
1.8:控制组(Control groups)
- Linux上的Docker引擎还依赖于另一种称为控制组 (
cgroups
)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。