如何使用 Dockerfile自定义镜像?
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,开始之前之前在隔壁专题(公众号出门左转 Nginx专题) 推送过一篇文章 Nginx 缓存服务器(番外)定制Docker镜像 我们将 ngx_cache_purge模块添加到自定义的 Nginx镜像中
千家信息网最后更新 2025年01月23日如何使用 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 --help
Dockerfile 常用指令
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安全错误
数据库的锁怎样保障安全
安卓app服务器连接
网站打开慢由数据库导致
各专业通用学术型数据库是
云呼互联网科技
数据库字段的长度比例
s4剧本选择决定服务器
奔图网络技术有限公司
迷你服务器软件
魏县坚果软件开发服务
wow服务器pvp
数据库重构重组
网络安全威胁分哪些等级
成都乐云互动网络技术怎么样
我的世界服务器给人管理
厦门微信软件开发商
dell服务器睿频关闭
北京网络软件开发哪家便宜
软件开发竞价语
数据库设计的四种方法
网易租赁服务器mod
网关于网络安全的手抄报
空间数据库引擎的应用模式
软件开发培训班网址是多少
成都软件开发大概要多少钱
NIST数据库几年一更新
服务器管理书籍推荐
网络技术的好处英语
中国的互联网科技公司
天津商业大学网络安全管理工作会
怀旧服能交易的服务器