首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用 Dockerfile自定义镜像?

如何使用 Dockerfile自定义镜像?

作者头像
用户1560186
发布于 2019-11-21 13:20:41
发布于 2019-11-21 13:20:41
1.9K00
代码可运行
举报
文章被收录于专栏:运维录运维录
运行总次数:0
代码可运行

之前在隔壁专题(公众号出门左转 Nginx专题) 推送过一篇文章 Nginx 缓存服务器(番外)定制Docker镜像

我们将 ngx_cache_purge模块添加到自定义的 Nginx镜像中,避免每次创建容器后再次安装模块这个繁琐的步骤。

今天使用一个 Java项目的示例,介绍下如何使用 Dockerfile 创建一个自定义Java镜像,以及在 Dockerfile 中常用的一些指令。

环境描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
容器镜像: openjdk:8-jre
容器系统: debian 8 (jessie)
Docker主机: Ubuntu Server 16.04
CI工具: Jenkins & Maven
项目程序: 编译好的 bms.jar 包

操作步骤

1. 准备 Dockerfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat bms/Dockerfile

# bms
FROM openjdk:8-jre
MAINTAINER dongnan

# apt
COPY conf/sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
        wkhtmltopdf xvfb \
        && apt-get clean && rm -r /var/lib/apt/lists/*

# env
ENV TZ=Asia/Shanghai \
    LANG=C.UTF-8

# package
COPY src/bms.jar /root/bms.jar

# workdir
WORKDIR /root/

# statement Port
EXPOSE 8080

# cmd
CMD ["java","-jar","/root/bms.jar"]

2. 构建镜像

守护进程读取 Dockerfile 文件然后按照文件中的指令顺序执行。构建镜像时会一层层构建,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build -t bms:0.0.1 .
Sending build context to Docker daemon 2.048 mb
# 省略....
Successfully built cd34135ed904

注意: docker build 命令最后有一个. 表示当前目录,而 Dockerfile 就在当前目录,是在指定上下文路径

3. 验证镜像

尝试使用这个镜像创建一个容器,如果容器正常运行说明构建成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name test -tid bms:0.0.1

镜像使用的是分层存储容器也是如此,每个容器运行时是以镜像为基础层,在其上创建一个当前容器的存储层。

容器运行后修改了容器内的文件,也就是改动了容器的存储层,通过 docker diff 命令看到具体的改动。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker container diff test
C /root         # C 改变
A /root/logs    # A 添加
A /root/logs/bms.log
C /tmp
A /tmp/tomcat-docbase.1383167136.9290

4. 命令帮助

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build --help

Dockerfile 常用指令

Dockerfile 中每一个指令都会建立一层,上面的示例创建了9层镜像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM: 用于指定基础镜像,一个有效的 Dockerfile 必须使用 FROM做第一个指令。
MAINTAINER: 用于设置作者信息。
RUN: 是用来执行命令的,并将结果提交到当前镜像层。
ENV: 设置环境变量,无论是后面的其它指令,还是运行时的容器,都可以直接使用这个环境变量。
COPY: 将从构建上下文目录中 <> 文件/目录复制到新的一层的镜像内的 <目标> 位置。
ADD:`COPY` 指令功能基本一致。但是在 COPY 基础上增加了一些功能,例如 ADD会做自动解压工作。
WORKDIR: 用来指定工作目录(**当前目录**),如该目录不存在则会帮你建立目录。
EXPOSE: 是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明就会开启这个端口。
CMD: 用于指定默认容器主进程的启动命令(容器就是进程,在启动容器的时候需要指定所运行的程序及参数)

Dockerfile 最佳实践

部分摘选

1. 在 Docker 官方的 Dockerfile 最佳实践文档中要求尽可能的使用 COPY,因为COPY 的语义很明确,就是复制文件而已,而 ADD 最适合使用的场景就是需要自动解压缩的场景。

2. 另外需要注意的是ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

3. CMD 指令用于执行目标镜像中包含的软件可以包含参数,CMD 大多数情况下都应该以 CMD ["executable", "param1", "param2"...] 的形式使用,例如 CMD ["nginx", "-g", "daemon off;"]

4. RUN 与 CMD 的区别,RUN 在构建镜像时执行,CMD则是在镜像构建成功后在容器中执行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
学习Docker就应该掌握的dockerfile语法与指令
在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。
霍格沃兹测试开发
2022/06/09
6630
【云原生 | Docker篇】实战Dockerfile(五)
Dockerfile基础知识已经在上一篇做了详细介绍,如果还不是很清楚的同学可以点击传送门再复习一遍。
Lansonli
2022/05/11
8660
【云原生 | Docker篇】实战Dockerfile(五)
【重识云原生】第六章容器6.1.10节——DockerFile解析
        首先通过一张图来了解 Docker 镜像、容器和 Dockerfile 三者之间的关系。
江中散人_Jun
2022/09/30
1.6K0
【重识云原生】第六章容器6.1.10节——DockerFile解析
运维实践|Dockerfile自定义镜像
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
六月暴雪飞梨花
2023/11/28
2790
运维实践|Dockerfile自定义镜像
Dockerfile 指令
1、Dockerfile基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
小手冰凉
2020/08/06
5280
Dockerfile 指令
Docker--DockerFile与镜像
    Dockerfile是一个用于引导docker镜像生成过程的文件,遵循其特定的语法,我们便可以创建一个自己的镜像。
洋仔聊编程
2019/01/15
1K0
万字长文带你看全网最详细Dockerfile教程
Dockerfile是用于构建Docker容器镜像的文本文件,它包含了一系列指令和配置,用于描述如何组装一个Docker容器的环境。通过Dockerfile,你可以自动化地构建镜像,确保在不同的环境中都可以复现相同的容器。Dockerfile中的指令可以指定从哪个基础镜像开始构建、复制文件到镜像中、安装软件包、设置环境变量、暴露端口、运行命令等等。每个指令都会在镜像的构建过程中创建一个新的镜像层,这些层构成了最终镜像的结构。这种分层结构让镜像的构建更加高效,同时也方便了镜像的复用和共享。以下是一个简单的Dockerfile示例:
用户1107783
2023/09/11
11.4K2
万字长文带你看全网最详细Dockerfile教程
Docker 进阶之 Dockerfile 详解
我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容,同时在我们后期的微服务实践中,Dockerfile 也是重点关注的内容,今天我们就来一起学习它。
看、未来
2022/06/30
3.4K2
Docker 进阶之 Dockerfile 详解
一文详解Dockerfile自定义镜像
指定基础镜像,并且必须是第一条指令。如果不以任何镜像为基础,那么写法为:FROM scratch。同时意味着接下来所写的指令将作为镜像的第一层开始,语法:
一个风轻云淡
2023/11/03
1K0
DockerFile 编译语法详解
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像,本小结首先介绍Dockerfile典型的基本结构和它支持的众多指令,并具体讲解通过这些指令来编写定制镜像的Dockerfile,以及如何生成镜像.最后介绍使用Dockerfile的一些最佳实践经验.
王 瑞
2022/12/28
4520
Docker镜像构建知识:Dockerfile 命令详解
FROM 指令用于指定其后构建新镜像所使用的基础镜像。如果本地不存在,则默认会去Docker Hub下载指定镜像。FROM指令必是Dockerfile文件中的首条命令,启动构建流程后,Docker将基于该镜像构建新镜像,FROM后的命令也会基于这个基础镜像。
废柴阿尤
2023/12/18
3.6K0
Docker 进阶指南(上)- 使用Dockerfile自定义镜像
大家好,我是洋子。上一篇文章《docker 快速入门指南》介绍了Docker的概念,安装Docker方法以及Docker的常用命令,并且在上篇内容当中,我们都是使用docker pull命令直接拉取阿里云镜像仓库里面提供的官方镜像
Bug挖掘机
2022/09/28
1.4K0
Docker 进阶指南(上)- 使用Dockerfile自定义镜像
「走进k8s」Dockerfile 基本用法(三)
PS:一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个.dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。基本思路:1.编写.dockerignore文件 2.容器只运行单个应用 3.将多个RUN指令合并为一个 4.基础镜像的标签不要用latest 5.每个RUN指令后删除多余文件 6.选择合适的基础镜像(alpine版本最好)
IT架构圈
2019/07/30
1.8K0
「走进k8s」Dockerfile 基本用法(三)
如何用Dockerfile创建镜像
该文章介绍了如何基于CentOS 6.7,源码安装nginx。首先准备了nginx-1.9.9.tar.gz安装包和CentOS6-Base-163.repo(163源),将这两个文件放到同一目录下,并在此目录下创建名称为Dockerfile的文件。之后在此文件中实现源替换、nginx编译安装、及一些依赖包的安装。最后执行命令\"docker build -t nginx-centos:6.7 .\"以构建镜像,并将该镜像命名为nginx-centos:6.7。
古时的风筝
2018/01/08
1.7K0
Docker重学系列之Dockerfile
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。
大忽悠爱学习
2022/05/10
2K0
Docker重学系列之Dockerfile
docker—Dockerfile指令详解
dockerfile用来定制镜像,我们知道镜像实际上是一层一层的,镜像的定制实际上就是定制每一层所添加的配置和文件。
dogfei
2020/07/31
8130
docker容器技术系列五:Dockerfile详解
本系列教程由旺旺知识库授权进行发布 Dockerfile是一个具有规范格式的文件,根据适当的指令和语法,我们可以构建一个自定以镜像。但Dockerfile需要依赖于一个原始镜像,而这些原始镜像我们可以通过官方默认镜像仓库方便获取。具体获取方法参照前文镜像获取办法。 一、Dockerfile的基本结构 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。比如如下一个Dockerfile文件: # This dockerfile uses the ubuntu
小小科
2018/05/04
1.2K0
docker容器技术系列五:Dockerfile详解
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2020/10/23
2K0
3.Docker学习之Dockerfile
Dockerfile、Docker-Compose基本命令与介绍
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的 版本控制 。
唐成勇
2019/05/26
2.1K0
使用 Dockerfile 创建镜像 | Docker 系列
之前写镜像的时候说到创建镜像最常用的方式是使用 Dockerfile,这篇就来重点说一下,到底是怎么使用 Dockerfile 来创建的。
AlwaysBeta
2020/11/10
8830
相关推荐
学习Docker就应该掌握的dockerfile语法与指令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验