docker概述

docker概述

docker是一个基于GO语言实现,用于开发、发布和运行应用程序的开放平台。docker使你能够将应用程序从基础设备中分里出来,以便快速交付软件。docker提供了在称为容器的隔离环境中打包和运行应用程序的能力。隔离和安全性使你可以在给定的主机上同时运行多个容器。容器是轻量级的,并且包含运行应用程序所需的一切,因此你不需要依赖于主机上安装的东西,你可以在工作时共享容器,并确保与你共享的每个人都获得以相同方式工作的相同容器。docker(应用容器引擎)提供了用于管理容器生命周期的工具和平台。

docker为什么出现

一款产品从开发到上线部署的流程通常是这样的:
需要准备两套环境,研发环境(dev)与生产环境(prod)。
开发人员搭建研发环境进行开发,开发过程中需要修改环境变量以及服务配置。
开发人员在完成研发后需要将软件打包并编写部署文档。
产品上线,运维人员拿到开发人员提供的软件安装包与文档,搭建生产环境进行产品部署。
在运维人员部署的过程中往往会遇到下面的问题:
1.产品依赖的软件过多,并且需要同步研发环境修改的配置,工作量较大。
2.由于产品依赖的软件不一定支持跨平台,生产环境与研发环境需要是相同操作系统的服务器
3.新加服务器,需要重新部署
docker的出现解决了这种问题,将环境+服务+配置打成一个镜像(image),运维部署只需要下载镜像运行即可,大大地减少了在生产环境部署的工作量。

docker的历史

2010年
成立了一家做PaaS平台的公司,名为"dotCloud",该公司主要是基于PaaS平台为开发者或开发商提供技术服务。目标是利用一种叫做容器的技术来创建他们称作是"大规模的创新工具":一种任何人都可用使用的编程工具。
2013年
dotCloud创始人Solomon Hykers商量准备开源docker技术,在2013年3月,Docker正式以开源软件形式在pycon网站(https://us.pycon.org/2013/)首次发布。在2013年9月,红帽(RedHat)公司成为Docker的主要合作伙伴,利用docker来驱动他的OpenShift云业务,随后谷歌、亚马逊也迅速在其云服务平台提供了docker的支持。主流云厂商的加入,加速了Docker的发展进度。docker的强大之处在于它通过可移植的形势和易于使用的工具在应用程序和基础设施之间创造了独立性。docker将容器技术大众化,使容器技术成为主流。2013年底,dotCloud公司更名为docker公司。
2014年
2014年6月在dockerCon大会上docker正式发布了docker1.0版本,会议上同时发布了docker image的镜像仓库docker hub(https://www.docker.com/products/docker-hub/)。同样在2014年6月,基于谷歌内部强大的Borg系统而开发出来的容器编排工具kubernetes诞生。2014年12月,dockerConEU大会上,docker swam(docker集群管理工具)和 docker machine(部署docker主机的命令工具)同时面世。
2015年
容器技术不只docker,很早之前Google就投资了CoreOS来做竞争的容器--Rocket。那时是三家鼎立:docker|Rocket|Warden,为了避免惨烈的竞争,大家统一了意见,决定成立固定的标准来良好发展容器技术。2015年6月,由docker、IBM、微软、红帽、Google等厂商组成的开发容器项目OCP联盟成立,该项目目的是建议软件容器的通用标准。
2016年
2016年6月,dockercon大会上,docker宣布了Open Container Initiative的正式成立。OCI标准指定后,docker将containerd独立拆分,由开源社区独立发展和运营。containerd完全可以单独运行并管理容器,而containerd的主要职责是镜像管理和容器执行。当人们认识到容器技术本身的价值在于容器的编排时,docker却放弃了swarm项目,而是想将容器的编排和集群管理功能添加到docker项目中,相对的,kubernetes推进民主化架构,通过暴露Kubernetes API的方法,让更多的人来不断丰富kubernetes的插件。
2017年
2017年是容器成为主流技术的一年。开源Docker项目正式命名为Moby项目(https://github.com/moby/moby)。github上的docker/docker库也被转移到了moby/moby。并拥有自己的Logo。moby项目属于docker项目的全新上游,docker将是一个隶属于moby的子产品,并将docker拆分为了两个版本-docker社区版(Community Edition,又称为docker-ce)和docker企业版(Enterprise Edition,又称为docker-ee)。
docker-ce是docker公司维护的开源项目,是一个基于Moby项目的免费容器产品。
docker-ee是docker公司维护的闭源项目,是docker公司的商业产品。
docker社区版(docker-ce)有四个版本,分别是edge、nightly、stable、test。edge与stable两个版本发行。edge版本每月发布(主要面向尝试新功能的用户),stable版本每季度发布(希望更加容易维护的用户),test版本是预发布版本、nightly版本是正在进行中的版本(即正在开发中的版本)
2018年以后
容器市场基本趋于稳定,一切都向着优化改进方向发展。底层容器引擎使用docker。容器的编排经过几轮激烈的竞争后,基本上是Google的kubernets一家独大。

容器化技术

容器与容器镜像

容器是一个标准的软件单元,它将代码及其所有依赖项打包,从而使应用程序能够快速、可靠地从一个环境运行到另一个环境。容器镜像是轻型、独立的可执行软件包,其中包括运行应用程序所需的一切内容:代码、运行时环境、系统工具、系统库和设置。

容器与虚拟机(VM)

容器是一种轻量级的虚拟化技术(应用层的抽象),用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用的空间较少,瞬间就能完成启动。

虚拟机是一种重量级的虚拟化技术(物理硬件层的抽象),用于将一台服务器变成多台服务器。管理程序允许多个虚拟机在一台机器上运行,每个虚拟机都包含一整套操作系统,一个或多个应用,必要的二进制文件和库资源,因此占用大量空间,启动比较缓慢。

特性 容器 虚拟机(VM)
启动 秒级 分钟级
磁盘使用 一般为MB 一般为GB
性能 接近原生 弱于原生
单个系统支持量 支持上千个容器 一般几十个
容器与虚拟机相似,因为它们都提供了可以在其中运行软件的可预测且隔离的环境。但是,因为容器比虚拟机小,所以它们需要的RAM更小,并且更容易在服务器之间移动。此外,它们还可以更快地启动(通常仅需一两秒钟),因为它们既不必虚拟化硬件,也不必加载和初始化操作系统。即使容器本身完全不同(包含不同的软件且创建自不同的容器镜像),在同一台服务器运行的多个容器也共享相同的操作系统内核。

容器和虚拟机并不互斥。实际上,它们经常一起使用。如果Windows用户在Linux容器中打包的软件,则可在虚拟机中运行Linux,并在虚拟机(VM)中承载docker和容器化软件。

容器并不能替代虚拟机,与虚拟机不同,容器不允许在同一服务器上并行运行多个操作系统。例如,如果主机运行Linux,则该主机上的所有容器也必须使用Linux。此外,由于容器不会对硬件进行虚拟化,因此不适合用于执行涉及与硬件交互的系统级任务的应用程序。

docker架构

docker使用CS(客户端-服务器)架构。docker客户端与docker守护进程通信,后者完成构建、运行和分配docker容器的繁重工作。docker客户端和守护进程可以运行在同一个系统上,或者你可以将docker客户端远程连接到docker守护进程。docker客户端和守护进程使用REST API,通过UNIX套接字或网络接口进行通信,另一个docker客户端是docker compose,它允许你处理由一组容器组成的应用程序。

docker daemon(docker 守护进程)
docker守护进程(dockerd)监听docker API请求,管理docker对象,如镜像、容器、网络、卷。守护进程还可以与其他守护进程通信来管理docker服务。

docker client(docker 客户端)
docker客户端(docker)是许多docker用户与docker交互的主要方式。当你使用诸如docker run之类的命令时,docker客户端将这些命令发送给docker守护进程(dockerd),后者执行这些命令。docker命令使用docker API。docker客户端可以与多个守护进程通信。

docker desktop(docker 桌面端)
docker桌面端是一个易于安装的应用程序,适用于Mac,Windows,Linux环境,使你能够构建和共享容器化应用程序和微服务。docker桌面端包括docker守护进程(dockerd)、docker客户端(docker)、docker compose、docker content trust、kubernetes、credential helper。

docker registry(docker 注册中心)
docker注册中心存储docker镜像。docker hub是一个任何人都可以使用的公共注册中心。默认情况下docker会在docker hub上查找镜像。你甚至可以运行自己私人的注册中心。
当你使用docker pull或docker run命令时,docker会从你配置的注册中心中提取所需的镜像。当你使用docker push命令时,docker将你的镜像推送到你配置的注册中心中。

image(镜像)
镜像是一个只读模版,带有创建docker容器的说明。
通常是一个镜像基于另一个镜像,并附加额外的配置。例如你可以构建一个基于ubuntu镜像的镜像,并安装apache web服务和你的应用程序,以及使应用程序运行所需的配置修改。
你可以创建自己的镜像,也可以只使用其他人创建并发布到注册中心的镜像。如果要构建自己的镜像,需要创建一个Dockerfile文件,该文件使用简单的语法来定义创建和运行镜像所需的步骤。Dockerfile中每条命令都会在镜像中创建一个层。当你改变Dockerfile并重建镜像时,只有那些已经改变的层才会被重建。这也是与其他虚拟化技术相比,镜像如此轻量级、小巧、高效的部分原因。

container(容器)
容器是镜像的可运行实例。
你可以使用docker API或客户端(CLI)创建、启动、停止、移动、删除容器。您可以将容器连接到一个或多个网络,挂载存储到容器上,甚至可以根据当前状态创建新镜像。
默认情况下,容器相对较好地与其他容器以及其宿主机隔离。你可以控制容器的网络、存储或其他底层子系统与其他容器以及宿主机的隔离程度。
容器是由其镜像以及在创建或启动它时提供给它的任何配置选项定义的。当容器被删除时,任何未存储在持久化存储中的改动都会消失。

参考资料

https://learn.microsoft.com/zh-cn/training/modules/cmu-virtualization/
https://docs.docker.com/get-started/overview/

posted @ 2024-01-04 19:19  柯南。道尔  阅读(25)  评论(0编辑  收藏  举报