当前位置: 首页 > news >正文

Dockerfile自定义镜像

目录

前言

1. 镜像结构

2. Dockerfile语法

3. 构建Java项目

3.1 基于Ubuntu构建Java项目

3.2 基于java8构建Java项目

3.3 小结


前言

常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

而要自定义镜像,就必须先了解镜像的结构才行。

1. 镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

我们以MySQL为例,来看看镜像的组成结构:

简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序、配置文件、依赖文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

我们要构建镜像,其实就是实际上述打包的过程。

2. Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝、打包。

我们只需要告诉Docker,我们镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

而上述信息的文件就是Dockerfile文件

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

更新详细语法说明,请参考官方文档: https://docs.docker.com/engine/reference/builder。

3. 构建Java项目

3.1 基于Ubuntu构建Java项目

需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目

  • 步骤1:在本机任意目录下,新建一个空文件夹docker-demo

  • 步骤2:将打包好的java项目的jar包文件到docker-demo这个目录

  • 步骤3:将下载好的JDK的linux版本文件拷贝到docker-demo目录下:

  •  步骤4:在docker-demo目录下,新建dockerfile文件,编写内容

内容如下:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

文件内容解释如下:

PS:这里JDK解压后的文件名也就是上面显示的jdk1.8.0_144,根据你们自己的实际情况去修改。

  • 步骤5:进入docker-demo

将准备好的docker-demo上传到虚拟机的任意目录,我这里上传的是/tmp目录,然后进入docker-demo目录下:

  •  步骤6:运行命令

docker build -t [你自己定义的镜像的名称]:[你自定义的镜像版本号] .

这里的镜像版本后要加上空格和一个点,不要忘记!

镜像版本后要加上空格和一个点,不要忘记!

镜像版本后要加上空格和一个点,不要忘记!

重要的事情说三遍!

这时候通过命令docker images可以查看到我们刚刚构建的镜像:

然后用这个命令,可以将这个新鲜的镜像启动起来:

# 这里的docker-demo是我定义的容器名字,你可以自己定义,可以跟之前镜像的名字不一致
docker run --name docker-demo -p 8090:8090 -d docker-demo:1.0

 

然后就可以访问你自己的demo对外暴露的接口,我这里是http://我的虚拟机IP:8090/hello/count,结果:

3.2 基于java8构建Java项目

 我们先来看一下上一小节,我们的dockerfile文件:

绿色的部分是执行JDK安装的部分,只有红色的部分才是我们真正执行java项目的部分。虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是如果我们以后微服务比较多的话,每个微服务都要将绿色的部分重复执行一遍是不是比较麻烦。这时候,我们可以在一些安装了部分软件的基础镜像上做改造。

例如,构建java项目的镜像,可以在已经准备好JDK的基础镜像基础上构建。

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

1)新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

2)将打包好的docker-demo.jar拷贝到这个目录中

3)编写Dockerfile文件:

        a)基于java:8-alpine作为基础镜像

        b)将docker-demo.jar拷贝到镜像

        c)暴露端口

        d)编写入口ENTRYPOINT

        内容如下:

FROM java:8-alpine
COPY ./docker-demo.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar

4) 使用docker build命令构建镜像

5)使用docker run创建容器并运行

我们来实践一下。先把原来的docker-demo的镜像停掉:

然后访问http://我的虚拟机IP:8090/hello/count,可以看到,已经无法访问了。

我们在虚拟机上的/tmp目录下新建文件夹deocker-demo2,然后把需要的docker-demo.jar和新的Dockerfile文件上传进去:

 使用docker build命令构建镜像:

docker build -t docker-demo:2.0 .

然后开始启动这个镜像的容器:

docker run --name docker-demo2 -p 8090:8090 -d docker-demo:2.0

然后访问http://我的虚拟机IP:8090/hello/count,就可以访问成功了:

3.3 小结

小结:

  • Dockerfile的本质是一个文件,通过指令描述镜像的构建过程

  • Dockerfile的第一行必须是FROM,从一个基础镜像来构建

  • 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搜索引擎项目(四)
  • ubuntu20.04.6 安装Skywalking 10.0.1
  • Kylin系列(一):入门与深入解析(大数据分析)
  • RVC-AI声音克隆-你的声音不再是唯一
  • Wechat Files目录垃圾清理指南
  • Android笔试面试题AI答之线程Handler、Thread(2)
  • ES(Elasticsearch)常用的函数有哪些?
  • 代码审计:Bluecms v1.6
  • 9. kubernetes资源——pv/pvc持久卷
  • 银行贷款信用评分不足?大数据帮你找回失去的“分”
  • 史上最全网络安全面试题+答案
  • pve笔记
  • 「C++系列」数组
  • 使用Chainlit接入通义千问快速实现一个多模态的对话应用
  • Android12 显示框架之SurfaceComposerClient创建
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • bearychat的java client
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Codepen 每日精选(2018-3-25)
  • IOS评论框不贴底(ios12新bug)
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python socket服务器端、客户端传送信息
  • React16时代,该用什么姿势写 React ?
  • session共享问题解决方案
  • 番外篇1:在Windows环境下安装JDK
  • 关于extract.autodesk.io的一些说明
  • 前端相关框架总和
  • 前端学习笔记之观察者模式
  • 学习笔记:对象,原型和继承(1)
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​马来语翻译中文去哪比较好?
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (C++20) consteval立即函数
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (SpringBoot)第二章:Spring创建和使用
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (论文阅读40-45)图像描述1
  • (十二)Flink Table API
  • (循环依赖问题)学习spring的第九天
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (原)本想说脏话,奈何已放下
  • (正则)提取页面里的img标签
  • (转)ABI是什么
  • (转)fock函数详解
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (状压dp)uva 10817 Headmaster's Headache