Java学习第七十五部分——Docker

目录

[🔍 ​​一、前言提要​](#🔍 一、前言提要)

[⚙️ ​​二、核心概念​​](#⚙️ 二、核心概念)

[🛠️ ​​三、核心技术​​](#🛠️ 三、核心技术)

[⚖️ ​​四、与传统虚拟机的区别​​](#⚖️ 四、与传统虚拟机的区别)

[🚀 ​​五、核心优势​​](#🚀 五、核心优势)

[🌐 ​​六、应用场景​​](#🌐 六、应用场景)

[⚙️ ​​七、核心价值​------对于Java开发​](#⚙️ 七、核心价值——对于Java开发)

[🛠️ ​​八、Java 应用容器化核心步骤​](#🛠️ 八、Java 应用容器化核心步骤)

[⚖️ ​​九、构建 Java 镜像的三种方式对比​​](#⚖️ 九、构建 Java 镜像的三种方式对比)

[🔄 ​​十、容器生命周期管理​​](#🔄 十、容器生命周期管理)

[🔒 ​​十一、环境最佳实践​​](#🔒 十一、环境最佳实践)

[💎 ​​十二、总结​归纳概述​](#💎 十二、总结归纳概述)


🔍 ​​一、前言提要

Docker 是一个​ 开源的容器化平台,允许开发者将应用程序及其依赖环境(如代码、运行时环境、系统工具、配置文件等)打包成一个轻量级、可移植的容器。容器在隔离的环境中运行,确保应用在不同系统(开发、测试、生产环境)中行为一致,实现"​ 一次构建,处处运行​"的目标。

⚙️ ​​二、核心概念​

​1.镜像(Image)​

  • ​静态模板​​:只读文件,包含创建容器所需的全部依赖和配置。镜像是分层的(Layer),每一层代表一次修改(如安装软件包),通过联合文件系统(UnionFS)合并为单一视图。

  • ​来源​ ​:可从公共仓库(如 Docker Hub)下载,或通过 Dockerfile 自定义构建。

2.​​容器(Container)​

  • ​运行实例​​:基于镜像启动的独立进程,拥有隔离的文件系统、网络和资源。容器层是可读写的,修改仅作用于容器层(写入时复制技术),不影响原始镜像。

  • ​生命周期​​:支持创建、启动、停止、删除等操作,秒级启动。

​3.仓库(Repository)​

  • ​镜像存储中心​​:分为公有仓库(如 Docker Hub)和私有仓库(如阿里云容器镜像服务)。用于分发、共享镜像。

🛠️ ​​三、核心技术​

Docker 依赖 Linux 内核的隔离与资源控制技术:

​1.命名空间(Namespaces)​

  • 实现资源隔离:包括进程(PID)、网络(NET)、文件系统(MNT)、用户(USER)等,确保容器间互不影响。

2.​​控制组(Cgroups)​

  • 限制资源使用:如 CPU、内存、磁盘 I/O,防止单个容器耗尽主机资源。

3.​​联合文件系统(UnionFS)​

  • 支持镜像分层:合并多个只读层为一个文件系统,减少冗余存储,加速镜像构建与分发。

⚖️ ​​四、与传统虚拟机的区别​

​特性​ ​Docker 容器​ ​传统虚拟机​
​虚拟化级别​ 操作系统级(共享宿主机内核) 硬件级(通过 Hypervisor)
​启动速度​ 秒级启动 分钟级启动
​资源占用​ 极低(MB 级内存) 高(GB 级内存)
​隔离性​ 进程级隔离 完整系统隔离
​性能损耗​ <5% 15-30%
​镜像大小​ 通常为几十 MB 几 GB 起步

🚀 ​​五、核心优势​

​1.环境一致性​

  • 开发、测试、生产环境完全一致,杜绝"本地能跑,线上崩了"的问题。

​2.高效资源利用​

  • 容器直接共享宿主机内核,无需虚拟化层,资源利用率提升 1-2 个数量级。

3.​​快速部署与扩展​

  • 秒级启动容器,结合编排工具(如 Kubernetes)实现自动扩缩容。

​3.简化 DevOps 流程​

  • 支持持续集成/部署(CI/CD),镜像构建透明化,提升开发与运维协作效率。

🌐 ​​六、应用场景​

1.​​微服务架构​

  • 每个微服务独立容器化,实现模块化部署与扩展。

​2.持续集成与交付(CI/CD)​

  • 自动化构建镜像 → 测试 → 部署流水线,缩短发布周期。

3.​​混合云与跨平台迁移​

  • 容器可在物理机、虚拟机、公有云(如腾讯云 ECS)无缝迁移。

4.​​高密度部署​

  • 单台宿主机运行数百容器,适合云原生与 PaaS 平台。

⚙️ ​​七、核心价值​------对于Java开发

1.​​环境一致性​

  • 消除"本地可运行,生产环境失败"问题,确保开发、测试、生产环境完全一致。

2.​​资源与部署效率​

  • 秒级启动容器,资源占用仅为虚拟机的 1/10,支持快速水平扩展。

3.​​跨平台移植性​

  • 镜像可在任意支持 Docker 的环境中运行(本地服务器、云平台)。

🛠️ ​​八、Java 应用容器化核心步骤​

对于windows系统

一、系统准备

  1. 启用虚拟化(管理员 PowerShell):

dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart

dism.exe /online /enable-feature /featurename:Containers /all /norestart

  1. 安装 WSL (提升性能):

wsl --install

wsl --set-default-version 2

二、安装 Docker Desktop

  1. 下载官方安装包 (Docker Desktop: The #1 Containerization Tool for Developers | Docker

  2. 双击运行安装(默认配置即可)

三、验证安装

docker --version # 输出版本号

docker run hello-world # 测试基础功能

四、性能优化

  1. 配置镜像加速(托盘图标 → Settings → Docker Engine):

{

"registry-mirrors": ["https://docker.m.daocloud.io"]

}

  1. 重启 Docker 生效

> - 国内用户必选镜像加速(阿里云/腾讯云地址同理)

> - 安装完成后需重启系统

对于linux系统

​1. 基础环境搭建​

  • ​安装 Docker​ (以 Ubuntu 为例),打开终端:

    复制代码
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker

    验证安装:docker run hello-world

​2. 编写 Dockerfile​

复制代码
# 多阶段构建示例(推荐)
# 阶段1:使用 JDK 编译应用
FROM maven:3.8-jdk-11 AS builder
WORKDIR /app
COPY src ./src
COPY pom.xml .
RUN mvn clean package -DskipTests

# 阶段2:使用 JRE 运行
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

​关键指令​​:

  • COPY --from:仅复制编译产物,减小镜像体积。
  • EXPOSE:声明容器监听端口(需与 -p 参数映射使用)。

​3. 构建与运行​

  • ​构建镜像​

    复制代码
    docker build -t my-java-app:1.0.0 .
  • ​启动容器​

    复制代码
    docker run -d -p 8080:8080 --name java-container my-java-app:1.0.0

    验证:访问 http://localhost:8080

​4. 多服务管理(Docker Compose)​

复制代码
version: '3'
services:
  app:
    build: .
    ports: ["8080:8080"]
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_password

启动:docker-compose up -d

⚖️ ​​九、构建 Java 镜像的三种方式对比​

​方式​ ​优点​ ​缺点​ ​适用场景​
​仅复制 JAR 包​ 镜像小;无需构建工具 需宿主机预装 Maven/JDK 简单应用,本地调试
​普通 Docker 构建​ 宿主机无需环境;易集成 CI/CD 镜像大(含构建工具) 快速原型验证
​多阶段构建​ 镜像最小;无构建工具;生产安全 需学习多阶段语法 ​生产环境推荐​​ ✅

多阶段构建减小镜像 70%+ 体积(如从 600MB → 150MB)。

🔄 ​​十、容器生命周期管理​

  1. ​编程式控制(Java Docker API)​

    复制代码
    DockerClient dockerClient = DockerClientBuilder.getInstance().build();
    // 创建容器
    CreateContainerResponse res = dockerClient.createContainerCmd("my-java-app:1.0.0").exec();
    // 启动容器
    dockerClient.startContainerCmd(res.getId()).exec();
    // 停止容器
    dockerClient.stopContainerCmd(res.getId()).exec();
  2. ​日志与监控​

  • 查看日志:docker logs -f java-container

  • 资源监控:docker stats java-container

🔒 ​​十一、环境最佳实践​

1.​​镜像优化​​:

  • 使用 slimalpine 基础镜像(如 openjdk:17-jdk-slim)。

  • 漏洞扫描:集成 Trivy(trivy image my-java-app:1.0.0)。

2.​​安全配置​​:

  • 避免 root 用户运行:USER 1001 在 Dockerfile 中指定非特权用户。

  • 设置内存限制:docker run -m 512m ... 防止 OOM。

​3.CI/CD 集成​​:

  • Maven/Gradle 插件自动构建镜像(如 dockerfile-maven-plugin)。

💎 ​​十二、总结​归纳概述

  • Docker 通过轻量级容器技术 ​重塑了应用部署方式,其核心价值在于:​​标准化交付​ ​:以镜像为单元封装应用与环境;极致效率​ ​:秒级启动、低资源损耗;​​生态融合​​:无缝集成云平台(如腾讯云 TKE)、DevOps 工具链及微服务架构。

  • Docker 化 Java 应用的核心在于:​ 通过多阶段构建生成最小镜像 + Compose 管理依赖服务 + 编程式 API 实现自动化运维​。遵循镜像瘦身、漏洞扫描、资源限制三大原则,可显著提升生产环境稳定性与安全性。

📚 ​​延伸学习​ ​:

实践建议从 Docker 官方文档 入手,或参考《Docker 技术入门与实战》。