目录
1.容器是什么
Docker是一个容器引擎,是容器化的一种实现,学习Docker首先要学习一下容器是什么。
1.1 容器的基本概念
容器是一种虚拟化技术,通过在操作系统级别对应用及其依赖进行封装,使其能够在不同的环境中运行。每个容器都包含了应用运行所需的所有组件:代码、运行时、系统工具、系统库等。
简单来说:容器就是将应用程序及其需要的依赖项封装成一个独立,可移植环的标准单元。
根据上图可以看出来容器需要与主机共享操作系统的内核,并不是独立完整的操作系统,因此容器比虚拟化更轻量级,对资源的消耗小很多。容器操作也更快捷,启动和停止都要比虚拟机快,具体的差异我们会在2.3节中进行详细的对比。
1.2 容器的优势
容器化带来了诸多优势,包括:
- 轻量级:容器共享主机内核,因此比传统虚拟机更轻量。
- 快速部署:容器可以快速启动、停止和重启,提高了开发和部署的效率。
- 隔离性:容器将应用程序隔离在独立的环境中,确保了应用程序之间的互不干扰和安全性。
- 一致性:容器在不同环境中运行时,确保了应用及其依赖的一致性,消除了“在我的机器上可以工作”的问题。
- 弹性:容器可以根据负载需求进行自动伸缩,提高了系统的弹性和稳定性。
- 自动化:容器技术提供了自动化的部署、配置和管理工具,简化了应用程序的开发和运维过程。
2.Docker是什么
基于对容器的概念有了一定的了解后,接下来开始学习Docker到底是什么。
2.1 Docker是什么
Docker 是一个开源的容器化技术,使用 Go 语言编写,遵循 Apache 2.0 协议。它提供了一种简单的方式来打包、分发和运行应用程序,而无需关心底层的基础设施。Docker 的核心是一个名为“容器”的运行时环境,它将应用程序及其依赖项封装在一个隔离的环境中,使得应用程序可以在不同的环境中无缝迁移。
以下是 Docker 的几个主要特点:
- 轻量级:Docker只包含应用程序及其依赖项,不包含操作系统,因此体积小、启动速度快
- 标准化封装:Docker 使用了一个名为“镜像”的模板来创建容器,使得应用程序的部署和管理更加标准化。
- 自动化部署:Docker 提供了一组简单的命令和工具,使得开发者可以轻松地将应用程序部署到生产环境。
- 快速扩展:Docker 可以轻松地横向和纵向扩展应用程序的性能,以满足不同规模的需求。
- 安全隔离:Docker 提供了隔离的容器环境,确保应用程序之间的互不干扰和安全性。
通过 Docker,开发者可以更加高效地部署和管理应用程序,让开发者将更多的精力放在应用程序本身上。
2.2 Docker的发展历程
- Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
- Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
- Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runC 和 containerd。
2.3 Docker的设计理念
我们可以看到docker的logo 是一个蓝色的鲸鱼,上面托着很多集装箱在运输。其中鲸鱼可看做宿主机,集装箱可理解为相互隔离的容器,每个集装箱都包含了自己的应用程序。这个logo就体现了Docker的设计理念Build,Ship and Run any App,Angwhere。
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
2.4 虚拟机 VS 容器
(1)架构差异
虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多;
容器内的应用进程直接运行于Linux本机,容器内没有自己的内核,与其他容器共享主机内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便;
(2) 其他特性对比
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级(进程控制) | 分钟级(客户机操作系统管理) |
性能损耗 | 接近原生 | 弱于 |
磁盘占用 | 镜像为MB级别 | 镜像为GB级别 |
系统支持量 | 单机支持上千(进程) | 一般为几十台(操作系统级别) |
隔离性 | 进程隔离 | 系统隔离 |
封装程度 | 只打包应用程序和依赖,共享主机内核 | 完整操作系统,与主机隔离 |
总结来说,
容器将一个应用程序和所依赖的资源打包在一起,多个容器在同一主机上运行,共享操作系统,但属于各个独立的进程,镜像一般只有几十兆,启动会非常迅速。
虚拟机是基于宿主机上再建立一台客户机,是拥有完整操作系统的,是将一台服务器扩展为多个服务器,镜像需要包含完整的操作系统,因此是GB级,启动也是系统级的启动,会相对比较缓慢。
3.Docker能做什么
Docker可以用于以下场景:
- 自动化部署:Docker可以自动化应用程序的部署过程,使得应用程序可以在不同的环境之间快速、一致地部署。
- 弹性伸缩:通过Docker,可以轻松地扩展应用程序的性能,根据需求进行横向扩展和纵向扩展。
- 持续集成和持续部署:Docker可以简化持续集成和持续部署的过程,使得开发和运维团队可以更加高效地协作。
- 微服务架构:Docker可以帮助实现微服务架构,将应用程序拆分成多个独立的服务,每个服务运行在独立的容器中。
- 多租户隔离:通过Docker,可以实现多租户隔离,确保不同用户的应用程序在共享计算资源时互不干扰。
- 云原生应用:Docker是云原生应用的重要组成部分,它使得应用程序更加适应云计算环境,提高了应用程序的可移植性和可靠性。
4.Docker的核心概念
4.1 镜像(Image)
用于创建Docker容器的模板,它包含了应用程序及其依赖项。Docker镜像可以通过Dockerfile进行构建,并可以共享和分发。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
4.2 容器(Container)
容器是Docker的基本运行单元,它基于Docker镜像创建。每个容器都是一个独立的运行环境,包含了应用程序的运行所需的一切。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
4.3 仓库(Registry)
仓库用于存储和分发Docker镜像。
- 公有仓库:Docker Hub是一个公共的Docker仓库,供开发者上传和下载镜像。在国内访问Docker Hub 可能会比较慢,国内也有一些服务商提供公开服务,比如阿里云等。
- 私有仓库:除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
4.4 Docker架构
了解了Docker的三个基本概念,下面来看Docker的架构图,来看一下Docker利用这三个核心是怎么运作的。
Docker的运作的基本流程为:
- 用户使用Docker Client 与Docker Daemon建立通信,并发送请求给后者。
- Docker Daemon 作为Docker架构中的主体,首先提供Docker Server的功能使其可以接收Docker Client 的请求。
- Docker Engine 执行Docker 内部的一系列工作,每一项工作都是以一个Job的形式存在。
- Job的运行过程中,当需要容器镜像时,从Docker Registry中下载镜像,并通过镜像驱动管理将下载的镜像以Graph的形式存储。
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境。
- 当需要限制 Docker容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成。
- Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
5.其他容器化实现
除了Docker外,还有其他容器化实现,例如:
- Kubernetes:一个用于自动部署、扩展和管理容器化应用程序的开源系统。
- Podman:一个基于libpod的容器引擎,兼容Docker CLI,并支持Rootless模式。
- rkt(Rocket):由CoreOS开发的容器运行时,专注于安全和简洁性。