【docker】#4 | Docker 自定义镜像与 Dockerfile

简介:Docker 自定义镜像核心原理、Dockerfile 常用指令、两个 Java 项目实战案例、镜像构建与运行命令,后端复习专用。 TOC

一、镜像的本质

镜像本质是一个文件包,里面包含应用程序、程序运行依赖的系统函数库、运行配置等文件。 构建镜像 = 把运行需要的全部文件打包。

部署 Java 应用(裸机 Linux 部署)

  1. 准备 Linux 服务器
  2. 安装 JRE 并配置环境变量
  3. 拷贝 jar 包
  4. 运行 jar 包

构建 Java 镜像(Docker 镜像打包思路)

  1. 准备 Linux 运行环境
  2. 安装 JRE 并配置环境变量
  3. 拷贝 Jar 包
  4. 设置应用启动脚本
  5. Java 应用

二、Docker 分层机制

在镜像制作过程中,每一次操作(添加安装包、依赖、配置文件等)都会生成新的一层。

  • 底层基础镜像:已经打包好的系统库、环境、配置。
  • 复用基础镜像:基础镜像本地已经存在时,不需要重复下载,直接复用,节省构建时间。

示例:docker pull redis,提示already exists,代表本地已有该基础镜像,直接复用。

入口:镜像运行入口,一般是程序启动脚本与启动参数。

三、Dockerfile 介绍

Dockerfile 是一个文本文件,里面由一条条指令组成,描述构建镜像需要执行的所有操作。Docker 可以读取 Dockerfile 自动构建镜像。

Dockerfile 常用指令表

表格

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,后续指令可直接使用该变量 ENV key value
COPY 拷贝本地文件到镜像内的指定目录 COPY ./jre11.tar.gz /tmp
RUN 执行 Linux shell 命令,多用于安装、解压等操作 RUN tar -zxvf /tmp/jre11.tar.gz && EXPORT path=/tmp/jre11:$path
EXPOSE 声明容器运行监听端口,仅作为文档提示使用者,不会真正开放端口 EXPOSE 8080
ENTRYPOINT 镜像内应用的启动命令,容器启动时执行 ENTRYPOINT java -jar xx.jar

注意:RUN 里示例原文笔误EXPORTS,正确为EXPORT。

四、Dockerfile 实战案例

案例 1:基于 Ubuntu 手动构建 Java 镜像(手动安装 JDK)

描述:基于 Ubuntu 基础镜像,手动解压、配置 JDK,描述完整镜像结构

复制代码
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK,反斜杠\用于换行,多条命令合并到同一个RUN,减少镜像层数
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 入口,java项目的启动命令(exec数组写法)
ENTRYPOINT ["java", "-jar", "/app.jar"]

案例 2:简化写法,直接使用预制 JDK 基础镜像(推荐)

说明:基础镜像自带 JRE,省去手动解压、配置 JDK 环境变量步骤,Dockerfile 更简洁

复制代码
# 基础镜像(内置jre11运行环境)
FROM openjdk:11.0-jre-buster

# 拷贝jar包到镜像内
COPY docker-demo.jar /app.jar

# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

五、构建自定义镜像(docker build)

写好 Dockerfile 之后,使用docker build构建镜像

复制代码
docker build -t myImage:1.0 .

参数说明:

  • -t:给镜像命名,格式仓库名:版本tag;不写 tag 默认latest
  • .:代表 Dockerfile 在当前目录

实操流程:

  1. 将 jar 包、Dockerfile、jdk 压缩包上传到虚拟机

  2. 加载镜像(如有离线镜像包):docker load -i jdk.tar

  3. 进入 Dockerfile 所在目录

    cd demo/

    构建镜像,命名docker-demo

    docker build -t docker-demo .

六、运行自定义镜像

复制代码
docker run -d --name dd -p 8080:8080 docker-demo

参数说明:

  • -d:后台守护进程运行
  • --name dd:给容器起名字 dd
  • -p 8080:8080:端口映射,宿主机端口:容器内端口

复习小结

  1. 镜像分层:每条指令生成一层,基础镜像可复用,加速构建。
  2. Dockerfile 核心指令:FROM选基础镜像、COPY复制文件、RUN执行命令、ENV环境变量、ENTRYPOINT程序入口。
  3. 两种构建 Java 镜像方案:手动装 JDK(学习理解原理)、直接用 openjdk 基础镜像(生产推荐)。
  4. 构建镜像:docker build -t 镜像名:tag .;运行容器:docker run。
相关推荐
SKH.1 小时前
Linux驱动-led、beep
linux·运维·单片机
TTATTC1 小时前
Android 浏览器死活不弹证书框的那天,我用 .NET MAUI 给 WebView 写了一个 mTLS 拦截器
docker·开源
TTATTC1 小时前
百万行 Trace 交给 AI,方向和验证留给人,一套还原自定义 VMP 保护的分工方法
docker·开源
mklpo1472 小时前
为不支持sse4.2命令集的老旧设备制作Win11 26H2系统镜像,2026-10-11。
运维·windows·python
TTATTC2 小时前
从 proxy_pass 末尾斜杠到 WebAssembly 预压缩:深挖 Nginx 生产环境四大高频踩坑点
docker·开源
TTATTC2 小时前
消灭 AI 编程助手的幻觉代码:拆解 Google 官方文档 MCP 与三大云厂商知识检索架构
docker·开源
碧海银沙音频科技研究院2 小时前
炬芯ATS308X的扩音器:麦克风到扬声器直通功能实现
java·linux·运维
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker Compose 初识与安装
java·开发语言·docker