系列文章目录
Docker学习笔记 —— Docker 介绍
Docker学习笔记 —— Docker 安装
Docker学习笔记 —— Docker 常用命令
Docker学习笔记 —— Docker 存储
Docker学习笔记 —— Docker 网络
Docker学习笔记 —— Dockerfile
文章目录
一、Docker概述
- Docker 是一个用于开发、传送和运行应用程序的开放平台。
- Docker使您能够将应用程序与基础设施分开,以便您可以快速交付软件。
- 使用Docker,您可以像管理应用程序一样管理基础设施。
- 通过用Docker的快速及交付、测试、部署代码的方法,您可以显著的减少编写代码和生产中运行代码之间的延迟;
二、 Docker 平台
Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。
隔离和安全箱允许您在给定的主机上同事运行多个容器。容器时轻量级的,包含运行应用程序所需的一切,因此您无需依赖主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得以相同方式工作的相同容器。
Docker提供工具和平台来管理容器的生命周期:
- 使用容器开发您的应用程序及其支持组件;
- 容器成为分发和测试应用程序的单元;
- 准备就绪后,将应用程序作为容器或编排服务部署到生产环境中。无论您的生产环境是本地数据中心、云提供商还是两者的混合,都是一样的;
三、Docker 可以做什么
3.1 快速、一致地交付您的应用程序
Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化开发的生命周期。容器非常适合持续集成和持续部署(CI/CD)工作流,考虑以下实例场景:
- 您的开发人员在本地编写代码并使用Docker 容器与同事共享他们的工作;
- 他们使用Docker将他们的应用程序推送到测试环境中并执行自动化或手动测试;
- 当开发发现BUG时,他们可以在开发环境中修复他们,并将他们重新部署到测试环境中进行测试和验证;
- 测试完成后,为客户提供修复就像将更新的镜像推送到生产环境一样简单;
3.2 响应式部署和扩展
- Docker 基于容器的平台允许高度可移植的工作负载,docker容器可以在开发人员的本地笔记本电脑、数据中心的物理或虚拟机、云提供商或混合环境中运行;
- Docker的可移植性和轻量级特性还使动态管理工作负载、根据业务需求几乎实时地扩展或拆除应用程序和服务变得容易;
3.3 在相同硬件上运行更多的工作负载
- Docker是轻量级和快速的,它为基于管理程序的虚拟机提供了一种可行且经济高效的替代方案,因此您可以使用更多的计算能力来实现您的业务目标;
- Docker 非常适合高密度环境以及需要更少资源完成更多任务的中小型部署;
四、Docker 架构
- Docker 使用
Client - Server架构
。Docker Client 与 Docker Server 守护进程通信,Docker Server守护进程负责构建、运行和分发Docker 容器的工作。- Docker 客户端和 Docker Server可以在同一系统上运行或者将Docker Client 链接到远程的 Docker Server 守护进程上;
- Docker 客户端和守护进程使用Rest API 、Unix套接字或网络接口进行通信。
4.1 Docker Client
- Docker Client 是许多Docker 用户与Docker交互的主要方式;
- 当使用诸如
docker run
,Client 会将这些命令发送到dockerd
,从而执行他们,该docker命令使用Docker Api- Client 可以与多个守护进程通信;
4.2 Docker Daemon
- Docker 守护进程(
Dockerd
) 侦听Docker API请求并管理Docker 对象,例如:images、containers、networks 和 volumes。- Docker 守护进程还可以与其他守护进程通信以管理Docker服务;
4.3 Registry
- Docker 仓库用来存储Docker 镜像。
- Docker Hub 是一个任何人都可以使用的公共仓库,Docker 默认配置在 Docker 上查找镜像;
- 每个组织可以根据自己的情况搭建自己的私有仓库;
- 当时用
docker pull
或docker run
命令时,所需的镜像就会从配置的镜像仓库去拉取,当使用docker push
时,镜像也会推送到配置的镜像仓库里;
4.4 Docker Objects
4.4.1 镜像(Images)
镜像是一个用于创建Docker容器的模板。
通常情况下,一个镜像是基于另一个镜像,并带有一些歪歪的自定义内容,例如:你可以构建一个基于 ubuntu 镜像的镜像,但需要安装 Apache Web 服务器和您的应用程序,以及是您这些应用程序运行所需的配置详细信息;
您可以创建自己的镜像,也可以使用其他人创建并在镜像仓库中发表的镜像。
- 要构建自己的镜像,需要使用简单的语法创建一个 Dockerfile ,用于定义创建镜像和运行镜像所需的步骤;
- Dockerfile 中的每条指令都会在镜像中创建一个层,当您更改Dockerfile 并重建镜像时,只会重建那些已经更改的层,与其他虚拟化技术相比,这是使镜像如此轻巧、小巧和快速的部分原因;
4.4.2 容器(Containers)
容器时镜像运行的一个实例,可以通过 Docker CLI命令创建、启动、停止、删除一个容器。可以创建一个容器连接到一个或者多个网络,将存储附加到这个容器上,甚至可以基于当前容器的状态创建新的镜像;
默认情况下,一个容器会与其他容器及其主机隔离,你可以控制一个容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
容器由其镜像以及您在创建或启动它是提供给他的任何配置选项定义,当容器移除时,未存储在持久存储中的对其状态的任何更改都会消失;
以
docker run
命令为例:
命令
docker run -i -t ubuntu /bin/bash
运行一个ubuntu容器,以交互连接的方式连接到容器里的本地命令行会话,并运行 /bin/bash;假设使用的是默认的镜像仓库配置,执行这个命令的步骤是:
- 1、如果本地没有 ubuntu 镜像,Docker 就会从镜像仓库拉取这个镜像,和手动执行
docker pull
命令是一样的;- 2、Docker 创建了一个新的容器和手动执行
docker container create
命令一样;- 3、Docker 为容器分配一个读写文件系统,作为容器的最后一层,这就允许正在运行的容器在本地文件件系统中创建和修改文件和目录;
- 4、Docker 创建一个网络接口。因为这类还没有指定任何网络选项(比如为容器分配IP地址等),所以容器会连接到默认网络(默认情况下,容器可以使用主机网络连接到外部网络);
- 5、Docker 启动容器并执行 /bin/bash 。由于容器是以交互方式执行并链接打本地终端(- i 参数),你可以使用本地的键盘输入信息以及在本地终端看到日志;
- 6、当输入
exit
终止 /bin/bash 命令时,容器停止但不会删除;
容器 VS 虚拟机
五、底层技术
- Docker 是用
GO 编程语言
编写的,并利用Linux 内核的几个特性提供其功能;- Docker 使用一种
namespaces
称为容器的技术来提供隔离的工作空间,当运行一个容器时,Docker 会为该容器创建一组命名空间;- 这些命名空间提供了一层隔离。容器的每个方面都会在单独的命名空间中运行,并且其访问权下仅限于该命名空间;
5.1 Docker 隔离原理
5.1.1 namespaces 6项隔离(资源隔离)
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机和域名 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
User | CLONE_NEWUSER | 用户和用户组 |
5.1.2 cgroups 资源限制(资源限制)
cgroup 提供的主要功能:
资源限制:
- 限制任务使用的资源总额,并在超过这个
配额
时发出提示;优先级分配:
- 分配CPU时间片数量及IO带宽大小、控制任务运行的优先级;
资源统计:
- 统计系统资源的使用量,如CPU使用时长,内存用量等;
任务控制:
- 对任务执行挂起、恢复等操作;
功能如下:
子系统 | 功能 |
---|---|
cpu | 使用调度程序控制任务对CPU的使用。 |
cpuacct(CPU Accounting) | 自动生成cgroup中任务对CPU资源使用情况的报告。 |
cpuset | 为cgroup中的任务分配独立的CPU(多处理器系统时)和内存。 |
devices | 开启或关闭cgroup中任务对设备的访问 |
freezer | 挂起或恢复cgroup中的任务 |
memory | 设定cgroup中任务对内存使用量的限定,并生成这些任务对内存资源使用情况的报告 |
perf_event(Linux CPU性能探测器) | 使cgroup中的任务可以进行统一的性能测试 |
net_cls(Docker 未使用) | 通过等级识别符标记网络数据包,从而允许Linux流量监控程序(Trawic Controller)识别从具体cgroup中生成的数据包 |