Appearance
Docker面试题
1. Docker的基本概念
问题:什么是Docker?
答案:
- Docker:开源的容器化平台。
- 特点:
- 轻量级
- 可移植
- 快速启动
- 资源隔离
- 易于管理
2. Docker的架构
问题:Docker的架构有哪些组成部分?
答案:
- Docker Client:Docker客户端。
- Docker Daemon:Docker守护进程。
- Docker Registry:Docker镜像仓库。
- Docker Container:Docker容器。
- Docker Image:Docker镜像。
3. Docker的镜像
问题:什么是Docker镜像?
答案:
- Docker镜像:只读的模板,用于创建容器。
- 特点:
- 分层存储
- 只读
- 可复用
- 可共享
4. Docker的容器
问题:什么是Docker容器?
答案:
- Docker容器:从镜像创建的运行实例。
- 特点:
- 轻量级
- 快速启动
- 资源隔离
- 可移植
5. Docker的Dockerfile
问题:什么是Dockerfile?
答案:
- Dockerfile:用于构建Docker镜像的文本文件。
- 作用:
- 定义镜像的构建过程
- 自动化镜像构建
- 版本控制
示例:
dockerfile
# 基础镜像
FROM openjdk:11
# 维护者
MAINTAINER yourname@example.com
# 工作目录
WORKDIR /app
# 复制文件
COPY target/app.jar /app/app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["java", "-jar", "app.jar"]6. Docker的常用命令
问题:Docker有哪些常用命令?
答案:
bash
# 镜像命令
docker images
docker pull image_name
docker rmi image_name
# 容器命令
docker ps
docker ps -a
docker run image_name
docker stop container_id
docker start container_id
docker rm container_id
# 构建镜像
docker build -t image_name .7. Docker的镜像构建
问题:如何构建Docker镜像?
答案:
bash
# 构建镜像
docker build -t myapp:1.0 .
# 构建镜像并指定Dockerfile
docker build -f Dockerfile -t myapp:1.0 .
# 构建镜像并传递参数
docker build --build-arg VERSION=1.0 -t myapp:1.0 .8. Docker的容器运行
问题:如何运行Docker容器?
答案:
bash
# 运行容器
docker run -d --name myapp myapp:1.0
# 运行容器并映射端口
docker run -d -p 8080:8080 --name myapp myapp:1.0
# 运行容器并挂载目录
docker run -d -v /host/path:/container/path --name myapp myapp:1.0
# 运行容器并设置环境变量
docker run -d -e ENV=value --name myapp myapp:1.09. Docker的容器管理
问题:如何管理Docker容器?
答案:
bash
# 查看容器日志
docker logs container_id
# 查看容器详情
docker inspect container_id
# 进入容器
docker exec -it container_id /bin/bash
# 复制文件
docker cp host_file container_id:/container/path
docker cp container_id:/container/file host_path
# 查看容器资源使用
docker stats container_id10. Docker的网络
问题:Docker有哪些网络模式?
答案:
- bridge:默认网络模式,容器通过bridge网络通信。
- host:容器使用宿主机网络。
- none:容器没有网络。
- container:容器使用另一个容器的网络。
- 自定义网络:用户自定义的网络。
示例:
bash
# 创建自定义网络
docker network create mynetwork
# 连接容器到网络
docker network connect mynetwork container_id
# 断开容器网络
docker network disconnect mynetwork container_id11. Docker的数据卷
问题:什么是Docker数据卷?
答案:
- Docker数据卷:用于持久化数据的目录。
- 作用:
- 数据持久化
- 数据共享
- 数据备份
示例:
bash
# 创建数据卷
docker volume create myvolume
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect myvolume
# 删除数据卷
docker volume rm myvolume12. Docker的Compose
问题:什么是Docker Compose?
答案:
- Docker Compose:用于定义和运行多容器Docker应用的工具。
- 作用:
- 定义多个容器
- 定义容器依赖
- 一键启动多个容器
示例:
yaml
version: '3'
services:
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
environment:
- DB_HOST=db
- DB_PORT=3306
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:13. Docker的Registry
问题:什么是Docker Registry?
答案:
- Docker Registry:Docker镜像仓库。
- 类型:
- Docker Hub:官方镜像仓库
- 私有Registry:私有镜像仓库
- 作用:
- 存储镜像
- 分享镜像
- 版本管理
示例:
bash
# 登录Registry
docker login registry.example.com
# 推送镜像
docker tag myapp:1.0 registry.example.com/myapp:1.0
docker push registry.example.com/myapp:1.0
# 拉取镜像
docker pull registry.example.com/myapp:1.014. Docker的多阶段构建
问题:什么是多阶段构建?
答案:
- 多阶段构建:在Dockerfile中使用多个FROM指令。
- 作用:
- 减小镜像大小
- 优化构建过程
- 分离构建和运行环境
示例:
dockerfile
# 构建阶段
FROM maven:3.8.1-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package
# 运行阶段
FROM openjdk:11
WORKDIR /app
COPY --from=builder /app/target/app.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]15. Docker的健康检查
问题:如何配置健康检查?
答案:
dockerfile
# Dockerfile中配置
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
# 运行容器时配置
docker run --health-cmd="curl -f http://localhost:8080/health || exit 1" \
--health-interval=30s \
--health-timeout=3s \
--health-retries=3 \
myapp:1.016. Docker的资源限制
问题:如何限制容器资源?
答案:
bash
# 限制内存
docker run -m 512m myapp:1.0
# 限制CPU
docker run --cpus="1.5" myapp:1.0
# 限制CPU份额
docker run --cpu-shares=512 myapp:1.0
# 限制磁盘IO
docker run --device-read-bps /dev/sda:1mb myapp:1.017. Docker的日志管理
问题:如何管理Docker日志?
答案:
bash
# 查看容器日志
docker logs container_id
# 查看实时日志
docker logs -f container_id
# 查看最近100行日志
docker logs --tail 100 container_id
# 配置日志驱动
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 myapp:1.018. Docker的安全
问题:如何提高Docker安全性?
答案:
- 使用非root用户:
dockerfile
FROM openjdk:11
RUN useradd -m myuser
USER myuser- 使用只读文件系统:
bash
docker run --read-only myapp:1.0- 限制特权:
bash
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp:1.0- 使用安全扫描工具:
bash
docker scan myapp:1.019. Docker的监控
问题:如何监控Docker?
答案:
- 监控工具:
- Docker Stats
- cAdvisor
- Prometheus + Grafana
- 监控指标:
- CPU使用率
- 内存使用率
- 网络IO
- 磁盘IO
示例:
bash
# 查看容器资源使用
docker stats container_id20. Docker的备份与恢复
问题:如何备份和恢复Docker容器?
答案:
bash
# 导出容器
docker export container_id > container.tar
# 导入容器
docker import container.tar myapp:1.0
# 导出镜像
docker save -o image.tar myapp:1.0
# 导入镜像
docker load -i image.tar
# 备份数据卷
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz /data21. Docker的Swarm
问题:什么是Docker Swarm?
答案:
- Docker Swarm:Docker的原生集群和编排工具。
- 特点:
- 原生支持
- 易于使用
- 高可用
- 负载均衡
示例:
bash
# 初始化Swarm
docker swarm init
# 加入Swarm
docker swarm join --token TOKEN MANAGER_IP:2377
# 部署服务
docker service create --name myapp --replicas 3 myapp:1.0
# 扩展服务
docker service scale myapp=522. Docker的Kubernetes
问题:Docker和Kubernetes有什么区别?
答案:
- Docker:
- 容器运行时
- 单机管理
- 简单易用
- Kubernetes:
- 容器编排平台
- 集群管理
- 功能强大
23. Docker的性能优化
问题:如何优化Docker性能?
答案:
- 镜像优化:
- 使用多阶段构建
- 使用轻量级基础镜像
- 合理使用缓存
- 运行优化:
- 限制资源使用
- 合理配置网络
- 使用数据卷
- 构建优化:
- 使用.dockerignore
- 合理使用缓存
- 并行构建
24. Docker的常见问题
问题:Docker常见问题有哪些?
答案:
- 容器无法启动:
- 检查日志
- 检查端口占用
- 检查资源限制
- 镜像拉取失败:
- 检查网络
- 检查Registry地址
- 检查认证信息
- 容器无法访问网络:
- 检查网络配置
- 检查防火墙
- 检查DNS配置
25. Docker的最佳实践
问题:使用Docker的最佳实践有哪些?
答案:
- 使用多阶段构建减小镜像大小。
- 使用轻量级基础镜像。
- 合理使用缓存优化构建速度。
- 使用.dockerignore排除不必要的文件。
- 使用非root用户运行容器。
- 限制容器资源使用。
- 使用健康检查监控容器状态。
- 使用数据卷持久化数据。
- 使用私有Registry管理镜像。
- 定期更新基础镜像。
- 使用Docker Compose管理多容器应用。
- 使用日志驱动管理日志。
- 使用安全扫描工具扫描镜像。
- 定期备份容器和数据卷。
- 使用监控工具监控容器。
