容器引擎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 pull
docker pull ubuntu:latest
docker build
docker build -t myapp .
-t
指定镜像标签docker images
docker images
docker rmi
docker rmi
容器操作
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
docker restart
docker restart
docker kill
docker kill
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网络模式
五、数据管理
数据卷(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
限制资源
- 容器启动失败:检查