【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。
相关推荐
huainingning2 小时前
Windows syslog日志服务器搭建与模拟器对接
运维·服务器·智能路由器
say_fall2 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii2 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
相思难忘成疾3 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
PellyKoo3 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
时早玖沐3 小时前
放弃 QQ 官方机器人:用 SnowLuma + AstrBot 自建 QQ 机器人
docker·开源·agent
云飞云共享云桌面3 小时前
1台SolidWorks服务器如何承载10个设计并发?
运维·服务器·网络·3d·制造
未来之窗软件服务4 小时前
WAF负载均衡+蜜罐混淆安全体系-东方仙盟
运维·安全·负载均衡·仙盟创梦ide·东方仙盟·阿雪技术观·网关开发
Linux-lucky4 小时前
46-Linux学习之旅之LVS负载均衡与keepalived高可用
linux·运维·学习·ubuntu·负载均衡·lvs