Docker 镜像与 Dockerfile
type
Post
status
Published
date
Feb 24, 2026
slug
summary
tags
docker
运维
开发
category
技术分享
icon
password
一、Docker 镜像
1. 镜像介绍

- 分层文件系统:镜像由多个只读层组成,容器运行时在其上添加一个可写层。
- 优势:
- 节省空间(层可复用)
- 启动速度快
- 便于共享和分发
- 只读性:镜像本身不可修改,所有修改都在容器层进行。
2. 镜像核心技术
🔁 Copy On Write(COW)
- 写时复制机制:只有在数据被修改时才会复制一份,提升效率和节省资源。
🔗 Union File System(联合文件系统)
- 支持将多个目录(层)合并为一个视图。
- 常用驱动:
overlay2(推荐,性能好)device mapper
镜像命名格式:
仓库名称/镜像名称:TAG标记
二、Dockerfile 定制镜像
1. 使用流程
- 准备工作
- 编写 Dockerfile
(可选)
- 构建镜像:
docker build -t 镜像名:标签 . t my-app:v1:指定镜像名称和标签my-app:镜像名称v1:标签(版本).:构建上下文路径(当前目录)
构建过程输出示例
高级构建选项
- 运行容器测试:
docker run -tid --name=容器名 镜像名:标签 t:分配伪终端(tty)i:保持 STDIN 打开(交互模式)d:后台运行(detach 模式)-name=my-container:指定容器名称p 5000:5000:端口映射(主机端口:容器端口)my-app:v1:使用的镜像
检查镜像详情
运行容器
查看运行状态
访问应用
进入容器调试
查看容器日志
完整示例演示2. 常用指令详解
🏗️
FROM- 指定基础镜像,必须是第一条指令。
- 示例:
⚙️
RUN- 执行命令,每一条
RUN都会创建一个新层。
- 推荐使用
&&连接多个命令以减少层数:
🚀
CMD- 设置容器启动时默认执行的命令。
- 注意事项:
- 应使用前台启动命令(如
httpd -D FOREGROUND) - 若在
docker run中指定命令,会覆盖CMD - 一个 Dockerfile 中只能有一个
CMD
- 示例:
🎯
ENTRYPOINT- 与
CMD类似,但不会被docker run中的命令覆盖。
- 示例:
📂
COPY- 复制本地文件到镜像中。
- 示例:
📦
ADD- 功能类似
COPY,但支持: - URL 下载
- 自动解压压缩包(如
.tar.gz)
- 示例:
🔓
EXPOSE- 声明容器运行时监听的端口。
- 示例:
💾
VOLUME- 定义匿名卷,用于数据持久化。
- 示例:
🌐
ENV- 设置环境变量。
- 示例:
📁
WORKDIR- 设置工作目录,相当于
cd。
- 示例:
👤
USER- 指定运行容器的用户。
- 示例:
三、Dockerfile 应用示例
1. 定制 Nginx 镜像
2. 定制 Spring Boot 镜像
四、Jenkins 自动发布业务容器
1. 准备 Jenkins 环境
2. 安装插件
- Gitee
- Maven Integration
- Publish Over SSH
3. 配置工具
- Git:路径
/usr/bin/git
- Maven:自动安装 3.5 版本
- JDK:指定
JAVA_HOME路径
4. 配置业务服务器 SSH 连接
5. 创建 Jenkins 任务
- 类型:自由风格或 Maven 项目
- 源码管理:Git + Gitee 仓库地址
- 构建触发器:Gitee Webhook 或定时构建
- 构建脚本:包含 Docker 镜像构建与运行命令
6. 发布脚本示例(Execute Shell 或 SSH 发送)
✅ 注意事项与纠错提示
CMD与ENTRYPOINT区别:ENTRYPOINT不会被docker run覆盖,适合固定入口。
ADD与COPY:优先使用COPY,除非需要自动解压或下载。
- 镜像层数优化:合并
RUN命令,使用.dockerignore减少构建上下文。
- 容器端口暴露:
EXPOSE只是声明,实际映射需在docker run中使用p。
Loading...