一、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 <image_id> | 删除指定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 <container_id> bash 解释:-it表示交互式终端,bash为要执行的命令 | 进入正在运行的容器的终端 |
docker stop | docker stop <container_id> | 停止指定ID的容器 |
docker restart | docker restart <container_id> | 重启指定ID的容器 |
docker kill | docker kill <container_id> | 强制终止指定ID的容器 |
docker logs | docker logs <container_id> | 查看指定容器的日志 |
其他操作
| 命令 | 示例 | 说明 |
|---|
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
# 设置工作目录为/app
WORKDIR /app
# 将当前目录下的requirements.txt文件复制到工作目录
COPY requirements.txt .
# 在容器内运行pip安装依赖的命令
RUN pip install -r requirements.txt
# 将当前目录下的所有文件复制到工作目录
COPY . .
# 声明容器将使用的端口
EXPOSE 8000
# 容器启动时执行的命令
CMD ["python", "app.py"]
构建镜像
docker build -t mypythonapp:v1 .
四、Docker网络模式
| 模式 | 说明 | 典型场景 |
|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单机多容器互联,如一个Web应用容器和一个数据库容器在同一台主机上通信 |
| host | 容器共享宿主机网络栈 | 需要高性能网络的场景,如对网络延迟要求极高的应用 |
| none | 容器无网络配置 | 完全隔离网络的容器,如进行安全测试的容器 |
| overlay | 跨主机容器通信(需Docker Swarm) | 分布式应用部署,多个主机上的容器组成一个集群 |
五、数据管理
数据卷(Volume)
docker run -v myvol:/app/data nginx
绑定挂载(Bind Mount)
docker run -v /host/path:/container/path nginx
六、Docker Compose
YAML配置示例
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
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:定义容器的部署方式(副本数、网络、卷等),可以看作是一组相同容器的抽象。
部署服务
docker swarm init
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:
echo "mysecretpassword" | docker secret create db_password -
最佳实践
- 使用最小化基础镜像(如
alpine),减少镜像中不必要的组件和依赖。 - 限制容器资源,如使用
--memory和--cpu-shares参数,docker run --memory 512m --cpu-shares 512 myapp。 - 定期清理无用镜像和容器,使用
docker system prune命令。
九、常见面试问题及示例
1. 如何优化Docker镜像大小?
# 第一阶段:构建阶段
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容器如何实现持久化存储?
docker volume create mydata
docker run -v mydata:/app/data myapp
解释:创建一个名为mydata的数据卷,然后在运行容器时将其挂载到容器的/app/data目录,容器内对该目录的操作会持久化到数据卷中。
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 image pull docker.io/library/nginx:latest
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配置管理
5. containerd与Kubernetes集成
- 安装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
- 配置Kubernetes使用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
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对比
| 对比项 | Docker | containerd |
|---|
| 用户接口 | 提供完整的CLI工具(docker命令) | 通过ctr或crictl进行底层操作 |
| 生态集成 | 自带Docker Compose/Swarm | 依赖Kubernetes/CRI工具链 |
| 镜像格式 | 支持Docker专有格式 | 支持OCI标准格式 |
| 默认运行时 | runc | runc/其他OCI兼容运行时 |