容器架构深度解析:从What‑Why‑How到Docker完整运行流程

📅 2026/7/6 13:53:00
容器架构深度解析:从What‑Why‑How到Docker完整运行流程
第2章 容器架构摘要本章系统性地介绍了容器技术的核心概念、Docker架构及其组件协作。首先从历史发展、定义What、价值Why和原理How三个维度剖析容器对比了容器与虚拟机的本质区别并阐述了Docker如何借鉴“集装箱”思想解决软件环境一致性问题。其次详细解析了Docker的C/S架构、核心组件Client、Daemon、Image、Container、Registry及其内部工作流程。最后通过一个docker run实例展示了各组件如何协同工作完成镜像拉取、容器创建与运行的完整生命周期体现了容器技术带来的环境标准化与效率提升。续上篇博客 容器生态系统拆解容器三大技术层次上手部署第一个容器006 容器What,Why,How学习任何东西都可以按照3W的框架进行容器技术也是一样先回答 What、Why 和 How 这三个问 题。容器发展史1979年在Unix V7 的开发过程中引入Chroot Jail以及Chroot系统调用Chroot jail被用于 “Change Root”它被认为是最早的容器化技术之一。它允许您将进程及其子进程与操作系统的其 余部分隔离开来。这种隔离的唯一问题是根进程root process可以轻松地退出chroot。它从未 考虑实现安全机制。1982年Chroot加入BSD。2000年在FreeBSD OS中引入FreeBSD Jail旨在为简单的Chroot文件隔离带来更多安全性。 FreeBSD Jail允许管理员将FreeBSD OS划分为几个独立的小型系统 - 称为“jails”还可以为每个小型 系统分配IP地址。2001年Linux内核具有操作系统级的虚拟化的功能以后推出了Linux VServer。它使用了类似 chroot的机制与“安全上下文”“security context”以及操作系统虚拟化容器化相结合来提供 虚拟化解决方案允许您在单个Linux发行版上运行多个Linux发行版。2004年Solaris Containers问世它使用系统资源控制和“区域”zone实现边界分离。2006年Google推出Process Containers旨在限制计算和隔离一组进程的资源使用CPU内 存磁盘I/O网络。2007年命名为控制组-cgroups最终合并到Linux内核2.6.24。2008年LXCLinuX Containers是第一个Linux容器管理器使用cgroups和命名空间 (namespace)在单个Linux内核上运行多个容器。2013年Docker推出了的第一个版本。在LXC的基础上Docker进一步优化了容器的使用体验。 后来用自己的库libcontainer替换了该容器管理器。2014年Google推出容器LMCTFYLet me contain that for you谷歌容器栈的开源版本提 供Linux应用程序容器。谷歌工程师一直在与Docker合作libcontainer并将核心概念和抽象移植到 libcontainer。因此没有积极开发LMCTFY项目未来LMCTFY项目的核心可能会被libcontainer取 代。谷歌是容器化行业的领导者。谷歌的一切都在容器上运行。每周有超过20亿个容器在Google基 础架构上运行。2014年12月CoreOS发布并开始支持rkt。What - 什么是容器容器是一种轻量级、可移植、自包含的软件打包技术使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。容器与虚拟机谈到容器就不得不将它与虚拟机进行对比因为两者都是为应用提供封装和隔离。容器由两部分组成2014年12月CoreOS发布并开始支持rkt。What - 什么是容器容器是一种轻量级、可移植、自包含的软件打包技术使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。容器与虚拟机谈到容器就不得不将它与虚拟机进行对比因为两者都是为应用提供封装和隔离。容器由两部分组成应用程序本身依赖比如应用程序需要的库或其他软件容器在 Host 操作系统的用户空间中运行与操作系统的其他进程隔离。这一点显著区别于的虚拟机。传统的虚拟化技术比如 VMWare, KVM, Xen目标是创建完整的虚拟机。为了运行应用除了部署应用本身及其依赖通常几十 MB还得安装整个操作系统几十 GB。下图展示了二者的区别。虚拟机容器启动速度数秒至数十秒秒甚至毫秒启动系统内核不共享内核共享内核实现技术依赖虚拟化技术实现由Hypervisor层实现对资源的隔离利用Linux内核技术 Namespace/Cgroup等实现。隔离效果系统资源级别的隔离进程级别的隔离资源消耗性能使用虚拟化技术就会有额外的资源消耗和占用容器中的应用只是宿主机上的一个普通进程资源调用 敏捷性应用进程需经过Hypervisor的拦截和处理才能调用系统资源应用进程直接由宿主机OS管理运行数量一台服务器上一般不超过100台虚拟机一台服务器上能启动1000容器应用用于硬件资源划分DevOps、微服务等镜像非分层镜像分层镜像如图所示由于所有的容器共享同一个 Host OS这使得容器在体积上要比虚拟机小很多。另外启动 容器不需要启动整个操作系统所以容器部署和启动速度更快开销更小也更容易迁移。Why - 为什么需要容器为什么需要容器容器到底解决的是什么问题简要的答案是容器使软件具备了超强的可移植能力。容器解决的问题我们来看看今天的软件开发面临着怎样的挑战如今的系统在架构上较十年前已经变得非常复杂了。以前几乎所有的应用都采用三层架构Presentation/Application/Data系统部署到有限的几台物理服务器上Web Server/Application Server/Database Server。而今天开发人员通常使用多种服务比如 MQCacheDB构建和组装应用而且应用很可能会部署到不同的环境比如虚拟服务器私有云和公有云。一方面应用包含多种服务这些服务有自己所依赖的库和软件包另一方面存在多种部署环境服务在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题如何让每种服务能够在所有的部署环境中顺利运行于是我们得到了下面这个矩阵各种服务和环境通过排列组合产生了一个大矩阵。开发人员在编写代码时需要考虑不同的运行环境运维人员则需要为不同的服务和平台配置环境。对他们双方来说这都是一项困难而艰巨的任务。如何解决这个问题呢聪明的技术人员从传统的运输行业找到了答案。几十年前运输业面临着类似的问题。每一次运输货主与承运方都会担心因货物类型的不同而导致损失比如几个铁桶错误地压在了一堆香 蕉上。另一方面运输过程中需要使用不同的交通工具也让整个过程痛苦不堪货物先装上车运到码 头卸货然后装上船到岸后又卸下船再装上火车到达目的地最后卸货。一半以上的时间花费 在装、卸货上而且搬上搬下还容易损坏货物。这同样也是一个 NxM 的矩阵。幸运的是集装箱的发明解决这个难题。任何货物无论钢琴还是保时捷都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。集装箱被誉为运输业与世界贸易最重要的发明。Docker 将集装箱思想运用到软件打包上为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统 上。其实“集装箱” 和 “容器” 对应的英文单词都是 “Container”。“容器” 是国内约定俗成的叫法可能是因为容器比集装箱更抽象更适合软件领域的原故吧。我个人认为在老外的思维中“Container” 只用到了集装箱这一个意思Docker 的 Logo 不就是一堆集装箱吗Docker 的特性我们可以看看集装箱思想是如何与 Docker 各种特性相对应的。特性集装箱Docker打包对象几乎任何货物任何软件及其依赖硬件依赖标准形状和接口允许集装箱被装卸到各种交通工具整个运输过程无需打开容器无需修改便可运行在几乎所有的平台上 – 虚拟机、物理机、公有云、私有云隔离性集装箱可以重叠起来一起运输香蕉再也不会被铁桶压烂了资源、网络、库都是隔离的不会出现依赖问题自动化标准接口使集装箱很容易自动装卸和移动提供 run, start, stop 等标准化操作非常适合自动化高效性无需开箱可在各种交通工具间快速搬运轻量级能够快速启动和迁移职责分工货主只需考虑把什么放到集装箱里承运方只需关心怎样运输集装箱开发人员只需考虑怎么写代码运维人员只需关心如何配置基础环境容器的优势对于开发人员 -Build Once, Run Anywhere容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境然后打包成容器便可在其他机器上运行。另外容器环境与所在的 Host 环境是隔离的就像虚拟机一样但更快更简单。对于运维人员 -Configure Once, Run Anything只需要配置好标准的 runtime 环境服务器就可以运行任何容器。这使得运维人员的工作变得更高效 一致和可重复。容器消除了开发、测试、生产环境的不一致性。How - 容器是如何工作的从下节开始我们将学习容器核心知识的最主要部分。首先会介绍 Docker 的架构然后分章节详细讨论 Docker 的镜像、容器、网络和存储。容器与虚拟机比较谈到容器就不得不将它与虚拟机进行对比因为两者都是为应用提供封装和隔离。容器由两部分组成应用程序本身依赖比如应用程序需要的库或其他软件容器在 Host 操作系统的用户空间中运行与操作系统的其他进程隔离。这一点显著区别于的虚拟机。传统的虚拟化技术比如 VMWare, KVM, Xen目标是创建完整的虚拟机。为了运行应用除了部署应用本身及其依赖通常几十 MB还得安装整个操作系统几十 GB。下图展示了二者的区别如图所示所有的容器共享同一个 Host OS这使得容器在体积上要比虚拟机小很多。另启动容器不需要启动整个操作系统容器部署和启动速度更快开销更小也更容易迁移。容器可以在核心CPU本地运行指令而不需要任何专门的解释机制。与虚拟化相比这样既不需要指令级模拟也不需要即时编译。特性容器虚拟机启动速度秒级分钟级性能接近原生较弱内存代价很小较多硬盘使用一般为MB一般为GB运行密度单击支持上千个容器一般几十个隔离性安全隔离完全隔离Docker介绍Docker是基于Go语言实现的开源容器项目诞生于2013年年初最初发起者是dotCloud公司。Docker 自开源后受到广泛的关注和讨论逐渐形成了围绕Docker容器的生态体系。由于Docker在业界造成的影 响力实在太大dotCloud公司后来也直接改名为Docker Inc并专注于 Docker相关技术和产品的开发。Docker提供了各种容器管理工具如分发、版本、移植等让用户无需关注底层的操作可以更简单明了地管理和使用容器其次Docker引入分层文件系统构建和高效的镜像机制降低了迁移难度极大地提升了用户体验。用户操作Docker容器就像操作应用自身一样简单。简单地讲可以将Docker容器理解为一种轻量级的沙盒sandbox。**每个容器内运行着一个应用不同的容器相互隔离容器之间也可以通过网络互相通信。**容器的创建和停止都十分快速几乎跟创建和终止原生应用一致另外容器自身对系统资源的额外需求也十分有限远远低于传统虚拟机。很多时候甚至直接把容器当作应用本身也没有任何问题。Docker版本Docker CE在17.03版本之前叫Docker EngineDocker Engine的版本号范围:0.1.0~1.13.1。在2017年3月2日,docker团队宣布企业版Docker Enterprise Edition(EE)发布.为了一致,免费的Docker Engine改名为Docker Community Edition(CE),并且采用基于时间的版本号方案.就在这一天,Docker EE和 Docker CE的17.03版本发布,这也是第一个采用新的版本号方案的版本。Docker CE/EE每个季度发布一次季度版本,也就是说每年会发布4个季度版本,17.03,17.06,17.09,17.12就 是2017年的4个季度版本的版本号,同时Docker CE每个月还会发布一个EDGE版本比如 17.04,17.05,17.07,17.08,17.10,17.11.Docker CE季度版本自发布后会有4个月的维护期Docker EE季度版本自发布后会有12个月的维护期.在基于时间的发布方案中版本号格式为:YY.MM.YY.MM代表年月patch代表补丁号从0开始在 季度版本(如17.03)的维护期内bug修复相关的更新会以patch递增的方式发布,比如17.03.0-17.03.1- 17.03.2.Docker核心概念Docker的大部分操作都围绕着它的三大核心概念——镜像、容器和仓库而展开。Docker镜像Docker镜像类似于虚拟机镜像可以将它理解为一个只读的模板。例如一个镜像可以包含一个基本的 操作系统环境里面仅安装了Apache应用程序或用户需要的其他软件。可以把它称为一个Apache镜 像。镜像是创建Docker容器的基础。通过版本管理和增量的文件系统Docker提供了一套十分简单的机 制创建和更新现有的镜像用户甚至可以从网上下载一个已经做好的应用镜像并直接使用。Docker容器Docker容器类似于一个轻量级的沙箱Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运 行实例。可以将其启动、开始、停止、删除而这些容器都是彼此相互隔离的、互不可见的。可以把容 器看做是一个简易版的Linux系统环境包括root用户权限、进程空间、用户空间和网络空间等以及运 行在其中的应用程序打包而成的盒子。Docker仓库Docker仓库类似于代码仓库它是Docker集中存放镜像文件的场所。仓库注册服务器存放着很多类镜像每类镜像包括多个镜像文件通过不同的标签tag来进行区分。例如存放Ubuntu操作系统镜像的分类中可能包括1804、1604、14.04、12.04等不同版本的镜像。根据所存储的镜像公开分享与否Docker仓库可以分为:公开仓库Public私有仓库Private目前最大的公开仓库是官方提供的Docker Hub其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商如时速云、阿里云等也提供了仓库的本地源可以提供稳定的国内访问。当然用户如果不希望公开分享自己的镜像文件Docker也支持用户在本地网络内创建一个只能自己访 问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓 库。这样用户下次在另外一台机器上使用该镜像时只需要将其从仓库上pull下来就可以了。007 Docker架构详解完整的Docker由以下几部分构成:(1) 守护进程(Daemon)Docker守护进程(dockerd)侦听Docker API请求并管理Docker对象,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。(2) REST API: 主要与Docker Daemon进行交互比如Docker Cli或者直接调用REST API(3) 客户端(Docker Client): 它是与Docker交互的主要方式通过命令行接口(CLI)客户端(docker命令)客户机将命令通过REST API发送给并执行其命令(4) Register Repository 镜像仓库: Docker注册表存储Docker镜像可以采用Docker Hub是公共注册仓库或者采用企业内部自建的Harbor私有仓库;(5) Image 镜像: 映像是一个只读模板带有创建Docker容器的指令。映像通常基于另一个映像还 需要进行一些额外的定制你可以通过Docker Hub公共镜像仓库进行拉取对应的系统或者应用镜 像;(6) Container 容器: 容器是映像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、 移动或删除容器。您可以将一个容器连接到一个或多个网络将存储附加到它甚至根据它的当前 状态创建一个新映像。(7) Services : Docker引擎支持集群模式服务允许您跨多个Docker守护进程()扩展管理容器服务允 许您定义所需的状态例如在任何给定时间必须可用的服务副本的数量。默认情况下服务在所有 工作节点之间进行负载平衡。对于使用者来说Docker服务看起来是一个单独的应用程序Docker 的核心组件包括Docker 客户端 - ClientDocker 服务器 - Docker daemonDocker 镜像 - ImageRegistryDocker 容器 - ContainerDocker 架构如下图所示Docker 采用的是 Client/Server 架构。客户端向服务器发送请求服务器负责构建、运行和分发容器。 客户端和服务器可以运行在同一个 Host 上客户端也可以通过 socket 或 REST API 与远程的服务器通 信。Docker 内部具体实现:用户是使用Docker Client与Docker Daemon建立通信并发送请求给后者。Docker Daemon作为Docker架构中的主体部分首先提供Docker Server的功能使其可以接受 Docker Client的请求。Docker Engine执行Docker内部的一系列工作每一项工作都是以一个Job的形式的存在。Job的运行过程中当需要容器镜像时则从DockerRegistry中下载镜像并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储。当需要为Docker创建网络环境时通过网络管理驱动Networkdriver创建并配置Docker容器网络环境。当需要限制Docker容器运行资源或执行用户指令等操作时则通过Exec driver来完成。Libcontainer是一项独立的容器管理包Networkdriver以及Execdriver都是通过Libcontainer来实现具体对容器进行的操作。Docker 客户端最常用的 Docker 客户端是docker命令。通过docker我们可以方便地在 Host 上构建和运行容器。docker支持很多操作子命令后面会逐步用到。[rootdocker ~]# dockerUsage:docker[OPTIONS]COMMAND A self-sufficient runtimeforcontainers Common Commands: run Create and run a new container from an imageexecExecute acommandina running containerpsList containers build Build an image from a Dockerfile pull Download an image from a registry push Upload an image to a registry images List images login Loginto a registrylogoutLog out from a registry search Search Docker Hubforimages version Show the Docker version information info Display system-wide information Management Commands: builder Manage builds buildx* Docker Buildx compose* Docker Compose container Manage containers context Manage contexts image Manage images manifest Manage Docker image manifests and manifest lists network Manage networks plugin Manage plugins system Manage Docker trust Manage trust on Docker images volumeManage volumes Swarm Commands: swarm Manage Swarm Commands: attach Attachlocalstandard input, output, and error streams to a running container commit Create a new image from a containers changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a containers filesystem events Get realtimeevents from the serverexportExport a containers filesystem as a tar archive history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes Global Options: --config string Location of client config files (default /root/.docker) -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with docker context use) -D, --debug Enable debug mode -H, --host list Daemon socket to connect to -l, --log-level string Set the logging level (debug, info, warn, error, fatal) (default info) --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default /root/.docker/ca.pem) --tlscert string Path to TLS certificate file (default /root/.docker/cert.pem) --tlskey string Path to TLS key file (default /root/.docker/key.pem) --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Run dockerCOMMAND --helpformoreinformation on a command. Formorehelpon how to use Docker,headto https://docs.docker.com/go/guides/除了docker命令行工具用户也可以通过 REST API 与服务器通信。Docker 服务器Docker daemon 是服务器组件以 Linux 后台服务的方式运行。[rootdocker ~]# systemctl status docker.service● docker.service - Docker Application Container Engine Loaded: loaded(/usr/lib/systemd/system/docker.service;enabled;vendor preset: disabled)Active: active(running)since Mon2024-09-0921:40:20 CST;24h ago Docs: https://docs.docker.com Main PID:2309(dockerd)Tasks:10Memory:136.0M CGroup: /system.slice/docker.service └─2309 /usr/bin/dockerd-Hfd:// --containerd/run/containerd/containerd.sock Sep 0921:40:16dockersystemd[1]: Starting Docker Application Container Engine... Sep 0921:40:17dockerdockerd[2309]:time2024-09-09T21:40:17.80015733508:00levelinfomsgStar Sep 09 21:40:18 docker dockerd[2309]: time2024-09-09T21:40:18.19656671508:00 levelinfo msg[graSep 0921:40:18dockerdockerd[2309]:time2024-09-09T21:40:18.20866686308:00levelinfomsgLoad Sep 09 21:40:19 docker dockerd[2309]: time2024-09-09T21:40:19.58764794308:00 levelinfo msgDefaSep 0921:40:19dockerdockerd[2309]:time2024-09-09T21:40:19.88126709508:00levelinfomsgLoad Sep 09 21:40:19 docker dockerd[2309]: time2024-09-09T21:40:19.95657756508:00 levelinfo msgDockSep 0921:40:19dockerdockerd[2309]:time2024-09-09T21:40:19.95704503608:00levelinfomsgDaem Sep 09 21:40:20 docker dockerd[2309]: time2024-09-09T21:40:20.01458420108:00 levelinfo msgAPISep 0921:40:20dockersystemd[1]: Started Docker Application Container Engine.Docker 镜像可将 Docker 镜像看着只读模板通过它可以创建 Docker 容器。例如某个镜像可能包含一个 Ubuntu 操作系统、一个 Apache HTTP Server 以及用户开发的Web 应用。镜像有多种生成方法可以从无到有开始创建镜像也可以下载并使用别人创建好的现成的镜像还可以在现有镜像上创建新的镜像我们可以将镜像的内容和创建步骤描述在一个文本文件中这个文件被称作 Dockerfile通过执行docker build docker-file命令可以构建出 Docker 镜像后面我们会讨论。Docker 容器Docker 容器就是 Docker 镜像的运行实例。用户可以通过 CLIdocker或是 API 启动、停止、移动或删除容器。可以这么认为对于应用软件镜像是软件生命周期的构建和打包阶段而容器则是启动和运行阶段。RegistryRegistry 是存放 Docker 镜像的仓库Registry 分私有和公有两种。Docker Hubhttps://hub.docker.com/ 是默认的 Registry由 Docker 公司维护上面有数以万计的镜像用户可以自由下载和使用。出于对速度或安全的考虑用户也可以创建自己的私有 Registry。后面我们会学习如何搭建私有 Registry。docker pull 命令可以从 Registry 下载镜像。docker run 命令则是先下载镜像如果本地没有然后再启动容器。docker pull 命令可以从 Registry 下载镜像。下一节我们通过一个例子来看各个组件是如何协调工作的。008 Docker组件如何协作还记得我们运行的第一个容器吗现在通过它来体会一下 Docker 各个组件是如何协作的。容器启动过程如下Docker 客户端执行 docker run 命令。Docker daemon 发现本地没有 httpd 镜像。daemon 从 Docker Hub 下载镜像。下载完成镜像 httpd 被保存到本地。Docker daemon 启动容器。docker images可以查看到 httpd 已经下载到本地。[rootdocker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 9cb0a23156027weeks ago 148MBdocker ps或者docker container ls显示容器正在运行。小结Docker 借鉴了集装箱的概念。标准集装箱将货物运往世界各地Docker 将这个模型运用到自己的设计哲学中唯一不同的是集装箱运输货物而 Docker 运输软件。每个容器都有一个软件镜像相当于集装箱中的货物。容器可以被创建、启动、关闭和销毁。和集装箱一样Docker 在执行这些操作时并不关心容器里到底装的什么它不管里面是 Web Server还是 Database。用户不需要关心容器最终会在哪里运行因为哪里都可以运行。开发人员可以在笔记本上构建镜像并上传到 Registry然后 测试人员将镜像下载到物理或虚拟机做测试最终容器会部署到生产环境。使用 Docker 以及容器技术我们可以快速构建一个应用服务器、一个消息中间件、一个数据库、一个持续集成环境。因为 Docker Hub 上有我们能想到的几乎所有的镜像。不知大家是否意识到潘多拉盒子已经被打开。容器不但降低了我们学习新技术的门槛更提高了效率。如果你是一个运维人员想研究负载均衡软件 HAProxy只需要执行docker run haproxy无需繁琐的手工安装和配置既可以直接进入实战。如果你是一个开发人员想学习怎么用 django 开发 Python Web 应用执行docker run django在容器里随便折腾吧不用担心会搞乱 Host 的环境。在执行这些操作时并不关心容器里到底装的什么它不管里面是 Web Server还是 Database。用户不需要关心容器最终会在哪里运行因为哪里都可以运行。开发人员可以在笔记本上构建镜像并上传到 Registry然后 测试人员将镜像下载到物理或虚拟机做测试最终容器会部署到生产环境。使用 Docker 以及容器技术我们可以快速构建一个应用服务器、一个消息中间件、一个数据库、一个持续集成环境。因为 Docker Hub 上有我们能想到的几乎所有的镜像。不知大家是否意识到潘多拉盒子已经被打开。容器不但降低了我们学习新技术的门槛更提高了效率。如果你是一个运维人员想研究负载均衡软件 HAProxy只需要执行docker run haproxy无需繁琐的手工安装和配置既可以直接进入实战。如果你是一个开发人员想学习怎么用 django 开发 Python Web 应用执行docker run django在容器里随便折腾吧不用担心会搞乱 Host 的环境。不夸张的说容器大大提升了 IT 人员的幸福指数。