11.1 Docker容器技术
面试重要程度:⭐⭐⭐⭐
常见提问方式:Docker的底层原理是什么?如何优化Docker镜像?
预计阅读时间:30分钟
📋 知识点概览
Docker作为容器化技术的代表,已成为现代软件开发和部署的标准工具。本节将深入讲解Docker的核心概念、底层原理、镜像构建优化以及网络存储机制。
🔧 Docker核心概念与架构
Docker架构组件
/** * Docker架构组件说明 */ public class DockerArchitecture { /** * Docker核心组件 */ public enum DockerComponent { DOCKER_CLIENT("Docker客户端", "用户与Docker交互的接口"), DOCKER_DAEMON("Docker守护进程", "管理容器、镜像、网络等"), DOCKER_REGISTRY("Docker仓库", "存储和分发Docker镜像"), DOCKER_IMAGE("Docker镜像", "容器的只读模板"), DOCKER_CONTAINER("Docker容器", "镜像的运行实例"); private final String name; private final String description; DockerComponent(String name, String description) { this.name = name; this.description = description; } } /** * Docker底层技术 */ public static class DockerTechnology { // Linux命名空间(Namespace) public static final String[] NAMESPACES = { "PID Namespace", // 进程隔离 "NET Namespace", // 网络隔离 "IPC Namespace", // 进程间通信隔离 "MNT Namespace", // 文件系统挂载点隔离 "UTS Namespace", // 主机名和域名隔离 "USER Namespace" // 用户和用户组隔离 }; // Linux控制组(Cgroups) public static final String[] CGROUPS = { "CPU限制", // CPU使用限制 "内存限制", // 内存使用限制 "磁盘IO限制", // 磁盘读写限制 "网络带宽限制", // 网络带宽限制 "设备访问控制" // 设备访问权限 }; // 联合文件系统(Union File System) public static final String[] UNION_FS = { "AUFS", // Advanced Multi-Layered Unification Filesystem "OverlayFS", // Overlay Filesystem "DeviceMapper", // Device Mapper "Btrfs", // B-tree File System "ZFS" // Zettabyte File System }; } }
Docker命令实践
# Docker基础命令示例 # 1. 镜像管理 docker images # 查看本地镜像 docker pull ubuntu:20.04 # 拉取镜像 docker rmi image_id # 删除镜像 docker build -t myapp:v1.0 . # 构建镜像 # 2. 容器管理 docker run -d --name mycontainer ubuntu:20.04 # 运行容器 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器 docker stop container_id # 停止容器 docker rm container_id # 删除容器 # 3. 容器操作 docker exec -it container_id bash # 进入容器 docker logs container_id # 查看容器日志 docker cp file.txt container_id:/path/ # 文件拷贝 # 4. 网络管理 docker network ls # 查看网络 docker network create mynet # 创建网络 docker run --network mynet ubuntu # 指定网络运行容器 # 5. 数据卷管理 docker volume ls # 查看数据卷 docker volume create myvolume # 创建数据卷 docker run -v myvolume:/data ubuntu # 挂载数据卷
🏗️ Dockerfile最佳实践
优化的Dockerfile示例
# Spring Boot应用的优化Dockerfile # 使用多阶段构建 FROM maven:3.8.4-openjdk-17 AS builder # 设置工作目录 WORKDIR /app # 先复制依赖文件,利用Docker缓存 COPY pom.xml . COPY src/main/resources/application.yml src/main/resources/ # 下载依赖(这一层会被缓存) RUN mvn dependency:go-offline -B # 复制源代码 COPY src ./src # 构建应用 RUN mvn clean package -DskipTests # 运行时镜像 FROM openjdk:17-jre-slim # 创建非root用户 RUN groupadd -r appuser && useradd -r -g appuser appuser # 设置工作目录 WORKDIR /app # 安装必要的系统包 RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/* # 从构建阶段复制jar文件 COPY --from=builder /app/target/*.jar app.jar # 创建日志目录 RUN mkdir -p /app/logs && chown -R appuser:appuser /app # 切换到非root用户 USER appuser # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/actuator/health || exit 1 # 暴露端口 EXPOSE 8080 # JVM优化参数 ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:G1HeapRegionSize=16m" # 启动命令 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
镜像构建优化策略
/** * Docker镜像优化策略 */ public class DockerImageOptimization { /** * 镜像大小优化技巧 */ public static class ImageSizeOptimization { public static final String[] OPTIMIZATION_TECHNIQUES = { "使用Alpine Linux基础镜像", "多阶段构建分离构建和运行环境", "合并RUN指令减少镜像层数", "清理包管理器缓存", "删除不必要的文件和依赖", "使用.dockerignore忽略不需要的文件" }; /** * 基础镜像选择建议 */ public static void baseImageRecommendations() { System.out.println("基础镜像选择建议:"); System.out.println("1. Java应用:openjdk:17-jre-slim (约200MB)"); System.out.println("2. Node.js应用:node:18-alpine (约170MB)"); System.out.println("3. Python应用:python:3.9-slim (约150MB)"); System.out.println("4. Go应用:scratch或alpine (约5-10MB)"); System.out.println("5. Nginx:nginx:alpine (约25MB)"); } } /** * 构建缓存优化 */ public static class BuildCacheOptimization { /** * 依赖缓存优化示例 */ public static String getOptimizedDockerfile() { return """ # 错误做法:每次代码变更都要重新下载依赖 # COPY . . # RUN mvn clean package # 正确做法:先复制依赖文件,利用缓存 COPY pom.xml . RUN mvn dependency:go-offline # 然后复制源代码 COPY src ./src RUN mvn clean package -DskipTests """; } /** * 层缓存策略 */ public static String[] getLayerCacheStrategies() { return new String[]{ "将变化频率低的操作放在前面", "将变化频率高的操作放在后面", "合理使用COPY指令的缓存特性", "避免在同一层中混合不同类型的操作" }; } } }
🌐 Docker网络机制
网络模式详解
/** * Docker网络模式 */ public class DockerNetworking { /** * Docker网络驱动类型 */ public enum NetworkDriver { BRIDGE("bridge", "默认网络模式,容器间可通信"), HOST("host", "容器使用宿主机网络"), NONE("none", "容器没有网络接口"), OVERLAY("overlay", "跨主机容器通信"), MACVLAN("macvlan", "容器分配MAC地址");
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经