部署项目的发展
- 传统部署适合需要最大性能和可靠性的场景,但在资源利用和管理方面有显著劣势。
- 虚拟化部署提供了良好的资源利用率和隔离性,适用于需要灵活扩展和多租户环境的场景,但存在性能开销。
- 容器部署在轻量级、可移植性和资源利用率方面表现优异,特别适合现代微服务架构和 DevOps 流程,但需要处理隔离性和安全性挑战。
选择适合的部署方式取决于具体的应用需求、性能要求、资源管理和安全考虑。
了解了项目部署的方式,接下来就开始学习当下最热门的容器技术的工具Docker
Docker 容器和传统虚拟机有区别
物理服务器
物理服务器是一种实体的、有形的计算机硬件设备,通常被安置在数据中心或服务器机房中。物理服务器是构建IT基础设施的基石,为各种云服务、虚拟化平台和大型应用提供了必要的计算资源。随着云计算和虚拟化技术的发展,许多企业选择将部分或全部工作负载迁移到云平台,但物理服务器仍然在某些特定场景下扮演着不可替代的角色,特别是在需要高性能、高安全性或特定硬件支持的情况下。
物理服务器与云服务器是虚拟化的关系
- 物理服务器可以作为虚拟化的宿主机,运行多个虚拟机
- 通过虚拟化技术,一台物理服务器可以被划分为多个虚拟服务器(如VPS)
VPS vs ECS
VPS (Virtual Private Server):
- VPS 是在物理服务器上通过虚拟化技术创建的虚拟服务器。
- 每个 VPS 都有独立的操作系统、存储和资源配置。
- VPS 通常由主机服务提供商管理,用户拥有 root 访问权限。
但是VPS有个缺点,不支持自主升降级,不易动态调整,所以有了ECS
ECS (Elastic Compute Service):
- ECS 是云服务提供商(如阿里云、亚马逊 AWS)提供的弹性计算服务。阿里的叫ECS,AWS的叫EC2
- 它是一种虚拟化的计算资源,可以根据需求快速扩展或缩减。
- ECS 实例通常运行在物理服务器上,但用户只需关注自己的虚拟机实例。
但是我们的服务器可能是不同的操作系统,部署应用会有各种的环境依赖问题,所以可以使用虚拟机将环境 + 应用打包
但是这种方法还是太笨重了,所以接下来引入了docker
Docker 是什么?
Docker 是一种开源平台,旨在简化应用程序的开发、部署和运行。通过使用容器技术,Docker 将应用程序及其依赖项打包到一个轻量级、独立的容器中,从而确保在任何环境中都能一致地运行。
docker源码
dockers官网
Namespace 提供了进程隔离,使得容器中的进程看到的系统资源是独立的,与其他容器或主机系统隔离。
Cgroup 用于限制、记录和隔离进程组使用的物理资源(CPU、内存、磁盘 I/O 等)
Docker 的主要特点
-
轻量级:Docker 容器共享主机操作系统的内核,与传统虚拟机相比,更加轻量级,启动速度更快,资源开销更小。
-
一致性和可移植性:Docker 容器包含应用程序及其所有依赖项,确保在不同环境(开发、测试、生产)中的一致运行,从而提高应用程序的可移植性。
-
隔离性:Docker 提供了进程级的隔离,每个容器都有自己独立的文件系统、网络和进程空间,确保应用程序之间的相互隔离。
-
高效资源利用:Docker 容器共享主机的操作系统内核,可以在同一主机上运行更多的容器,从而提高资源利用率。
-
易于集成和扩展:Docker 可以与持续集成和持续部署(CI/CD)工具无缝集成,支持快速开发、测试和部署应用程序。此外,Docker 生态系统中的 Docker Compose 和 Docker Swarm 等工具,使得管理和编排多个容器变得更加简单。
Docker 的基本组件
Docker Engine
- Docker 的核心组件,包括 Docker 守护进程(daemon)和 Docker CLI(命令行接口)。Docker 守护进程负责构建、运行和管理容器,Docker CLI 提供与守护进程交互的命令行工具。
Docker Image
- Docker 镜像是一个只读的模板,用于创建容器。它包含了运行应用程序所需的所有内容,包括代码、运行时、库和配置文件。镜像可以从公共或私有的 Docker 仓库(如 Docker Hub)中获取。
Docker Container
- Docker 容器是镜像的一个运行实例。容器是独立、可执行的软件包,包含了运行应用程序所需的所有内容。它们可以快速启动和停止,并在不同的环境中一致地运行。
Docker Repository
- Docker 仓库用于存储和分发 Docker 镜像。Docker Hub 是一个公共仓库,提供大量的官方和社区构建的镜像。用户也可以创建自己的私有仓库来存储自定义镜像。
Docker daemon
- Docker daemon 监听 Docker API 请求并管理 Docker 对象,如镜像、容器、网络和数据卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
Docker client
- 是许多 Docker 用户与 Docker 交互的主要方式。当你使用
docker run
等命令时,客户端将这些命令发送给 dockerd 执行。Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器,并且可以与多个守护进程通信。
Docker Host
- 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Desktop
- Docker Desktop 是一个适用于 Mac 和 Windows 环境的易于安装的应用程序,使你能够构建和共享容器化的应用程序和微服务。Docker Desktop 包含 Docker 守护进程(dockerd)、Docker 客户端(docker)、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。
Docker Container 生命周期
Docker Container 生命周期,由以下五个状态组成
- Created state
- Running state
- Paused state/unpaused state
- Stopped state
- Killed/Deleted state
1. Created state
docker create --name <name-of-container> <docker-image-name>
2. Running state
在运行状态下,Docker 容器开始执行镜像中提到的命令。要运行 Docker 容器,请使用 docker run 命令。
docker run <container-id>
or
docker run <container-name>
docker run 命令会创建一个容器(如果该容器不存在)。在这种情况下,可以跳过创建容器的步骤。
3. Paused state/unpaused state
在暂停状态下,Docker 容器中当前执行的命令被暂停。使用 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. Stopped state
在停止状态下,容器的主进程被优雅地关闭。Docker 发送 SIGTERM 信号进行优雅关闭,如果需要,会发送 SIGKILL 信号来终止容器的主进程。使用 docker stop 命令来停止容器。
docker stop <container-id or container-name>
重启 Docker 容器相当于执行 docker stop,然后执行 docker run,即停止和运行阶段。
5. Killed/Deleted state
在终止状态下,容器的主进程被突然关闭。Docker 发送 SIGKILL 信号来终止容器的主进程。
docker kill <container-id or container-name>
到此docker 容器的生命结束
参考
Docker Architecture, Life Cycle of Docker Containers and Data Management - DEV Community
docker容器和传统虚拟机有什么区别?_哔哩哔哩_bilibili