我来为您整理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. **性能优化**: - 合理设置资源限制 - 使用健康检查 - 优化启动顺序 - 日志驱动配置