Skip to content

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.0

9. 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_id

10. Docker的网络

问题:Docker有哪些网络模式?

答案

  • bridge:默认网络模式,容器通过bridge网络通信。
  • host:容器使用宿主机网络。
  • none:容器没有网络。
  • container:容器使用另一个容器的网络。
  • 自定义网络:用户自定义的网络。

示例

bash
# 创建自定义网络
docker network create mynetwork

# 连接容器到网络
docker network connect mynetwork container_id

# 断开容器网络
docker network disconnect mynetwork container_id

11. Docker的数据卷

问题:什么是Docker数据卷?

答案

  • Docker数据卷:用于持久化数据的目录。
  • 作用
    • 数据持久化
    • 数据共享
    • 数据备份

示例

bash
# 创建数据卷
docker volume create myvolume

# 查看数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect myvolume

# 删除数据卷
docker volume rm myvolume

12. 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.0

14. 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.0

16. 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.0

17. 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.0

18. 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.0

19. Docker的监控

问题:如何监控Docker?

答案

  • 监控工具
    • Docker Stats
    • cAdvisor
    • Prometheus + Grafana
  • 监控指标
    • CPU使用率
    • 内存使用率
    • 网络IO
    • 磁盘IO

示例

bash
# 查看容器资源使用
docker stats container_id

20. 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 /data

21. 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=5

22. Docker的Kubernetes

问题:Docker和Kubernetes有什么区别?

答案

  • Docker
    • 容器运行时
    • 单机管理
    • 简单易用
  • Kubernetes
    • 容器编排平台
    • 集群管理
    • 功能强大

23. Docker的性能优化

问题:如何优化Docker性能?

答案

  • 镜像优化
    • 使用多阶段构建
    • 使用轻量级基础镜像
    • 合理使用缓存
  • 运行优化
    • 限制资源使用
    • 合理配置网络
    • 使用数据卷
  • 构建优化
    • 使用.dockerignore
    • 合理使用缓存
    • 并行构建

24. Docker的常见问题

问题:Docker常见问题有哪些?

答案

  • 容器无法启动
    • 检查日志
    • 检查端口占用
    • 检查资源限制
  • 镜像拉取失败
    • 检查网络
    • 检查Registry地址
    • 检查认证信息
  • 容器无法访问网络
    • 检查网络配置
    • 检查防火墙
    • 检查DNS配置

25. Docker的最佳实践

问题:使用Docker的最佳实践有哪些?

答案

  • 使用多阶段构建减小镜像大小。
  • 使用轻量级基础镜像。
  • 合理使用缓存优化构建速度。
  • 使用.dockerignore排除不必要的文件。
  • 使用非root用户运行容器。
  • 限制容器资源使用。
  • 使用健康检查监控容器状态。
  • 使用数据卷持久化数据。
  • 使用私有Registry管理镜像。
  • 定期更新基础镜像。
  • 使用Docker Compose管理多容器应用。
  • 使用日志驱动管理日志。
  • 使用安全扫描工具扫描镜像。
  • 定期备份容器和数据卷。
  • 使用监控工具监控容器。