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

字节跳动工作强度 1045人发布