Docker基础之一: Docker架构

简介: Docker的架构 Docker使用的是 C-S架构。Docker的客户端同Docker Daemon进行交互,其中主要的工作是通过 daemon来完成,包括拉取镜像,编译镜像,运行容器,发布容器等。Docker client和daemon可以运行在同一个系统上,也可以通过远程方式进行访问。Doc

Docker的架构

Docker使用的是 C-S架构。Docker的客户端同Docker Daemon进行交互,其中主要的工作是通过 daemon来完成,包括拉取镜像,编译镜像,运行容器,发布容器等。Docker client和daemon可以运行在同一个系统上,也可以通过远程方式进行访问。Docker client和daemon之间是在 socket 上通过RESTful API来进行交互的。 

574478332a680c4ea8c3cf1a57fee4f5f6c217aa

Docker Daemon

如上图所示,Docker daemon运行在一个主机之上,用户并不是直接同daemon进行交互,而是通过Docker client来进行访问。

Docker Client

在Docker那个方框中,是主要的用户访问Docker的渠道。用户通过它对Docker Daemon进行访问控制。

Docker Images

Docker Image是一个只读的模板。比如,一个Image可以包含一个Ubuntu操作系统,整个系统可以包括Apache和你的web应用。Image是用来创建容器的。Docker提供了一种简单的方式来创建Image和更新已有的 Image, 你可以从网上下载Image,也可以自己编译Image。

Docker Registry

Docker Registry 是存放Image的仓库。我们可以使用公有的和私有的Registry来进行下载和上载。公共的Docker Registry位于Docker Hub,但是国内访问比较慢。Docker Hub包含了大量已有的Image,供用户使用。你可以基于之前的Image来创建自己的 Image。

Docker Containers

Docker容器就像一个文件夹。一个容器包含了应用程序运行所需的所有环境。每个容器都源于某一个Docker Image。Docker容器可以运行,开始,停止,移动并删除。每个容器都是完全隔离的和安全的应用。

Docker 如何工作

通过之前的介绍,我们知道:

  1. 我们可以自己编译Docker Image来打包应用
  2. 我们可以从Docker Image创建容器,并在其中运行应用程序
  3. 我们可以通过Docker Hub或私有的Registry来分享Docker Image 接下来,我们来看如何将之前的这些元素整合起来运行。

Docker Image 工作方式

我们已经看到Docker Image 是只读的模板,并随容器一起启动。每个Image包含了多个层。Docker Image使用的是Union File System来将这些层组合成一个Image。Union File System可以将文件和目录(通常称作Branch)进行透明的层叠组装,然后形成一个单独的文件系统。 Docker为什么轻量,就是因为使用了这些层状的文件系统。当用户修改一个Docker Image的时候(比如更新应用程序)一个新的层就会被建立。因此,这是一种增量式的修改,而不是新建一个全新的Image,这也是区别于传统虚拟机的一点。当你发布一个新的Image时,你只需要发布差异的部分,因此速度就非常快。
每个Image都来自于一个最基础的Image,如:ubuntu是一个基础Image,fedora是一个基础image。你也可以使用自己的Image作为基础Image,比如你可以创建包含了一个Apache 服务器的Image,作为所有web应用的基础Image。

注意:Docker通常从Docker Hub获取基础镜像。

Docker的Image都是从这些基础镜像衍生而来的,在编译Image是由一系列指令组成的,每个指令在我们的Image上创建一个新的曾。指令包括:

  • 执行一条命令
  • 添加文件或文件夹
  • 创建环境变量
  • 容器启动时,运行什么程序

Docker Registry 工作方式

Docker Registry是Image的仓库,当你编译完成一个Image时,你可以推送到公共的Registry,比如Docker Hub,也可以推送到你自己的私有Registry。 使用Docker Client,你可以搜索已经发布的Image,并从中拉取Image到本地,并在容器中运行。
Docker Hub提供了公有和私有的Registry。所有人都可以搜索和下载公共镜像。私有仓库只有私有用户能够查询和下载。

容器工作方式

一个容器由操作系统,用户文件和元数据构成。如我们所见,每个容器都根据镜像来生成。这个镜像告诉Docker 容器包含什么内容,运行什么程序,以及其他配置信息。Docker Image是只读的,当一个容器运行一个Image的时候,容器会在union FS的顶层增加文件层。

假如我们运行下面一条指令:

root@gctest:~# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
Digest: sha256:f91f9bab1fe6d0db0bfecc751d127a29d36e85483b1c68e69a246cf1df9b4251
Status: Downloaded newer image for ubuntu:latest
root@ea7ffc10c7e7:/#

我们来做一下拆解,Docker Client通过run命令告诉Daemon启动一个新的容器。这个指令至少需要包括:

  • 需要运行什么Image,这里我们使用的是Ubuntu基础镜像
  • 需要在容器启动时,运行什么命令,这里我们使用的是/bin/bash 是否需要进入应用程序,这里我们指定的是-i -t,就是进入容器交互模式

那么具体到内部的流程是怎么样的呢?

  • 拉取ubuntu镜像:Docker检查本地是否有ubuntu镜像,如果不存在就自动从Docker Hub拉取。如果存在就进入下一步
  • 创建一个容器:一旦本地存在ubuntu 镜像,Docker将通过它来创建容器
  • 分配文件系统并mount 一个RW层:容器是创建在文件系统中的,并且在其之上增加了一层读写层。由此可以看出容器,并不会改变原始的镜像。
  • 分配网络/桥接模式:创建一个桥接网络接口,使容器可以和本地主机进行通信。
  • 设置一个IP地址:根据本地网络情况,选取一个可用的IP挂载到容器之上
  • 启动一个进程:这里就是/bin/bash
  • 抓取应用程序的输出:将程序的stdin, stdout和stderr,进行捕捉,这样我们可以看到程序的运行情况。 至此,你就拥有了一个运行的容器。通过容器,你可以运行程序,并且进行交互,当程序执行完毕,你可以停止和删除程序。

底层的技术

Docker是用Go编写的,同时使用了多种内核的功能来实现我们现在所看到的功能。

Namespaces

Docker 使用了Namespace这项技术来隔离工作区,也就是我们所说的容器。当容器运行时,Docker创建了一系列的Namespace。 通过Namespaces,容器运行在它自己的独立命名空间之中,而外层没有访问权限。目前,Docker使用了以下Namespace:

  • pid namespace: 用于进程的隔离(PID: Process ID)
  • net namespace: 用于管理网络接口x(NET: Networking)
  • ipc namespace: 用于管理进程间通讯(IPC: Inter Process Communication)
  • mnt namespace: 用于管理Mount点(MNT: Mount)
  • uts namespace: 用于隔离内核和版本信息(UTS: Unix Timesharing System)

Control Groups

Docker也使用了cgroups这项内核技术,通过cgroups可以限制应用程序使用的资源,这项技术可以使用户主机更好的运行多个容器而相互间不受影响。Cgroups可以限定容器使用的硬件资源,比如内存数量,CPU数量等。

Union File System

UnionFS用来对文件系统进行分层,通过分层可以使镜像更加轻量级和快速。Docker可以使用多种不同的UnionFS,比如AUFS, btrfs, vfs, DeviceMapper等。

容器格式

Docker将上述的多项技术包装在一起,形成了容器的格式。默认的容器格式是libcontainer , Docker也支持传统的 LXC格式。在未来,Docker也许会支持其他的容器格式,比如BSD Jails 或Solaris Zones.


备注:对有兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个Docker爱好者群组里面。

目录
相关文章
|
26天前
|
前端开发 安全 数据库
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
|
2月前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
2月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
15天前
|
存储 监控 Linux
Docker技术架构概述
【6月更文挑战第29天】Docker采用CS架构,Client与Daemon交互,Compose管理多容器应用。
|
2月前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美结合
【5月更文挑战第28天】在现代软件开发中,微服务架构已成为提高系统可维护性和扩展性的关键。本文深入探讨了如何利用Docker容器化技术和Kubernetes集群管理工具共同打造一个高效、可靠的微服务环境。通过分析两者的核心优势及互补特性,我们展示了一种优化的部署策略,旨在帮助开发者和系统管理员理解和实践在复杂分布式系统中实现服务的有效管理和自动化部署。
|
2月前
|
运维 监控 Docker
使用Docker进行微服务架构的部署
【5月更文挑战第18天】本文探讨了如何使用Docker进行微服务架构部署,介绍了Docker的基本概念,如容器化平台和核心组件,以及它与微服务的关系。通过Docker,每个微服务可独立运行在容器中,便于构建、测试和部署。文章详细阐述了使用Docker部署微服务的步骤,包括定义服务、编写Dockerfile、构建镜像、运行容器、配置服务通信、监控和日志管理以及扩展和更新。Docker为微服务提供了可移植、可扩展的解决方案,是现代微服务架构的理想选择。
|
2月前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
2月前
|
监控 持续交付 Docker
使用Docker进行微服务架构的最佳实践
【5月更文挑战第10天】本文探讨了使用Docker实施微服务架构的最佳实践。首先,理解微服务架构是拆分小型独立服务的模式,借助Docker实现快速部署、高可移植性和环境一致性。Docker的优势在于服务扩展、容器编排、自动化构建与部署。最佳实践包括:定义清晰服务边界,使用Dockerfile和Docker Compose自动化构建,利用Docker Swarm或Kubernetes编排,实施服务发现和负载均衡,监控与日志记录,以及持续集成和持续部署。Docker虽重要,但需与其他技术结合以确保系统整体稳定性。
|
2月前
|
Kubernetes 监控 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第4天】在现代软件开发中,微服务架构已成为实现可扩展、灵活且独立部署服务的流行解决方案。本文将探讨如何利用Docker容器化技术和Kubernetes容器编排平台来构建一个高效的微服务系统。我们将分析Docker和Kubernetes的核心优势,并指导读者如何通过这些工具优化微服务部署、管理和扩展过程。文章还将涉及监控和日志管理策略,以确保系统的健壮性和可靠性。
|
2月前
|
Kubernetes 监控 Docker