容器引擎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核心组件
- 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:latestdocker builddocker build -t myapp .-t指定镜像标签docker imagesdocker imagesdocker rmidocker rmi 容器操作
docker rundocker run -d -p 80:80 --name web nginx解释:
-d表示后台运行,-p进行端口映射,--name指定容器名称docker psdocker psdocker ps -adocker ps -adocker execdocker exec -it bash解释:
-it表示交互式终端,bash为要执行的命令docker stopdocker stop docker restartdocker restart docker killdocker kill docker logsdocker logs 其他操作
docker volume createdocker volume create myvolmyvol的数据卷docker network createdocker network create mynetmynet的自定义网络三、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网络模式
五、数据管理
数据卷(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与containerd的对比
1. Docker与containerd的关系
- containerd:Docker的底层容器运行时,负责管理容器的生命周期(创建、运行、停止)。
- Docker架构演进:Docker 1.12+版本将containerd分离为独立项目,作为容器运行时的核心组件。
- 关键区别:
- Docker提供用户友好的命令行工具和生态(如Docker Compose),而containerd专注于容器运行时的底层实现。
- containerd支持多种容器格式(如OCI标准),可与Kubernetes直接集成。
2. 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集成
- 安装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 - 配置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限制资源
- 容器启动失败:检查


