> 技术文档 > 容器引擎Docker与Containerd_docker containerd

容器引擎Docker与Containerd_docker containerd


容器引擎Docker与Containerd

  • 一、Docker基础概念
    • Docker与传统虚拟机的区别
    • Docker核心组件
  • 二、Docker常用命令
    • 镜像操作
    • 容器操作
    • 其他操作
  • 三、Dockerfile构建
    • 核心指令示例
    • 构建镜像
  • 四、Docker网络模式
  • 五、数据管理
    • 数据卷(Volume)
    • 绑定挂载(Bind Mount)
  • 六、Docker Compose
    • YAML配置示例
    • 常用命令
  • 七、Docker Swarm
    • 核心概念
    • 部署服务
  • 八、Docker安全
    • 常见安全问题
    • 最佳实践
  • 九、常见面试问题及示例
    • 1. 如何优化Docker镜像大小?
    • 2. Docker容器如何实现持久化存储?
    • 3. Docker Compose与Kubernetes的区别?
  • 十、Docker与containerd的对比
    • 1. Docker与containerd的关系
    • 2. containerd核心组件
    • 3. containerd常用命令
    • 4. containerd配置管理
    • 5. containerd与Kubernetes集成
    • 6. containerd优势与常见问题
    • 7. containerd与Docker对比

一、Docker基础概念

Docker与传统虚拟机的区别

对比项 Docker 传统虚拟机 资源隔离 使用Linux内核的Cgroups和Namespace实现进程级隔离,资源占用更小 通过Hypervisor隔离整个操作系统,资源消耗大 启动速度 容器秒级启动 需启动Guest OS,耗时较长 镜像体积 通常以MB为单位 以GB为单位 应用兼容性 依赖于宿主机内核,部分特殊应用可能存在兼容性问题 完全独立的操作系统,兼容性较好

Docker核心组件

  • Docker Daemon:守护进程,负责构建、运行和管理Docker容器。它在后台持续运行,监听来自Docker Client的请求。
  • Docker Client:用户交互接口,通过命令行或API与Daemon通信。例如,用户在终端输入docker run命令,就是通过Client将请求发送给Daemon。
  • Registry:镜像仓库(如Docker Hub),用于存储和分发镜像。用户可以从Registry拉取镜像,也可以将自己构建的镜像推送到Registry。
  • Image:只读模板,包含运行容器所需的代码、依赖和配置。可以通过docker pull命令从Registry拉取镜像,如docker pull ubuntu:latest
  • Container:镜像的运行实例,可读写,是Docker的运行单元。使用docker run命令可以基于镜像创建并启动容器,如docker run -it ubuntu bash

二、Docker常用命令

镜像操作

命令 示例 说明 docker pull docker pull ubuntu:latest 从Registry拉取指定标签的镜像 docker build docker build -t myapp . 根据当前目录下的Dockerfile构建镜像,-t指定镜像标签 docker images docker images 列出本地所有镜像 docker rmi docker rmi 删除指定ID的镜像

容器操作

命令 示例 说明 docker run docker run -d -p 80:80 --name web nginx
解释:-d表示后台运行,-p进行端口映射,--name指定容器名称 创建并启动容器 docker ps docker ps 列出正在运行的容器 docker ps -a docker ps -a 列出所有容器(包括已停止的) docker exec docker exec -it bash
解释:-it表示交互式终端,bash为要执行的命令 进入正在运行的容器的终端 docker stop docker stop 停止指定ID的容器 docker restart docker restart 重启指定ID的容器 docker kill docker kill 强制终止指定ID的容器 docker logs docker logs 查看指定容器的日志

其他操作

命令 示例 说明 docker volume create docker volume create myvol 创建一个名为myvol的数据卷 docker network create docker network create mynet 创建一个名为mynet的自定义网络

三、Dockerfile构建

核心指令示例

# 使用Python 3.9的轻量级基础镜像FROM python:3.9-slim # 设置工作目录为/appWORKDIR /app # 将当前目录下的requirements.txt文件复制到工作目录COPY requirements.txt . # 在容器内运行pip安装依赖的命令RUN pip install -r requirements.txt # 将当前目录下的所有文件复制到工作目录COPY . .  # 声明容器将使用的端口EXPOSE 8000  # 容器启动时执行的命令CMD [\"python\", \"app.py\"] 

构建镜像

# 在当前目录下根据Dockerfile构建名为mypythonapp,标签为v1的镜像docker build -t mypythonapp:v1 .

四、Docker网络模式

模式 说明 典型场景 bridge 默认模式,容器通过虚拟网桥通信 单机多容器互联,如一个Web应用容器和一个数据库容器在同一台主机上通信 host 容器共享宿主机网络栈 需要高性能网络的场景,如对网络延迟要求极高的应用 none 容器无网络配置 完全隔离网络的容器,如进行安全测试的容器 overlay 跨主机容器通信(需Docker Swarm) 分布式应用部署,多个主机上的容器组成一个集群

五、数据管理

数据卷(Volume)

# 创建并运行一个Nginx容器,将名为myvol的数据卷挂载到容器的/app/data目录docker run -v myvol:/app/data nginx

绑定挂载(Bind Mount)

# 创建并运行一个Nginx容器,将宿主机的/host/path目录挂载到容器的/container/path目录docker run -v /host/path:/container/path nginx

六、Docker Compose

YAML配置示例

version: \'3.8\'services: web: # 基于当前目录的Dockerfile构建镜像 build: . # 端口映射,将宿主机的8000端口映射到容器的8000端口 ports: - \"8000:8000\" # 依赖于db服务,确保db服务先启动 depends_on: - db db: # 使用PostgreSQL 13的官方镜像 image: postgres:13 # 设置环境变量,用于配置PostgreSQL数据库的密码 environment: POSTGRES_PASSWORD: secret # 将数据卷db_data挂载到容器的/var/lib/postgresql/data目录 volumes: - db_data:/var/lib/postgresql/datavolumes: db_data:

常用命令

# 在后台模式下启动所有服务docker-compose up -d # 停止并清理所有服务及相关资源docker-compose down # 查看所有服务的日志docker-compose logs 

七、Docker Swarm

核心概念

  • Manager Node:负责集群管理和调度,处理集群的配置、节点加入和离开等操作。
  • Worker Node:运行容器任务,根据Manager的调度执行具体的容器实例。
  • Service:定义容器的部署方式(副本数、网络、卷等),可以看作是一组相同容器的抽象。

部署服务

# 初始化Swarm集群,当前节点成为Manager节点docker swarm init # 创建一个名为nginx的服务,运行3个副本,将宿主机的80端口映射到容器的80端口docker service create --replicas 3 -p 80:80 nginx 

八、Docker安全

常见安全问题

  • 镜像包含漏洞:可以通过docker scan命令扫描镜像,如docker scan myapp:v1,检查镜像中是否存在已知的安全漏洞。
  • 容器权限过高:使用--user参数指定非root用户运行容器,如docker run --user 1000:1000 myapp
  • 敏感信息硬编码:使用Secrets或Config管理敏感信息,如在Docker Swarm中创建Secret:
# 创建一个名为db_password的Secret,值为mysecretpasswordecho \"mysecretpassword\" | docker secret create db_password - 

最佳实践

  • 使用最小化基础镜像(如alpine),减少镜像中不必要的组件和依赖。
  • 限制容器资源,如使用--memory--cpu-shares参数,docker run --memory 512m --cpu-shares 512 myapp
  • 定期清理无用镜像和容器,使用docker system prune命令。

九、常见面试问题及示例

1. 如何优化Docker镜像大小?

  • 使用multi - stage build
# 第一阶段:构建阶段FROM python:3.9-slim AS builderWORKDIR /appCOPY requirements.txt .RUN pip install --user -r requirements.txt# 第二阶段:运行阶段FROM python:3.9-slimCOPY --from=builder /root/.local /root/.localCOPY . .ENV PATH=/root/.local/bin:$PATHCMD [\"python\", \"app.py\"]

解释:第一阶段使用较大的基础镜像进行依赖安装,第二阶段使用轻量级基础镜像,只复制运行所需的文件,减少最终镜像大小。

  • 删除不必要的依赖和缓存
FROM ubuntu:latestRUN apt-get update && apt-get install -y some-package \\ && apt-get clean \\ && rm -rf /var/lib/apt/lists/*

解释:在安装完软件包后,及时清理apt缓存和列表文件,减少镜像体积。

2. Docker容器如何实现持久化存储?

  • 数据卷(Volume)
# 创建数据卷docker volume create mydata# 运行容器并挂载数据卷docker run -v mydata:/app/data myapp

解释:创建一个名为mydata的数据卷,然后在运行容器时将其挂载到容器的/app/data目录,容器内对该目录的操作会持久化到数据卷中。

  • 绑定挂载(Bind Mount)
# 运行容器并挂载宿主机目录docker run -v /host/path:/app/data myapp

解释:将宿主机的/host/path目录挂载到容器的/app/data目录,容器内对该目录的操作会直接反映在宿主机的对应目录上。

3. Docker Compose与Kubernetes的区别?

对比项 Docker Compose Kubernetes 适用场景 适用于单机多容器编排,常用于开发和测试环境 用于大规模集群管理,适用于生产环境的分布式应用部署 功能复杂度 功能相对简单,配置文件易于理解和编写 功能强大且复杂,提供了丰富的资源管理和调度策略 扩展性 单机环境下扩展性有限 支持水平扩展和高可用性,可轻松应对大规模应用

十、Docker与containerd的对比

1. Docker与containerd的关系

  • containerd:Docker的底层容器运行时,负责管理容器的生命周期(创建、运行、停止)。
  • Docker架构演进:Docker 1.12+版本将containerd分离为独立项目,作为容器运行时的核心组件。
  • 关键区别
    • Docker提供用户友好的命令行工具和生态(如Docker Compose),而containerd专注于容器运行时的底层实现。
    • containerd支持多种容器格式(如OCI标准),可与Kubernetes直接集成。

2. containerd核心组件

组件名称 功能说明 containerd-shim 容器运行时接口,负责容器与runc的解耦,确保容器进程与守护进程解耦 runc 轻量级容器运行时,基于OCI标准创建和运行容器 cri-containerd Kubernetes CRI(容器运行时接口)适配器,实现containerd与Kubernetes的集成 containerd-stress 压力测试工具,用于验证containerd的性能和稳定性

3. containerd常用命令

# 拉取镜像(通过ctr命令)ctr image pull docker.io/library/nginx:latest# 启动容器(基于OCI规范)ctr run --rm --tty --detach --net-host \\ --mount type=bind,src=/tmp,dst=/app \\ --label app=web \\ docker.io/library/nginx:latest mynginx# 查看运行中的容器ctr container list# 查看容器日志ctr task logs mynginx# 停止容器ctr container stop mynginx

4. containerd配置管理

  • 配置文件路径/etc/containerd/config.toml
  • 常用配置示例
    [plugins.\"io.containerd.grpc.v1.cri\"] sandbox_image = \"k8s.gcr.io/pause:3.6\" # Kubernetes沙箱镜像 enable_selinux = true  # 启用SELinux[plugins.\"io.containerd.runtime.v1.linux\"] runtime_type = \"io.containerd.runc.v2\" # 指定运行时为runc[debug] level = \"debug\" # 设置日志级别为debug

5. containerd与Kubernetes集成

  1. 安装containerd
    # 安装依赖sudo apt-get update && sudo apt-get install -y containerd# 生成配置文件sudo mkdir -p /etc/containerdsudo containerd config default > /etc/containerd/config.toml# 启动服务sudo systemctl enable --now containerd
  2. 配置Kubernetes使用containerd
    # 安装cri-containerd插件wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gzsudo tar zxvf crictl-v1.28.0-linux-amd64.tar.gz -C /usr/local/bin# 修改kubelet配置sudo vi /etc/default/kubeletKUBELET_EXTRA_ARGS=\"--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock\"

6. containerd优势与常见问题

  • 优势
    • 轻量级设计,资源占用低
    • 支持OCI标准,兼容性强
    • 与Kubernetes深度集成,适合云原生场景
  • 常见问题
    • 容器启动失败:检查containerd-shim日志和runc配置
    • 镜像拉取超时:调整镜像仓库地址或增加重试次数
    • 性能问题:优化cgroup参数或使用--cpu-shares限制资源

7. containerd与Docker对比

对比项 Docker containerd 用户接口 提供完整的CLI工具(docker命令) 通过ctr或crictl进行底层操作 生态集成 自带Docker Compose/Swarm 依赖Kubernetes/CRI工具链 镜像格式 支持Docker专有格式 支持OCI标准格式 默认运行时 runc runc/其他OCI兼容运行时