目录
2.3.1 VPS (Virtual Private Server):
2.3.2 ECS (Elastic Compute Service):
4.3 Paused state/unpaused state
前言
本章介绍当下最流行的应用程序部署和管理方法——Docker。Docker的本质是一种容器化技术,它利用Linux内核的特性(如命名空间和控制组)来创建轻量级、隔离的运行环境。首先,我们需要知道为什么要学习这个工具,然后简单的要了解一下他有什么功能,组件等。
接下来需要你携带这几个问题阅读本章内容:
- 什么是应用程序?
- 为什么使用Docker可以简化部署呢?
- 为什么Docker可以创建轻量级、隔离的运行环境?
一、为什么引入容器部署?
1.1 什么是应用程序?
应用程序是为了完成特定任务或提供特定服务而设计的软件。它可以是简单的单一程序,也可以是复杂的多组件系统。
我们可以把它分为应用层和实现层,用户需要简单的使用应用层的接口,就需要程序员解决其代码内部环境的复杂依赖关系。
- 应用层:从用户需求出发的,如:想听音乐,拍照,聊天
- 实现层:从程序员技术实现上的,如:编解码,网络通信,UI
所有的应用程序都有依赖关系,如第三方软件包,系统库,数据库等,其中管理应用程序最复杂的就是解决配置和依赖性的相互冲突,当然有的时候使用不同版本的程序也会冲突,"在我的机器上能运行"问题╮(╯_╰)╭
所以解决依赖性管理的整正解决方案就是隔离
1.2 部署方式发展史
1.3 传统应用程序部署方式
传统上,应用程序通常直接部署在物理服务器或虚拟机上。有很多缺点
- 环境不一致:"在我的机器上能运行"的问题。
- 资源利用率低:单一应用往往无法充分利用服务器资源,多个应用部署在同一服务器可能造成冲突
- 扩展性差:横向扩展困难,通常需要购买新的物理服务器,纵向扩展(增加配置)常需要停机
- 维护复杂且成本高:更新和补丁管理复杂
- 效率低下:部署过程繁琐,容易出错
1.4 容器部署
容器化部署通过提供一致的运行环境、提高资源利用率、简化部署流程、增强可扩展性和可移植性,有效解决了传统部署方式的诸多问题。它不仅改变了应用程序的部署方式,也推动了整个软件开发和运维流程的变革。
相信以上的内容已经可以了解为什么要学习Docker了,接下来就开始了解最热门的容器技术的工具Docker
二、Docker VS 虚拟机
总结比较:
- 资源效率:Docker 容器更轻量级,资源利用率更高。
- 启动速度:Docker 容器启动速度快(秒级),而虚拟机启动较慢(分钟级)。
- 隔离程度:虚拟机提供更强的隔离性,而 Docker 容器是进程级隔离。
- 操作系统支持:虚拟机可以运行不同的操作系统,Docker 主要支持 Linux(Windows 容器正在发展)。
- 性能:Docker 容器性能接近原生,虚拟机有一定性能开销。
- 便携性:Docker 容器更容易分享和部署。
- 应用场景:
- Docker 适合微服务架构、持续集成/部署、开发测试环境。
- 虚拟机适合需要完整 OS 隔离的场景,如运行不同操作系统。
- 安全性:虚拟机提供更高级别的安全隔离。
- 存储空间:Docker 镜像通常较小(MB 级),虚拟机镜像较大(GB 级)。
- 开发环境一致性:Docker 在保证开发、测试、生产环境一致性方面表现更好。
2.1 物理服务器
物理服务器是一种实体的、有形的计算机硬件设备,通常被安置在数据中心或服务器机房中。物理服务器是构建IT基础设施的基石,为各种云服务、虚拟化平台和大型应用提供了必要的计算资源。随着云计算和虚拟化技术的发展,许多企业选择将部分或全部工作负载迁移到云平台,但物理服务器仍然在某些特定场景下扮演着不可替代的角色,特别是在需要高性能、高安全性或特定硬件支持的情况下。
2.2 云服务
云服务器是一种通过互联网提供的虚拟化计算资源,具有弹性扩展、按需付费、自助管理和高可用性等特点,使用户能够灵活、经济地获取和管理IT基础设施,适用于各种规模的应用部署和运算需求。注意:各个云服务厂商对应的产品名称是不一样的,要自行类比
物理服务器与云服务器是虚拟化的关系
- 物理服务器可以作为虚拟化的宿主机,运行多个虚拟机
- 通过虚拟化技术,一台物理服务器可以被划分为多个虚拟服务器(如VPS)
2.3 VPS vs ECS
2.3.1 VPS (Virtual Private Server):
- VPS 是在物理服务器上通过虚拟化技术创建的虚拟服务器。
- 每个 VPS 都有独立的操作系统、存储和资源配置。
- VPS 通常由主机服务提供商管理,用户拥有 root 访问权限。
但是VPS有个缺点,不支持自主升降级,不易动态调整,所以有了ECS
2.3.2 ECS (Elastic Compute Service):
- ECS 是云服务提供商(如阿里云、亚马逊 AWS)提供的弹性计算服务。阿里的叫ECS,AWS的叫EC2
- 它是一种虚拟化的计算资源,可以根据需求快速扩展或缩减。
- ECS 实例通常运行在物理服务器上,但用户只需关注自己的虚拟机实例。
但是我们的服务器可能是不同的操作系统,部署应用会有各种的环境依赖问题,所以可以使用虚拟机将环境 + 应用将其“打包”,但是这种方法还是太笨重了,为了减轻“打包环境”,需要使用docker
2.4 Docker 是什么?
Docker 是一种开源平台,旨在简化应用程序的开发、部署和运行。通过使用容器技术,Docker 将应用程序及其依赖项打包到一个轻量级、独立的容器中,从而确保在任何环境中都能一致地运行。
2.4.1 Docker的本质
Docker是基于进程的技术,但它通过Linux内核的特性提供了更高级别的抽象和管理。可以说,Docker容器是一种特殊的、受控的、隔离的进程运行环境。它既是进程,又比普通进程更加强大和灵活
2.5 为什么Docker可以减轻“打包”步骤?
Docker的本质是一种容器化技术,它利用Linux内核的特性(如命名空间和控制组)来创建轻量级、隔离的运行环境。
关键点:
- 隔离环境:Docker提供了一种方法来打包应用及其依赖,使其在不同环境中一致运行。
- 资源管理:Docker使用Linux的cgroups(控制组)来限制和管理容器的资源使用。
- 文件系统隔离:使用联合文件系统和写时复制技术来管理容器的文件系统
- Namespace (命名空间) 提供了进程隔离,使得容器中的进程看到的系统资源是独立的,与其他容器或主机系统隔离。
- Cgroup (Linux控制组)用于限制、记录和隔离进程组使用的物理资源(CPU、内存、磁盘 I/O 等)
Linux 控制组(cgroup)
明确地告诉内核,必须为进程分配多少CPU和 RAM等资源。 因 为可以将相关的进程添加到一个组, CPU调度器更容易决定如何为组成员分配资源。 cgroup 的使用是必要的,因为容器和虚拟机不同,虚拟机有控制所有资源、实施合理资源分配的虚 拟化管理器,而容器对操作系统来说与常规的进程相似, cgroup试图公平地分配资源
Namespace
Linux 容器提供的隔离是由 Linux 内核的命名空间特性提供的。
目前有6种命名空间:
• IPC (进程间通信)
• Mount (文件系统和挂载点)
• Network (联网)
• PID (进程)
• User (用户 ID)
• UTS (主机名)
每个命名空间提供应用程序之间的边界。 在一个或者多个Linux命名空间内运行时,就称应用程序运行于一个容器之中。
2.6 Docker 的主要特点
-
轻量级:Docker 容器共享主机操作系统的内核,与传统虚拟机相比,更加轻量级,启动速度更快,资源开销更小。
-
一致性和可移植性:Docker 容器包含应用程序及其所有依赖项,确保在不同环境(开发、测试、生产)中的一致运行,从而提高应用程序的可移植性。
-
隔离性:Docker 提供了进程级的隔离,每个容器都有自己独立的文件系统、网络和进程空间,确保应用程序之间的相互隔离。
-
高效资源利用:Docker 容器共享主机的操作系统内核,可以在同一主机上运行更多的容器,从而提高资源利用率。
-
易于集成和扩展:Docker 可以与持续集成和持续部署(CI/CD)工具无缝集成,支持快速开发、测试和部署应用程序。此外,Docker 生态系统中的 Docker Compose 和 Docker Swarm 等工具,使得管理和编排多个容器变得更加简单。
三、Docker 的基本组件
3.1 Docker Engine
- Docker 的核心组件,包括 Docker 守护进程(daemon)和 Docker CLI(命令行接口)。Docker 守护进程负责构建、运行和管理容器,Docker CLI 提供与守护进程交互的命令行工具。
3.2 Docker Image
- Docker 镜像是一个只读的模板,用于创建容器。它包含了运行应用程序所需的所有内容,包括代码、运行时、库和配置文件。镜像可以从公共或私有的 Docker 仓库(如 Docker Hub)中获取。
3.3 Docker Container
- Docker 容器是镜像的一个运行实例。容器是独立、可执行的软件包,包含了运行应用程序所需的所有内容。它们可以快速启动和停止,并在不同的环境中一致地运行。
3.4 Docker Repository
- Docker 仓库用于存储和分发 Docker 镜像。Docker Hub 是一个公共仓库,提供大量的官方和社区构建的镜像。用户也可以创建自己的私有仓库来存储自定义镜像。
3.5 Docker daemon
- Docker daemon 监听 Docker API 请求并管理 Docker 对象,如镜像、容器、网络和数据卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
3.6 Docker client
- 是许多 Docker 用户与 Docker 交互的主要方式。当你使用
docker run
等命令时,客户端将这些命令发送给 dockerd 执行。Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器,并且可以与多个守护进程通信。
3.7 Docker Host
- 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
3.8 Docker Desktop
- Docker Desktop 是一个适用于 Mac 和 Windows 环境的易于安装的应用程序,使你能够构建和共享容器化的应用程序和微服务。Docker Desktop 包含 Docker 守护进程(dockerd)、Docker 客户端(docker)、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。
四、Docker Container 生命周期
理解 Docker 容器的生命周期对于有效管理和维护 Docker 环境至关重要,特别是在设计容器化应用和自动化部署流程时。
Docker 的生命周期指的是 Docker 容器从创建到销毁的整个过程,由以下五个状态组成
- Created state
- Running state
- Paused state/unpaused state
- Stopped state
- Killed/Deleted state
4.1 Created state
创建:这个阶段包括构建或拉取镜像,然后创建容器。容器被创建但还未启动。
docker create --name <name-of-container> <docker-image-name>
4.2 Running state
运行:容器被启动,其中的应用程序开始执行。这是容器的主要工作阶段
要运行 Docker 容器,请使用 docker run 命令。
docker run <container-id>
or
docker run <container-name>
docker run 命令会创建一个容器(如果该容器不存在)。在这种情况下,可以跳过创建容器的步骤。
4.3 Paused state/unpaused state
暂停/恢复(可选):容器可以被暂停,暂时停止其中的所有进程,之后可以被恢复。
使用 docker pause 命令来暂停正在运行的容器。
docker pause container <container-id or container-name>
注意:docker pause 会暂停容器中的所有进程。它发送 SIGSTOP 信号来暂停容器中的进程。
使用 docker unpause 命令来恢复暂停的容器。
然后,Docker 发送 SIGCONT 信号来恢复进程。
docker unpause <container-id or container-name>
4.4 Stopped state
停止:容器可以被停止,可以是优雅停止或强制停止。
Docker 发送 SIGTERM 信号进行优雅关闭,如果需要,会发送 SIGKILL 信号来终止容器的主进程。使用 docker stop 命令来停止容器。
docker stop <container-id or container-name>
重启 Docker 容器相当于执行 docker stop,然后执行 docker run,即停止和运行阶段。
4.5 Killed/Deleted state
销毁:不再需要的容器可以被删除,相关的镜像也可以被清理。
Docker 发送 SIGKILL 信号来终止容器的主进程。
docker kill <container-id or container-name>
到此docker 容器的生命结束
关键点
- 容器可以在停止和运行状态之间多次切换。
- 即使容器停止,其文件系统也会保留,直到容器被显式删除。
- 使用数据卷可以在容器生命周期之外持久化数据。
- 容器的重启策略定义了它在退出时的行为。
- 健康检查可以监控容器内应用的状态。
到此就结束了Docker基础学习,后续还会有更加有趣的docker知识(́◉◞౪◟◉‵)
参考
Docker Architecture, Life Cycle of Docker Containers and Data Management - DEV Community