简介:Docker 自定义镜像核心原理、Dockerfile 常用指令、两个 Java 项目实战案例、镜像构建与运行命令,后端复习专用。 TOC
一、镜像的本质
镜像本质是一个文件包,里面包含应用程序、程序运行依赖的系统函数库、运行配置等文件。 构建镜像 = 把运行需要的全部文件打包。
部署 Java 应用(裸机 Linux 部署)
- 准备 Linux 服务器
- 安装 JRE 并配置环境变量
- 拷贝 jar 包
- 运行 jar 包
构建 Java 镜像(Docker 镜像打包思路)
- 准备 Linux 运行环境
- 安装 JRE 并配置环境变量
- 拷贝 Jar 包
- 设置应用启动脚本
- 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 在当前目录
实操流程:
-
将 jar 包、Dockerfile、jdk 压缩包上传到虚拟机
-
加载镜像(如有离线镜像包):
docker load -i jdk.tar -
进入 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:端口映射,宿主机端口:容器内端口
复习小结
- 镜像分层:每条指令生成一层,基础镜像可复用,加速构建。
- Dockerfile 核心指令:
FROM选基础镜像、COPY复制文件、RUN执行命令、ENV环境变量、ENTRYPOINT程序入口。 - 两种构建 Java 镜像方案:手动装 JDK(学习理解原理)、直接用 openjdk 基础镜像(生产推荐)。
- 构建镜像:
docker build -t 镜像名:tag .;运行容器:docker run。