Docker的体系结构

docker使用C/S 架构,docker daemon 作为 server 端接受 client 的请求,并处理(创建、运行、分发容器),他们可以运行在一个机器上,也通过 socket或者 RESTful API 通信

Docker daemon 一般在宿主主机后台运行。

Docker client以系统命令的形式存在,用户用docker命令来跟docker daemon 交互。

Docker 守护进程(Docker daemon)

如上图所示,Docker 守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。

Docker 客户端(Docker client)

Docker 客户端,实际上是docker的二进制程序,是用户与 Docker 交互方式。它接收用户指令并且与背后的 Docker 守护进程通信。

Docker 内部:

要理解 Docker 内部构建,需要理解以下三种部件:

Docker 镜像 - Docker images

Docker 仓库 - Docker registeries

Docker 容器 - Docker containers

Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,镜像可以用来创建 Docker 容器。每一个镜像由一系列的层 (layers) 组成。Docker 使用UnionFS(联合文件系统)来将这些层联合到单独的镜像中。UnionFS允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

每个docker都有很多层次构成,docker使用  union file systems  将这些不同的层结合到一个image 中去。

例如:centos镜像中安装nginx,就成了nginx镜像”,其实在此时Docker镜像的层级概念就体现出来了。底层一个centos操作系统镜像,上面叠加一个ngnx层,就完成了一个nginx镜像的构建。层级概念就不难理解,此时我们一般centos操作系统镜像称为nginx镜像层的父镜像。

Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。

当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

*注:Docker 仓库的概念跟Git类似,注册服务器可以理解为 GitHub 这样的托管服务。

Docker 容器

Docker 利用容器来运行应用,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

与虚拟机相比,容器有一个很大的差异,它们被设计用来运行"单进程",无法很好地模拟一个完整的环境。Docker设计者极力推崇“一个容器一个进程的方式”,如果你要选择在一个容器中运行多个进程,那唯一情况是:出于调试目的。

容器是设计来运行一个应用的,而非一台机器。你可能会把容器当虚拟机用,但你将失去很多的灵活性,因为Docker提供了用于分离应用与数据的工具,使得你可以快捷地更新运行中的代码/系统,而不影响数据。

Docker 从 0.9 版本开始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:

Docker  底层技术

docker底层的 2 个核心技术分别是 Namespaces 和 Control groups

Namespaces用来隔离各个容器

1)pid namespace

不同容器的进程就是通过pid namespace 隔离开的,且不同  namespace  中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的 namespace 。

2) net namespace

有了pid namespace,  每个 namespace 中的pid能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net namespace 实现的,每个 net namespace 有独立的  network devices, IP addresses, IP routing tables, /proc/net  目录。这样每个 container 的网络就能隔离开来。docker默认采用veth的方式将 container 中的虚拟网卡同 host 上的一个docker bridge: docker0 连接在一起。

3) ipc namespace

container 中进程交互还是采用linux常见的进程间交互方法 (interprocess communication - IPC),包括常见的信号量、消息队列和共享内存。container  的进程间交互实际上还是host 上具有相同ipc namespace 中的进程间交互。

4) mnt namespace

类似chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个  namespace  中的进程所看到的文件目录就被隔离开了。在container里头,看到的文件系统,就是一个完整的linux系统,有/etc、/lib 等,通过chroot实现。

5) uts namespace

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

6) user namespace

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

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

cgroups(Control groups)实现了对资源的配额和度量。

时间: 2024-10-13 12:36:05

Docker的体系结构的相关文章

Docker的概念及剖析原理和特点

一.docker的简介: 应用容器是个啥样子呢,一个做好的应用容器长的就像一个装好了一组特定应用的虚拟机一样,比如我现在想用mysql数据库,我直接找个装好了的MySQL的容器就可以了,想用的时候一运行容器,MySQL服务就起来了,就可以使用MySQL了 为什么不能直接安装一个MySQL?或者是SqlServer呢也可以啊? 答:因为有的时候根据每个人的电脑的不同,在物理机安装的时候会出现各种各样的错误,突然你的机器中病毒了或者是挂了,你所有的服务都需要重新安装. 注意:    但是有了dock

Docker简介

Docker简介 什么是Docker: 正所谓Docker的英文本意为"搬运工",所以在我们的世界里,可以理解为Docker搬运的是装满任意类型的APP的集装箱,开发者可以通过Docker将APP变成一种标准化的.可移动植的.自动管理的组件.它用一种新的方式实现了轻量级的虚拟机,专业术语成为应用容器(Application Container) Docker的优势: 1.利用率高 ·Docker对系统资源的利用率很高,一台主机可以同时运行数千个Docker容器 2.可以快速的交付应用程

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

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

【Docker官方文档】理解Docker

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

docker一:基础原理

docker的体系结构 docker使用c/s架构,docker daemon(守护进程)作为server端接受client的请求,并处理(创建.运行.分发容器)他们可以运行在一个机器上,也通过sockerts或者RESTful API通信. docker client host docker pull docker daemon docker run container1 docker container2 docker有三个内部组件 docker images docker registri

Linux----------容器docker file

目录 一.Docker file 二.docker build 三.Docker File体系结构 一.Docker file 如果你想要从一个基础镜像开始建立一个自定义镜像,可以选择一步一步进行构建,也可以选择写一个配置文件,然后一条命令(docker build)完成构建,显然配置文件的方式可以更好地应对需求的变更,这个配置文件就是Dockerfile. Dockerfile其实可以看做一个命令集.每行均为一条命令.每行的第一个单词,就是命令command.后面的字符串是该命令所要接收的参数

Docker六大优势,云中部署模式、以及视频demo

随着Docker技术的不断成熟,越来越多的企业开始考虑使用Docker.Docker有很多的优势,如持续集成.版本控制.可移植性.隔离性.安全性和高性能. 另外一方面如何在企业云中实施docker,是直接使用docker(Cloud by Docker)还是将docker运行在vm中进行管理(Docker in Cloud)? 本文将总结优势,分析部署模式,以及最后通过2个视频demo来了解下云中运行docker的模式情况 1.六大优势 1.1 持续部署与测试 Docker在开发与运维的世界中具

1.3 虚拟化与Docker

虚拟化技术是一个通用的概念,在不同领域有不同的理解.在计算领域,一般指的是计算虚拟化(Computing Virtualization),或通常说的服务器虚拟化.维基百科上的定义如下: 在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源. 可见,虚拟化的核心是对资源进行抽象,目标往往是为了在同一个主机上运行多个系

京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(上)

田琪(@摇摆巴赫)是京东资深架构师,10年互联网行业从业经验,之前曾分别就职于搜狐.新浪.腾讯等公司,目前负责京东云主机及云数据库的架构及研发工作,对云计算基础技术有深刻理解. DockerCon 2015于6月22-23号在美国旧金山落下帷幕,这个由Docker公司发起的Docker领域峰会,包括Docker公司CEO在内的多位领域专家发表了精彩演讲.峰会展示着Docker领域的成就,也预示着Docker领域的未来方向.田琪作为国内容器化方向的先行者,受邀参加了此次峰会,峰会上究竟有哪些见闻,