如何使用 Dockerfile自定义镜像?
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,开始之前之前在隔壁专题(公众号出门左转 Nginx专题) 推送过一篇文章 Nginx 缓存服务器(番外)定制Docker镜像 我们将 ngx_cache_purge模块添加到自定义的 Nginx镜像中
千家信息网最后更新 2025年12月01日如何使用 Dockerfile自定义镜像?
开始之前
之前在隔壁专题(公众号出门左转 Nginx专题) 推送过一篇文章 Nginx 缓存服务器(番外)定制Docker镜像 我们将 ngx_cache_purge模块添加到自定义的 Nginx镜像中,避免每次创建容器后再次安装 ngx_cache_purge模块这个繁琐的步骤。
今天使用一个 Java项目的示例,介绍下如何使用 Dockerfile 创建一个自定义Java镜像,以及在 Dockerfile 中常用的一些指令。
环境描述
容器镜像: openjdk:8-jre容器系统: debian 8 (jessie)Docker主机: Ubuntu Server 16.04CI工具: Jenkins & Maven 项目程序: 编译好的可执行jar包操作步骤
- 准备 Dockerfile 文件
cat bms/Dockerfile# bmsFROM openjdk:8-jreMAINTAINER dongnan# aptCOPY conf/sources.list /etc/apt/sources.listRUN apt-get update && apt-get install -y \ wkhtmltopdf xvfb \ && apt-get clean && rm -r /var/lib/apt/lists/*# envENV TZ=Asia/Shanghai \ LANG=C.UTF-8# packageCOPY src/bms.jar /root/bms.jar# workdirWORKDIR /root/# statement PortEXPOSE 8080# cmdCMD ["java","-jar","/root/bms.jar"]- 构建镜像
守护进程读取Dockerfile文件然后按照文件中的指令顺序执行。构建镜像时会一层层构建,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
docker build -t bms:0.0.1 .Sending build context to Docker daemon 2.048 mb# 省略....Successfully built cd34135ed904注意: docker build 命令最后有一个. 表示当前目录,而 Dockerfile 就在当前目录,是在指定上下文路径。
- 验证镜像
尝试使用这个镜像创建一个容器,如果容器正常运行说明构建成功。
docker run --name test -tid bms:0.0.1镜像使用的是分层存储容器也是如此,每个容器运行时是以镜像为基础层,在其上创建一个当前容器的存储层。
容器运行后修改了容器内的文件,也就是改动了容器的存储层,通过 docker diff 命令看到具体的改动。
docker container diff testC /root # C 改变A /root/logs # A 添加A /root/logs/bms.logC /tmpA /tmp/tomcat-docbase.1383372449962167136.9290- 命令帮助
docker build --helpDockerfile 常用指令
Dockerfile 中每一个指令都会建立一层,上面的示例创建了9层镜像。
FROM: 用于指定基础镜像,一个有效的 Dockerfile 必须使用 FROM做第一个指令。MAINTAINER: 用于设置作者信息。RUN: 是用来执行命令的,并将结果提交到当前镜像层。ENV: 设置环境变量,无论是后面的其它指令,还是运行时的容器,都可以直接使用这个环境变量。COPY: 将从构建上下文目录中 <源> 文件/目录复制到新的一层的镜像内的 <目标> 位置。ADD: 与 `COPY` 指令功能基本一致。但是在 COPY 基础上增加了一些功能,例如 ADD会做自动解压工作。WORKDIR: 用来指定工作目录(**当前目录**),如该目录不存在则会帮你建立目录。EXPOSE: 是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明就会开启这个端口。CMD: 用于指定默认容器主进程的启动命令(容器就是进程,在启动容器的时候需要指定所运行的程序及参数)。Dockerfile 最佳实践
部分摘选
在 Docker 官方的
Dockerfile最佳实践文档中要求尽可能的使用COPY,因为COPY的语义很明确,就是复制文件而已,而ADD最适合使用的场景就是需要自动解压缩的场景。另外需要注意的是
ADD指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。CMD 指令用于执行目标镜像中包含的软件可以包含参数,CMD 大多数情况下都应该以
CMD ["executable", "param1", "param2"...]的形式使用,例如CMD ["nginx", "-g", "daemon off;"]- RUN 与 CMD 的区别,RUN 在构建镜像时执行,CMD则是在镜像构建成功后在容器中执行。
更多内容请参考2号文。
参考文章
doker&k8s Qun [703906133]
镜像
容器
指令
目录
运行
文件
命令
基础
就是
是在
环境
进程
存储
成功
上下
上下文
专题
功能
参数
变量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
cs怎么连接服务器失败
金融信用信息基础数据库暂行规定
定西移动公司网络技术岗位
服务器上的u盘影响起动么
网易服务器的梗
万悦软件开发中心
游戏服务器投入
信息网络安全漏洞分析工具
一个程序怎么插入数据库
几个常用的数据库管理系统
实验1软件开发团队与选题
通信中客服端和服务器有什么区别
网络安全健康上网手抄报内容
家庭网络安全的措施
软件开发的功能测试
视频服务器ip
网络安全与舆情危机处理培训简报
北京畅游网络技术有限公司
分光测色仪软件开发
数据库技术中er图三要素
aif数据库文件
渭南市政务网络安全监测项目
数据库属性和码
软件开发有什么痛点
中电网络安全培训
做网络安全销售年龄多大
计算机网络技术有什么要求
分光测色仪软件开发
泗阳小型网络技术哪家好
宣传网络安全文章