理解Docker技术

什么是docker

Docker is an open platform for developing,shipping, and running applications.

Docker是PaaS提供商dotCloud开源的基于LXC的,源代码托管在Github上的,基于go语言开发的,遵循Appache2.0协议的容器引擎。

Docker允许打包程序并附带它所有的依赖成标准化的单元来进行部署软件。

Docker具有轻量、开源、安全的特点。

Docker VS VM

Docker容器在资源隔离和可配额方面与VM相似,但是不同于 VM的架构,使Docker容易更便携和高效。

VM架构

一个VM包含有应用、必要的二进制文件与库和一个完整的操作系统,以上所有加起可能有几十G的大小。

Containers架构

Containers包含应用和它所有的依赖,但是与其它containers共享内核。像用户空间独立的进程一样运行在主机操作系统上。Docker容器并不是只能运行在特定的架构上,可以运行在任何计算机、任何架构和任何云上。

理解Docker架构

Docker可以用来干什么

1、快速交付应用

2、部署和扩展更容易

3、实现更高密度和运行更多负载

Docker重要组件

Docker:开源的容器化平台

DockerHub:共享和管理docker容器的SaaS平台

Docker架构

Docker采用C/S架构,Docker客户端与进行创建、运行和分发容器的Docker守护进程进行会话。Docker客户端和Docker守护进程可以运行在同一系统,或者通过Docker客户端连接到远端Docker守护进程。Docker客户端和Docker守护进程通过sockets或RESTful API进行通信。

Docker daemon

如上图所示,Docker daemon运行在一台主机上。用户并不是直接与docker deamon进行通信,而是通过Docker client。

Docker client

docker二进制形式的Docker client是连接Docker的基本用户接口。它接收来自客户端的命令和与Docker daemon之间的会话。

Docker内部

Docker镜像(building)

Docker镜像是一个只读的模版,它可能是一个带有apache的CentOS操作系统。Docker镜像是用来创建Docker容器的,因此,Docker镜像是Docker的build组件。

Docker仓库(distributing)

Docker仓库是存储镜像的。是上传或下载镜像公共的或私有的仓库。公共的仓库由Docker Hub提供。因此Docker registries是Docker的distribution组件。

Docker  containers(running)

Docker容器和目录很相似。一个Docker容器包含一个应用程序运行的所需的东西。每个Docker容器都是使用Docker image创建的,可以运行、启动、停止、移动和删除。每个Docker容器都是一个独立和安全的应用平台。因此,Docker containers是Docker的run组件

Docker使用的技术

LXC

LXC如何实现虚拟化

前面说过,Docker是基于LXC的操作系统级别的虚拟化。因此可以从以下几个方面理解Docker是如何实现虚拟化的。

1、隔离型

LXC是通过container,具体是通过kerner namespace实现的

2、可配额

LXC是通过cgroups来控制资源的

3、移动性

Docker利用AUFS实现

4、安全性

对于LXC,用户的进程是lxc-start进程的子进程,只是在kernel的namespace中隔离的,因此需要一些kernel的patch来保证用户的运行环境不受来自host主机的恶意入侵。dotCloud主要利用Kernel grsecpatch解决的

命名空间(namespace)

LXC能够实现隔离型,主要是靠kernel的namespace,期中的pid、net、ipc、mnt、uts等namespace将container的进程、网络、消息、文件系统和host隔离开的。

pid namespace

不同用户的进程就是通过pid namespace隔离开的。不同的namespace可以有相同的pid namespace。具有以下特征

1、每个 namespace 中的 pid 是有自己的 pid=1 的进程(类似 /sbin/init 进程)

2、每个 namespace 中的进程只能影响自己的同一个 namespace 或子 namespace 中的进程

3、因为 /proc 包含正在运行的进程,因此在 container 中的 pseudo-filesystem 的 /proc 目录只能看到自己 namespace 中的进程

4、因为 namespace 允许嵌套,父 namespace 可以影响子 namespace 的进程,所以子 namespace 的进程可以在父 namespace 中看到,但是具有不同的 pid

uts namespace

UTS (“UNIX Time-sharing System”)namespace 允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。

net namespace

网络隔离是通过 net namespace 实现的,每个 net namespace 有独立的network

devices, IP addresses, IP routingtables, /proc/net 目录。这样每个 container 的网络

就能隔离开来。 docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的

一个 docker bridge 连接在一起。

mnt namespace

类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同

namespace的进程看到的文件结构不同,这样每个namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。

ipc namespace

container 中进程交互还是采用 Linux 常见的进程间交互方法 (interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的32bit ID。

user namespace

每个 container 可以有不同的 user 和 group id, 也就是说可以以 container 内部的用户在 container 内部执行程序而非 Host 上的用户。

有了以上 6 种 namespace 从进程、网络、IPC、文件系统、UTS 和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同 container从 OS 层面实现了隔离。 然而不同 namespace 之间资源还是相互竞争的,仍然需要类似 ulimit 来管理每个 container 所能使用的资源

资源配额-Control Groups

cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup 目录下新建一个文件夹即可新建一个 group,在此文件夹中新建 task 文件,并将 pid 写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法, 如 memory.usage_in_bytes 就定义了该 group 在 subsystem memory 中的一个内存限制选项。另外,cgroups 中的 subsystem 可以随意组合,一个 subsystem 可以在不同的 group 中,也可以一个 group 包含多个 subsystem - 也就是说一个 subsystem。

1、memory

内存相关的限制

2、cpu

在 cgroup 中,并不能像硬件虚拟化方案一样能够定义 CPU 能力,但是能够定义 CPU 轮转的优先级,因此具有较高 CPU 优先级的进程会更可能得到 CPU 运算。 通过将参数写入 cpu.shares ,即可定义改 cgroup 的 CPU 优先级 - 这里是一个相对权重,而非绝对值

3、blkio

block IO 相关的统计和限制,byte/operation 统计和限制 (IOPS 等),读写速度限制等,但是这里主要统计的都是同步 IO

4、devices

设备权限限制

5、net_cls、cpuacct、freezer等其它管理项。

参考文献:

https://docs.docker.com/engine/understanding-docker/

https://www.docker.com/what-docker

linuxcontainers.org

http://tiewei.github.io/cloud/Docker-Getting-Start

时间: 2024-10-26 04:46:56

理解Docker技术的相关文章

docker技术剖析--镜像、容器管理

防伪码:博观而约取,厚积而薄发                                 docker技术剖析--镜像.容器管理 一.Docker简介 Docker是什么? Docker的英文本意是"搬运工",在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的.可移植的.自管理的组件,可以在任何主流系统中开发.调试和运行. 说白了,docker是一种用了新颖方式实现的轻量级虚拟机,

【Docker官方文档】理解Docker

本文来自Docker的官方文档,详细介绍了Docker的体系结构.重要概念.内部工作机理等内容,推荐不了解Docker内部原理的同学阅读. 什么是Docker? Docker是一个用于开发.交付和运行应用的开放平台,Docker设计用来更快的交付你的应用程序. Docker可以将你的应用程序和基础设施层隔离,并且还可以将你的基础设施当作程序一样进行管理.Docker可以帮助你更块地打包你代码.测试以及部署,并且也可以减少从编写代码到部署运行代码的周期. Docker将一个轻量级的容器虚拟化平台和

10张图带你深入理解Docker容器和镜像

图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我发现理解Docker的命令非常困难.于是,我花了几周的时间来学习Docker的工作原理,更确切地说,是关于Docker统一文件系统(the union file system)的知识,然后回过头来再看Docker的命令,一切变得顺理成章,简单极了. 题外话:就我个人而言,

10 张图带你深入理解 Docker 容器和镜像

这篇文章希望能够帮助读者深入理解 Docker 的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对 Docker 技术还是一知半解的时候,我发现理解 Docker 的命令非常困难.于是,我花了几周的时间来学习 Docker 的工作原理,更确切地说,是关于 Docker 统一文件系统(the union file system)的知识,然后回过头来再看 Docker 的命令,一切变得顺理成章,简单极了. 题外话:就我个人而言,掌握

[Docker 官方文档] 理解 Docker

http://segmentfault.com/a/1190000002609286 什么是 Docker? Docker 是一个用于开发.交付和执行应用的开放平台,Docker 设计用来更快的交付你的应用程序.Docker 能够将你的应用程序和基础设施层隔离.而且还能够将你的基础设施当作程序一样进行管理.Docker 能够帮助你更块地打包你代码.測试以及部署,而且也能够降低从编写代码到部署执行代码的周期. Docker 将一个轻量级的容器虚拟化平台和一组标准工作流程.工具进行集成,来帮助你方便

理解Docker——深入引擎室

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 本文大概 3301 字 读完共需 9 分钟 本文主要内容 Docker的架构 在用户的宿主机上追溯Docker的内部结构 使用Docker Hub查找和下载镜像 设置自己的Docker注册中心(registry) 实现容器间的相互通信 掌握Docker的架构是更全面地理解Docker的关键.在本文中,读者将在自己的主机和网络上对Docker的主要组件进行大致了解,并学习一些有助于增进这种理解的技巧. 在这个过程中,将学习

理解 docker 容器中的 uid 和 gid

默认情况下,容器中的进程以 root 用户权限运行,并且这个 root 用户和宿主机中的 root 是同一个用户.听起来是不是很可怕,因为这就意味着一旦容器中的进程有了适当的机会,它就可以控制宿主机上的一切!本文我们将尝试了解用户名.组名.用户 id(uid)和组 id(gid)如何在容器内的进程和主机系统之间映射,这对于系统的安全来说是非常重要的.说明:本文的演示环境为 ubuntu 16.04(下图来自互联网). 先来了解下 uid 和 gid uid 和 gid 由 Linux 内核负责管

用一个实际例子理解Docker volume工作原理

要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层.如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,但是该文件的只读版本依然存在,只不过已经被读写层中该文件的副本所隐藏. 当删除Docker容器,并通过该镜像重新启动时,之前在读写层的更改将会丢失.在Docker中,只读

Docker技术知识点总纲

基本介绍的安装使用 1.Docker简要介绍 2.windows下Docker的安装 3.CentOS下Docker的安装 快速入门与常用操作 4.Docker引擎升级与存储驱动的升级 5.Docker常用指令与常用操作 6.利用Docker部署JAVAEE应用 深入理解Docker原理与高级实操 7.总览Docker技术组件与基本构成 8.Docker引擎详解 9.Docker镜像详解 10.Docker容器详解 11.应用的容器化与应用的部署 12.Docker SWarm 13.Docke