我来为您整理Docker和容器相关面试题的关键要点:
|问题|关键词/关键概念|
|---|---|
|Docker常用命令?|**镜像**:pull/push/build/images/rmi/tag<br>**容器**:run/start/stop/restart/rm/ps/logs/exec<br>**系统**:info/version/inspect/stats<br>**清理**:prune/system prune|
|Dockerfile是什么?包含哪些指令?|**定义**:构建镜像的文本文件、自动化构建脚本<br>**常用指令**:FROM基础镜像、RUN执行命令、COPY/ADD复制文件、WORKDIR工作目录、EXPOSE端口、CMD/ENTRYPOINT启动命令、ENV环境变量|
|为什么要使用Docker?|**环境一致性**:开发测试生产环境统一<br>**快速部署**:秒级启动、版本管理<br>**资源隔离**:进程/网络/文件系统隔离<br>**高效利用**:共享内核、轻量级<br>**CI/CD**:持续集成交付|
|什么是Docker Compose?|**定义**:多容器编排工具、YAML配置<br>**功能**:定义和运行多容器应用、服务依赖管理、网络配置、数据卷管理<br>**场景**:本地开发环境、测试环境、单机部署|
|容器和虚拟机区别?|**容器**:共享宿主内核、秒级启动、MB级别、进程隔离、轻量级<br>**虚拟机**:独立OS、分钟级启动、GB级别、硬件虚拟化、资源开销大|
|有了Docker为啥还需要k8s?|**编排管理**:大规模容器调度<br>**服务发现**:负载均衡、DNS<br>**自动伸缩**:HPA/VPA<br>**自愈能力**:健康检查、自动重启<br>**滚动更新**:零停机部署<br>**配置管理**:ConfigMap/Secret|
# Docker核心概念详解
## **Docker架构**
```Java
Docker Client(客户端)
↓ REST API
Docker Daemon(守护进程)
├── Images(镜像)
├── Containers(容器)
├── Networks(网络)
└── Volumes(数据卷)
底层技术
├── Namespace(隔离)
├── Cgroups(资源限制)
└── UnionFS(分层存储)
```
## **常用命令详解**
### **镜像操作**
```bash
# 镜像管理
docker pull nginx:latest # 拉取镜像
docker push myapp:v1 # 推送镜像
docker build -t myapp:v1 . # 构建镜像
docker images # 查看镜像列表
docker rmi image_id # 删除镜像
docker tag source:tag target:tag # 标记镜像
docker history image_id # 查看镜像历史
docker save/load # 导出/导入镜像
# 容器操作
docker run -d -p 80:80 nginx # 运行容器
docker ps -a # 查看所有容器
docker exec -it container_id bash # 进入容器
docker logs -f container_id # 查看日志
docker cp file container:/path # 复制文件
docker stats # 查看资源使用
docker inspect container_id # 查看详细信息
# 清理操作
docker system prune -a # 清理所有未使用资源
docker container prune # 清理停止的容器
docker image prune # 清理悬空镜像
docker volume prune # 清理未使用卷
```
## **Dockerfile最佳实践**
```dockerfile
# 多阶段构建示例
# 构建阶段
FROM golang:1.19 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o main .
# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
```
### **Dockerfile指令说明**
|指令|作用|示例|
|---|---|---|
|FROM|基础镜像|FROM alpine:3.14|
|RUN|执行命令|RUN apt-get update|
|COPY|复制文件|COPY app.jar /app/|
|ADD|复制并解压|ADD app.tar.gz /app/|
|WORKDIR|工作目录|WORKDIR /app|
|ENV|环境变量|ENV NODE_ENV=production|
|EXPOSE|声明端口|EXPOSE 8080|
|VOLUME|数据卷|VOLUME["/data"]|
|USER|运行用户|USER nobody|
|CMD|默认命令|CMD["npm", "start"]|
|ENTRYPOINT|入口点|ENTRYPOINT["java", "-jar"]|
|ARG|构建参数|ARG VERSION=latest|
|LABEL|元数据|LABEL version="1.0"|
## **Docker Compose配置**
```yaml
version: '3.8'
services:
web:
build: .
image: myapp:latest
ports:
- "8080:8080"
environment:
- DB_HOST=db
- REDIS_HOST=redis
depends_on:
- db
- redis
volumes:
- ./data:/app/data
networks:
- mynet
restart: always
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydb
volumes:
- db_data:/var/lib/mysql
networks:
- mynet
redis:
image: redis:alpine
networks:
- mynet
volumes:
db_data:
networks:
mynet:
driver: bridge
```
## **容器 vs 虚拟机对比**
|特性|容器|虚拟机|
|---|---|---|
|**启动速度**|秒级|分钟级|
|**镜像大小**|MB级别|GB级别|
|**性能损耗**|几乎无损耗|5-20%损耗|
|**资源利用率**|高(共享内核)|低(独立OS)|
|**隔离性**|进程级隔离|完全隔离|
|**操作系统**|共享宿主OS|独立OS|
|**部署密度**|单机100+|单机10-20|
|**安全性**|相对较弱|强|
## **Docker vs Kubernetes对比**
|维度|Docker|Kubernetes|
|---|---|---|
|**定位**|容器运行时|容器编排平台|
|**规模**|单机/小规模|大规模集群|
|**功能**|容器生命周期管理|编排、调度、自愈、扩缩容|
|**复杂度**|简单|复杂|
|**服务发现**|基础(link)|完善(Service/Ingress)|
|**负载均衡**|无内置|内置多种方式|
|**存储**|Volume|PV/PVC/StorageClass|
|**配置管理**|环境变量|ConfigMap/Secret|
|**滚动更新**|手动|自动化|
|**监控**|基础stats|完整监控体系|
## **为什么需要K8s**
### **Docker的局限性**
- 单机管理,无法跨主机编排
- 缺乏服务发现和负载均衡
- 无自动伸缩能力
- 故障恢复需手动干预
- 配置管理能力弱
### **K8s解决的问题**
```yaml
# 自动化部署和回滚
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3 # 自动维持副本数
strategy:
type: RollingUpdate # 滚动更新
# 服务发现和负载均衡
apiVersion: v1
kind: Service
spec:
selector:
app: myapp
ports:
- port: 80
# 自动伸缩
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
```
## **最佳实践建议**
1. **镜像优化**:
- 使用Alpine等精简基础镜像
- 多阶段构建减小体积
- 合并RUN指令减少层数
- 清理缓存和临时文件
2. **安全建议**:
- 不使用root用户运行
- 定期更新基础镜像
- 扫描镜像漏洞
- 使用私有镜像仓库
3. **性能优化**:
- 合理设置资源限制
- 使用健康检查
- 优化启动顺序
- 日志驱动配置