top of page

了解 Docker:容器与虚拟机的对比优势

过去十年,软件开发和部署经历了飞速发展。其中最显著的变化之一是容器技术的兴起,而 Docker 则引领了这一潮流。容器彻底改变了开发者构建、交付和运行应用程序的方式,为传统的虚拟机 (VM) 提供了一种轻量级的替代方案。本文将探讨 Docker 的概念、容器被广泛应用的原因、容器与虚拟机的比较,并阐述如何使用 CI/CD 流水线将 Docker 镜像构建并部署到 Kubernetes 集群中。



电脑屏幕上显示的 Docker 容器架构图的平视视角


什么是 Docker?为什么容器技术如此流行?

Docker 是一个开源平台,可自动将应用程序部署到轻量级、可移植的容器中。Docker 容器将应用程序及其所有依赖项、库和配置文件打包成一个单一单元,该单元可以在不同的计算环境中一致地运行。


为什么容器被广泛使用


  • 可移植性:容器在任何安装了 Docker 的系统上都能以相同的方式运行,无论是开发人员的笔记本电脑、测试服务器还是云环境。

  • 效率:容器共享宿主操作系统的内核,因此比虚拟机更轻便、启动速度更快。

  • 一致性:开发人员可以确信应用程序在开发、测试和生产环境中表现一致。

  • 隔离:容器将应用程序彼此隔离,防止依赖关系冲突。

  • 可扩展性:容器可以轻松复制和编排,使其成为微服务和云原生应用程序的理想选择。


这些优势使得 Docker 容器成为现代软件开发和部署的标准工具。


Docker容器与虚拟机的比较

Docker 容器和虚拟机都为运行应用程序提供了隔离的环境,但它们实现的方式却截然不同。

方面

Docker容器

虚拟机

建筑学

共享主机操作系统内核,运行隔离的用户空间

在虚拟化硬件上运行完整的客户操作系统

尺寸

轻量级,通常为兆字节

更大,通常有几GB

启动时间

几秒钟或更短

分钟

资源使用情况

低,共享操作系统资源

高,需要专用的操作系统资源

隔离级别

过程级隔离

使用独立操作系统实现更强的隔离性

可移植性

借助 Docker,可在不同系统间实现高度可移植性。

便携式,但需要兼容的虚拟机管理程序

用例

微服务、快速部署、CI/CD 流水线

运行多种操作系统类型、传统应用程序


Docker容器相对于虚拟机的优势


  • 启动和关闭速度更快:容器几乎可以瞬间启动。

  • 更低的资源消耗:容器占用更少的 CPU、内存和存储空间。

  • 管理更简便:更容易构建、发布和更新应用程序。

  • 更适合微服务:容器非常适合小型、模块化的服务。


Docker容器的缺点


  • 隔离性较弱:容器共享宿主机操作系统内核,这可能带来安全风险。

  • 操作系统支持有限:容器通常在兼容的主机上运行 Linux 或 Windows 容器。

  • 不太适合运行多种操作系统类型:虚拟机可以在同一硬件上运行不同的操作系统。


构建 Docker 镜像

创建 Docker 镜像将应用程序打包到容器中的第一步。Docker 镜像包含运行应用程序所需的一切:代码、运行时环境、库和环境变量。


构建 Docker 镜像的步骤


  1. 编写 Dockerfile:此文本文件包含组装镜像的指令。它指定基础镜像、复制文件、安装依赖项并定义启动命令。


以下是一个 Node.js 应用的 Dockerfile 示例:

   -->dockerfile
   FROM node:16-alpine
   WORKDIR /app
   COPY package.json .
   RUN npm install
   COPY . .
   CMD ["node", "index.js"]

构建镜像:使用 Docker CLI 命令从 Dockerfile 构建镜像。

-->bash
docker build -t my-node-app:latest .

在本地测试镜像:运行容器以验证其是否正常工作。

-->bash
docker run -p 3000:3000 my-node-app:latest

将镜像推送到镜像仓库:将镜像上传到容器镜像仓库,例如 Docker Hub 或私有镜像仓库。

-->bash
docker tag my-node-app:latest myrepo/my-node-app:latest
docker push myrepo/my-node-app:latest

使用 CI/CD 将 Docker 镜像部署到 Kubernetes 中

Kubernetes 是一个流行的容器编排平台,能够自动部署、扩展和管理容器化应用程序。将 Docker 与 Kubernetes 和 CI/CD 流水线集成,可以简化软件交付流程。


部署流程概述


  1. 持续集成(CI):开发人员将代码更改推送到版本控制系统(例如Git )。CI 服务器(如Jenkins、GitLab CI 或 GitHub Actions )会自动构建 Docker 镜像、运行测试并将镜像推送到镜像仓库。


  2. 持续部署(CD):一旦镜像进入镜像仓库,CD 流水线就会更新 Kubernetes 集群以使用新的镜像版本。


详细步骤


  • 搭建持续集成(CI)流水线:

- 配置管道,使其在代码提交时触发。

- 包括构建 Docker 镜像、运行单元测试和集成测试等阶段。

- 将测试后的镜像推送到容器镜像仓库。


  • 准备 Kubernetes 清单:

- 定义部署 YAML 文件,指定容器镜像、副本、端口和环境变量。


- 部署示例代码片段:

-->yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-node-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-node-app
      template:
        metadata:
          labels:
            app: my-node-app
        spec:
          containers:
          - name: node-container
            image: myrepo/my-node-app:latest
            ports:
            - containerPort: 3000

使用持续交付工具实现自动化部署:

  • 在流水线中使用Argo CD、Flux 或原生 Kubernetes命令等工具。

- 该管道将更新后的清单应用到集群,从而触发滚动更新。


监控和回滚:

  • 使用 Kubernetes 探针和日志记录监控应用程序运行状况。

- 如果出现问题,请回滚到以前的版本。



从高角度观察 Kubernetes 集群仪表板,显示容器 Pod 和部署情况


实际案例:从代码到 Kubernetes

想象一下,一个团队正在开发一个Web应用程序。他们使用GitHub进行源代码控制,使用GitHub Actions进行持续集成/持续交付(CI/CD)。


  • 当开发者推送代码时,GitHub Actions 会构建一个 Docker 镜像。

  • 该流水线在容器内部运行测试。

  • 如果测试通过,则将镜像推送到 Docker Hub。

  • 然后,该流水线使用新的镜像标签更新 Kubernetes 部署清单。

  • 最后,该流水线将清单应用到 Kubernetes 集群,从而在不停机的情况下推出新版本。


该流程减少了人工步骤,加快了发布速度,并确保了不同环境之间的一致性。


概括

Docker 容器提供了一种轻量级、可移植的方式来打包和运行应用程序。与虚拟机相比,容器启动速度更快,资源占用更少,因此非常适合现代开发工作流程和微服务架构。然而,容器的隔离性较差,并且依赖于宿主机操作系统内核。


构建 Docker 镜像包括编写 Dockerfile、构建和测试镜像,以及将其推送到镜像仓库。通过 CI/CD 流水线将这些镜像部署到 Kubernetes 集群中,可以实现交付和扩展的自动化,从而提高可靠性和速度。


bottom of page