容器引擎Docker与Containerd

一、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 pulldocker pull ubuntu:latest从Registry拉取指定标签的镜像
docker builddocker build -t myapp .根据当前目录下的Dockerfile构建镜像,-t指定镜像标签
docker imagesdocker images列出本地所有镜像
docker rmidocker rmi <image_id>删除指定ID的镜像

容器操作

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

其他操作

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

三、Dockerfile构建

核心指令示例

# 使用Python 3.9的轻量级基础镜像
FROM python:3.9-slim  

# 设置工作目录为/app
WORKDIR /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/data
volumes:
  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,值为mysecretpassword
echo "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 builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# 第二阶段:运行阶段
FROM python:3.9-slim
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

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

  • 删除不必要的依赖和缓存
FROM ubuntu:latest
RUN 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 ComposeKubernetes
适用场景适用于单机多容器编排,常用于开发和测试环境用于大规模集群管理,适用于生产环境的分布式应用部署
功能复杂度功能相对简单,配置文件易于理解和编写功能强大且复杂,提供了丰富的资源管理和调度策略
扩展性单机环境下扩展性有限支持水平扩展和高可用性,可轻松应对大规模应用

十、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-containerdKubernetes 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/containerd
    sudo 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.gz
    sudo tar zxvf crictl-v1.28.0-linux-amd64.tar.gz -C /usr/local/bin
    
    # 修改kubelet配置
    sudo vi /etc/default/kubelet
    KUBELET_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对比

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值