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圣经

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-16 14:45
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务