03. 自定义镜像 Dockerfile

目录

1、前言

2、构建镜像的方式

2.1、docker commit

2.1.1、先查看下当前的容器

2.1.2、生成该容器镜像

2.1.3、查看镜像列表

2.2、Dockerfile

2.2.1、创建Dockerfile文件

2.2.2、编写Dockerfile文件

2.2.3、构建镜像

2.2.4、使用该镜像生成容器

3、Dockerfile

3.1、什么是Dockerfile

3.2、Idea集成Dockerfile构建镜像

3.2.1、先构建一个简单的springboot应用

3.2.2、编写Dockerfile

3.2.3、文件上传到/data/project下

3.2.4、构建镜像

3.2.5、启动


1、前言

在前面章节中docker部署的nginx或者tomcat都是镜像仓库中已有的镜像,或是别人已经开发好的镜像。那么,在实际项目中,我们除了使用已有的镜像外,还有我们自己构建的镜像,比如项目的基础服务应用等等。

2、构建镜像的方式

构建自己的镜像有2种方式:

  1. docker commit命令。基于一个容器来创建。
  2. Dockerfile方式构建。

我们以上一篇中部署的tomcat应用为例。

2.1、docker commit

2.1.1、先查看下当前的容器

docker ps

2.1.2、生成该容器镜像

docker commit 容器id 镜像名称

2.1.3、查看镜像列表

可见已经生成成功。此时如果你想上传到镜像仓库中,需要先到Docker Hub中注册一个账号密码。

随后登录账号,并将该镜像推送到镜像仓库中。

# 登录仓库
docker login# 上传
docker push 镜像名称(tomcattest_application)

2.2、Dockerfile

除了上面docker commit命令提交方式以外,还有Dockerfile方式构建镜像。而这种方式也是我们最经常使用的。因为docker commit方式只有生成该镜像的人才知道执行了什么命令,怎么生成的镜像。而别人使用的时候根本无法感知。而Dockerfile保留了所有的构建镜像的相关信息,类似于脚本文件的形式,可以清楚的看到构建整个镜像的前后相关信息。

2.2.1、创建Dockerfile文件

touch Dockerfile

2.2.2、编写Dockerfile文件

FROM nginx
RUN echo '<h1>this is dockerfile create nginx image demo html</h1>' > /usr/share/nginx/html/index.html

这里构建Nginx镜像,同时创建一个简单的web网页,网页内容为:this is dockerfile create nginx image demo html

2.2.3、构建镜像

docker build -t mynginx -f Dockerfile .

在Dockerfile同级目录下执行构建脚本。

  • -t : 指定镜像名称。
  • -f :指定Dockerfile文件,如果文件名为Dockerfile,则可以省略。如果自定义文件名,如myDockerFile,则需要-f myDockerFile

 看到这个,就说明构建成功。查看下当前镜像,多了我们构建的mynginx。

2.2.4、使用该镜像生成容器

docker run -d -p 8888:80 mynginx

浏览器访问:http://ip:8888可以看到刚刚我们创建的网页。

3、Dockerfile

上面介绍了Dockerfile构建镜像的方式。那么我们再来详细说说关于Dockerfile,因为这个是我们后续构建自己程序镜像的重点。

Dockerfile,镜像,容器之间的关系大致如下图(网上借来的),我们使用Dockerfile文件定义镜像信息,然后通过docker build构建镜像,接着运行镜像启动容器,当然中间一样可以push到Docker Hub仓库。

3.1、什么是Dockerfile

Dockerfile实际是一个文本文件,其包含了一条条的指令,每一条指令都用于构建镜像中的一层,同时每一条指令的内容描述了该层应如何构建。当我们需要定制自己额外的需求时,只需要在Dockerfile文件的基础上添加或修改指令,重新生成新的镜像即可。

一个完整的Dockerfile文件会包含以下几个部分内容:

  1. 基础镜像信息。使用 FROM关键字指定基础镜像信息,该命令必须是 Dockerfile 文件的第 1条指令。如上面的FROM nginx表示指定nginx为这个容器的基础镜像。
  2. 维护者信息。使用MAINTAINER 关键字指定,通常可以使用 Dockerfile 文件创建者的姓名或者电子邮件作为维护者信息。
  3. 镜像操作指令。每执行一条镜像操作指令,将在镜像中添加新的一层。可以根据需要使用一条或者多条镜像操作指令,常见的镜像操作指令有:RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等。
  4. 容器启动执行指令。用于指定在启动容器时需要执行的命令。通过关键字 CMD、ENTRYPOINT 指定。

3.2、Idea集成Dockerfile构建镜像

3.2.1、先构建一个简单的springboot应用

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
@RestController
@RequestMapping("demo")
public class TestController {@GetMapping("index")public String indexAction(){return "this is dockerfile create springboot application";}
}
server:port: 8080

程序启动后,访问接口:http://localhost:8080/demo/index,会返回结果:this is dockerfile create springboot application内容。

3.2.2、编写Dockerfile

# 指定基础镜像作为该容器的基础环境,如springboot应用最起码得有jdk环境
FROM openjdk:8# 执行维护者的信息
MAINTAINER shamee csdn peng793049488# 创建一个存放该工程的目录
RUN mkdir -p /data/project
COPY app.jar /data/project/app.jar# 对外暴露一个8899端口
EXPOSE 8899# 执行启动
ENTRYPOINT ["/bin/sh", "-c", "java -jar /data/project/app.jar"]

3.2.3、文件上传到/data/project下

3.2.4、构建镜像

docker build -t myapp .

构建完成,docker images 可以查看到我们的镜像myapp。

3.2.5、启动

docker run --name=myapp -d -p 18080:8080 myapp

访问我们的接口地址:http://192.168.74.129:18080/demo/index就可以看到我们的接口返回。

 

0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FTP与HTTP: 哪种协议更适合大文件传输?

随着互联网技术的发展&#xff0c;网络传输已成为了现代社会中不可或缺的一部分。无论是文本、图像、音频、视频等各种类型的数据&#xff0c;相应的传输协议也在不断地发展和更新。FTP&#xff08;File Transfer Protocol&#xff09;和HTTP&#xff08;Hyper Text Transfer P…

【密码学】二、古典密码

古典密码 1.置换密码1.1列置换密码1.2周期置换密码 2.代换密码2.1单表代换密码2.1.1凯撒密码2.1.2仿射密码 2.2多表代换密码2.2.1维吉尼亚密码2.2.2普莱费尔密码 3.轮转密码3.1恩尼格玛密码机Enigma3.1.1Enigma加密3.1.1Enigma解密 4.古典密码的分类5.古典密码的统计分析5.1单表…

【云原生】Prometheus之图形化界面grafana与服务发现部署

前言 上一篇文章中我们介绍了Prometheus的组件&#xff0c;监控作用&#xff0c;部署方式&#xff0c;以及如何通过在客户机安装exporter再添加监控项的操作。但是不免会发现原生的Prometheus的图像化界面对于监控数据并不能其他很好的展示效果。所以本次我们将介绍一款开源非常…

06-Vue基础之事件处理

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Hive自定义函数

本文章主要分享单行函数UDF&#xff08;一进一出&#xff09; 现在前面大体总结&#xff0c;后边文章详细介绍 自定义函数分为临时函数与永久函数 需要创建Java项目&#xff0c;导入hive依赖 创建类继承 GenericUDF&#xff08;自定义函数的抽象类&#xff09;&#xff08;实现…

HP惠普暗影精灵9笔记本原装出厂Win11系统预装专用OEM系统镜像

暗影9笔记本电脑原厂Windows11系统包 OMEN by HP 16.1英寸游戏本16-wf0000,16-wf0001,16-wf0003,16-wf0004,16-wf0006,16-wf0008,16-wf0009,16-wf0010,16-wf0011,16-wf0012,16-wf0028,16-wf0029,16-wf0007,16-wf0032,16-wf0036,16-wf0043 链接&#xff1a;https://pan.baidu.…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务&#xff0c;锁&#xff0c;子查询 事务有点像是原子操作&#xff0c;需要有完整性&#xff0c;要么全都完成了&#xff…

win11我们无法创建新的分区也找不到现有的分区

U盘重装系统的时候 提示&#xff1a;win11我们无法创建新的分区也找不到现有的分区 ShiftF10 &#xff0c;调出 命令提示符&#xff1b; diskpart list disk select disk 盘编号 clean convert gpt 参考&#xff1a;怎么解决我们无法创建新的分区也找不到现有的分区问题&#x…

STM32F407-- DMA使用

目录 1. DMA结构体 STM32F103&#xff1a; STM32F407&#xff1a; 2. F4系列实现存储器到存储器数据传输 1&#xff09;结构体配置&初始化 2&#xff09;主函数 补充知识点&#xff1a;关于变量存储的位置&#xff0c;关于内部存储器一般存储什么内容 3. F4系列实现…

C++OpenCV(4):图像截取与掩膜操作

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 &#x1f506; OpenCV项目地址及源代码&#xff1a;点击这里 文章目录 图像截取图像掩膜操作 图像截取 ROI操作&#xff0c;指的是&#xff1a;region of interest&#xff0c;感兴趣区域。 我们可以对一张…

Android Studio 修改AVD模拟器文件默认存储路径

AndroidStudio默认的模拟器文件路径为&#xff1a;C:\Users\用户名\.android\avd路径&#xff0c;通常windows系统上&#xff0c;C盘不是太大&#xff0c;而avd文件却不小&#xff0c;通常几个GB&#xff0c;所以有必要将avd路径换到一个非系统盘。 更换方法如下&#xff1a;H…

LocalDateTime、OffsetDateTime、ZonedDateTime之间的关系

什么是LocalDateTime&#xff1f; ISO-8601日历系统中不带时区的日期时间。 该类不存储时区&#xff0c;所以适合日期的描述&#xff0c;比如用于生日、deadline等等。 但是如果没有偏移量/时区等附加信息&#xff0c;一个时间是不能表示时间线上的某一时刻的。 什么是Offset…

20230720在ubuntu22.04系统下载+解密+合并ts切片的步骤(STEP-BY-STEP版本)

20230720在ubuntu22.04系统下载解密合并ts切片的步骤&#xff08;STEP-BY-STEP版本&#xff09; 2023/7/20 23:06 https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?type2&app_idapp1cE7gLFM1187&pro_idterm_645c69388953e_Nhew…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具&#xff0c;并结合chatGPT减少学习成本&#xff0c;快速出图。将按照软…

前端Web实战:从零打造一个类Visio的流程图拓扑图绘图工具

前言 大家好&#xff0c;本系列从Web前端实战的角度&#xff0c;给大家分享介绍如何从零打造一个自己专属的绘图工具&#xff0c;实现流程图、拓扑图、脑图等类Visio的绘图工具。 你将收获 免费好用、专属自己的绘图工具前端项目实战学习如何从0搭建一个前端项目等基础框架项…

java学习(二):反射

系列文章目录 https://editor.csdn.net/md/?articleId131757340 文章目录 系列文章目录参考【1】注解1. 什么是注解2. 内置注解3. 元注解4.自定义注解 【2】反射--基本概念一、反射的基本概念1. 为什么要用反射&#xff1f;2. 什么是反射&#xff1f;3. 用和不用反射的区别&a…

代码随想录-回溯(组合问题)|ACM模式

目录 前言&#xff1a; 77.组合 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 216. 组合总和 III 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 17. 电话号码的字母组合 题目描述&#xff1a; 输入输出描述&a…

MyBatis的多表操作

1 MyBatis的多表操作 1.1 多表模型介绍 我们之前学习的都是基于单表操作的&#xff0c;而实际开发中&#xff0c;随着业务难度的加深&#xff0c;肯定需要多表操作的。 多表模型分类 一对一&#xff1a;在任意一方建立外键&#xff0c;关联对方的主键。 一对多&#xff1a;在…

实用便捷!一站式BI系统推荐

在企业数字化转型过程中&#xff0c;BI系统可以建立业务、数据的双驱引擎&#xff0c;形成业务、数据的互补作用&#xff0c;通过建立数字化技术架构&#xff0c;明确企业的战略定位和业务目标&#xff0c;从而支撑实现这个目标。而一站式BI系统&#xff0c;则是指可以轻松从数…

【MySQL】SQL性能分析 (七)

&#x1f697;MySQL学习第七站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 假如我们需要对SQL进行优化&#xff0c;我们就必须对他足够的了解&#xff0c;比如 对哪一类SQL进行优化&#xff08;增删改查…