04基于Dockerfile创建自定义镜像并运行

自定义镜像

镜像的分层结构

常见的镜像在DockerHub就能找到, 如果我们自己要部署一个Java项目就要手动把它打包为一个镜像

  • 部署一个Java应用的大概流程:准备一个Linux运行环境(CentOS或者Ubuntu均可)--> 安装并配置JDK --> 上传Jar包 --> 运行jar包
  • 将Java应用打包成镜像大概流程: 准备Linux运行环境(只需要包括Java项目的基础运行环境即可)-- > 安装并配置JDK --> 拷贝jar包 --> 配置启动脚本

Layer层: 打包镜像过程中的每一次操作其实都是在生产一些磁盘文件如系统运行环境文件、函数库文件、配置文件,这些文件不是随意堆放的而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一Id形成层

  • 重复利用镜像文件: 如果我们构建某个镜像时用到的某些层其他人已经制作过,就可以直接拷贝使用别人已经制作好的层,在别人制作的镜像基础上进行打包
  • 基础镜像层: 构建镜像的第一步需要的Linux运行环境文件通用性就很强,所以Docker官方就制作了这样只包含Linux运行环境的镜像,如CentOS或Ubuntu操作系统镜像或其他人制作好的镜像openjdk:8

在这里插入图片描述
自定义镜像本质就是依次将应用程序和其运行时所需的基础运行环境、依赖、应用本身、运行配置等文件按照顺序打包成一个完整的镜像文件

在这里插入图片描述

Dockerfile指令

由于在制作镜像时需要逐层处理和打包比较复杂, 所以Docker提供了自动打包镜像的功能,我们只需要向Docker提供一个Dockerfile文件剩下的交给Docker去执行即可

Dockerfile是一个包含指令的文本文件,通过Docker提供的指令记录镜像的打包过程以及每一层要做的事情,每一个指令都会形成一层Layer

  • 构建自定义镜像时只需要告诉Docker我们镜像的基础镜像,拷贝的文件,安装的依赖,启动的脚本内容, 将来Docker会帮助我们构建镜像

  • Dockerfile文件的第一行必须使用FROM指定基础镜像来构建

指令说明示例
FROM指定基础镜像(基本操作系统或其他人制作好的镜像),镜像不存在时需要先下载FROM centos:6
ENV设置环境变量,可在后面指令使用ENV key value
COPY将本地文件如jar包拷贝到镜像的指定目录中,如果目录不存在Docker会自动创建COPY ./xx.jar /tmp/app.jar
RUN执行Linux的shell命令如解压缩,一般是安装过程的命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8090
ENTRYPOINT镜像中应用的启动命令,将来容器运行时自动调用ENTRYPOINT java -jar xxjar

基于基础镜像构镜像

需求: 基于Ubuntu基础镜像构建一个新镜像,基于构建的镜像创建并启动容器运行一个Java项目

第一步: 创建一个空文件夹/root/docker-demo,将docker-demo.jar(监听8090端口)和jdk8.tar.gz(Java运行环境)文件拷贝到该目录下

mkdir -p /root/docker-demo

第二步: 进入docker-demo目录, 在docker-demo目录下新建Dockerfile(文件名称固定)文件告诉Docker如何构建镜像

# 在docker-demo目录下创建Dockerfile文件记录镜像的构建过程
cd /root/docker-demo
vi Dockerfile# 文件内容
# 指定基础镜像
FROM ubuntu:16.04# 配置环境变量为JDK的安装目录
ENV JAVA_DIR=/usr/local
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 将当前目录下存放的jdk8.tar.g文件拷贝到/usr/local/目录下
COPY ./jdk8.tar.gz $JAVA_DIR/
# 将当前目录下存放的docker-demo.jar包拷贝到根目录下并重命名为app.jar
COPY ./docker-demo.jar /app.jar# 安装JDK,解压/usr/local包下的压缩文件jdk8.tar.gz,将得到的解压文件jdk1.8.0_44重命名为java8目录
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置JDK的环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 指定容器运行时暴露的端口,如果你之前没有关闭防火墙,请关闭防火墙或打开对应端口,云服务器同理
EXPOSE 8090# 入口即java项目的启动命令
ENTERPOINT java -jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

第三步:在docker-demo目录下使用docker build -t 镜像名称及其版本 Dockerfile文件所在的目录(文件名称必须为Dockerfile)命令构建镜像

  • docker build : 构建一个docker镜像
  • -t : 指定镜像的名称包括repository和tag,不指定tag时默认为latest
  • . : 指定构建镜像的Dockerfile文件所在的目录, .代表当前所在目录,也可以通过绝对路径的方式直接指定Dockerfile文件所在目录

在这里插入图片描述

# 进入docker-demo目录执行构建命令,将来镜像就会存放在该目录下
cd /root/docker-demo# 开始构建镜像,相对路径
docker build -t docker_demo:1.0 .
# 开始构建镜像,绝对路径
docker build -t docker-demo:1.0 /root/docker-demo# 查看本地所有镜像
[root@localhost docker-demo] docker images
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
docker_demo   1.0       c8acd2dd02cf   About a minute ago   722MB
redis         latest    29ab4501eac3   2 days ago           117MB
nginx         latest    3964ce7b8458   5 days ago           142MB
ubuntu        16.04     b6f507652425   15 months ago        135MB
mysql         5.7.25    98455b9624a9   3 years ago          372MB

第四步: 根据构建的镜像创建并运行容器

# 1.创建并运行容器
docker run -d --name javaDemo -p 8090:8090  docker_demo:1.0
# 2.查看容器详情信息
dps
# 结果
CONTAINER ID   IMAGE             PORTS                                                  STATUS         NAMES
78a000447b49   docker-demo:1.0   0.0.0.0:8080->8080/tcp, :::8090->8090/tcp              Up 2 seconds   javaDemo
f63cfead8502   mysql             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   Up 2 hours     mysql# 3.在虚拟机内直接访问项目接口
curl localhost:8090/hello/count
# 结果:
<h5>欢迎访问黑马商城, 这是您第1次访问<h5>

第五步: 浏览器访问http://虚拟机主机IP地址:8090/hello/count查看页面效果

在这里插入图片描述

基于JDK构建镜像

直接基于Ubuntu基础镜像来构建镜像比较麻烦,大多数情况下我们可以在一些已经安装了部分软件和基础系统镜像的镜像上做改造

我们刚刚构建Java项目时安装JDK并配置环境变量的步骤是固定死的,所以我们可以找一个已经安装好JDK的基础镜像并在其基础上来构建我们Java项目的镜像

需求: 在原先/root/docker-demo目录的基础上修改Dockerfile文件, 基于JDK作为基础镜像将一个Java项目构建为镜像

# 将JDK作为基础镜像的方式,如果本地没有需要下载
FROM java:8-alpine 
FROM openjdk:8
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包到跟目录下并重命名为app.jar
COPY ./docker-demo.jar /app.jar
# 入口
ENTRYPOINT java -jar /app.jar

构建镜像,创建并运行一个docker_demo容器(在此之前停止之前的docker_demo容器),然后浏览器访问查看页面效果

# 构建镜像
docker build -t docker_demo:2.0 .
# 创建并运行容器
docker run -d --name javaDemo02 -p 8090:8090 docker_demo:2.0

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

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

相关文章

Vue --关于传递参数

多参数传递的两种方法&#xff1a; 第一种&#xff1a;params方法&#xff08;此方法传递不会在URL路径中显示拼接&#xff09; 传递参数&#xff1a; this.$router.push({name: "home",params:{key:1} })接收参数&#xff1a; created() {// 获取参数console.log…

node-mysql的批量插入

此前我批量插入都是用类似这样的命令&#xff1a; sqlcmdinsert into table(field1,field2,...) values ? indata[["f1v1","f2v1"],["f1v2","f2v2"],...] mysqlconn.query(sqlcmd,[indata],(err,res)>{...})但是感觉不太舒服&…

库存管理III ---- 分治-快排

题目链接 题目: 分析: 这道题本质上是一个topK问题, 我们能够想到三种解决办法 解法一: 排序 解法二: 堆 解法三: 快速选择排序, 时间复杂度最好, 而且题目要求返回的顺序不限, 所以这个方法最好数组中的第K个最大元素 ---- 分治-快排-CSDN博客, 我们在这道题中学习了快速选择…

速卖通618新店销量暴增秘诀:自养号测评的关键要素

618速卖通新店开业已20天&#xff0c;却迟迟未能迎来首单&#xff0c;这无疑让商家倍感焦虑。面对这一困境&#xff0c;商家需冷静分析原因&#xff0c;并采取有效措施提升店铺曝光度和吸引力&#xff0c;下面具体说说做。 一、速卖通新店20天了没出单怎么办&#xff1f; 商家…

python单元测试

需要提前配置一下环境&#xff1a;单元测试Unittests TestCase测试用例 import unittestdef my_sum(a, b):return a bclass Test(unittest.TestCase):def test_001(self):print(my_sum(3, 6))def test_002(self):print(my_sum(1, 3))注意类中测试方法都必须以test开头 Test…

四川汇聚荣聚荣科技有限公司综合实力如何?

在探讨一个公司的综合实力时&#xff0c;我们不仅关注其经济表现&#xff0c;还应深入分析其技术实力、市场地位、创新能力、团队素质以及社会责任感等多个维度。四川汇聚荣聚荣科技有限公司作为一家立足于科技领域的企业&#xff0c;其实力究竟如何呢?接下来的内容将围绕这一…

【C语言】详解static和extern关键字

文章目录 1. 前言2. 作用域和生命周期2.1 作用域2.1.1 全局变量和局部变量 2.2 生命周期 3. static关键字3.1 static修饰的局部变量 4. extern关键字5. extern和static关键字的相互作用5.1 static修饰函数 6.总结 1. 前言 可能在你遇到这篇文章之前&#xff0c;你可能并未听过…

基于jeecgboot-vue3的Flowable流程-已办任务(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节&#xff0c;这个部分主要讲功能代码 1、注册列表数据显示 //注册table数据const { prefixCls, tableContext, onExportXls, onImportXls } useListPage({tableProps: {title: …

1898java疫情防控管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 疫情防控管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发…

顶顶通呼叫中心中间件-如何配置识别不同语种的ASR

文章目录 前言联系我们创建不同语种的语音识别任务开始对接识别不同语种的ASR重启 asrproxy 程序使用识别不同语种的ASR 前言 之前讲过顶顶通的 asrproxy 程序如何对接第三方的ASR&#xff0c;比如&#xff1a;阿里云的ASR。不知道如何对接的&#xff0c;可以参考&#xff1a;…

idea2023如何创建普通maven工程项目

解决 1.创建新项目 1.进入创建项目 File -> new -> project 2&#xff0c;project 中有 build system 选择maven 2.在已有项目中创建普通maven工程 1.右键项目选择 new -> Module 2.选择 new Module 其实与新建maven工程没什么区别 em:问题 idea以前的版本是在Mav…

“能监测、会预警、快处置”,51WORLD智慧应急数字孪生解决方案

我国自然灾害多发&#xff0c;安全生产基础薄弱。加之城市运行日益复杂&#xff0c;安全隐患、安全问题不断涌现&#xff0c;探索构建全新的应急管理体系和能力迫在眉睫。 面对新形势&#xff0c;依托数字孪生、云计算、大数据、人工智能等新一代信息技术打造统分结合、协调联…

别让你的品牌默默无闻,掌握建设与营销的关键技巧……

管理学大师彼得德鲁克曾经说过&#xff0c;“企业两个最重要的功能是创新和营销&#xff0c;其他一切都是成本。” 在商业领域中&#xff0c;有很多类型的营销。 它们中的每一个都不同&#xff0c;且都是有特定场景的。 有些用于区别于竞争对手&#xff0c;有些用于适应用户…

本地运行feishu-chatgpt项目结合内网穿透实现无公网IP远程访问

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 本文主要介绍如何在飞书中创建chatGPT机器人并且结合内网穿透工具…

怎么发送超大文件?困扰已久的邮件大附件发送问题解决了

邮件是日常中使用最多的文件流转工具&#xff0c;特别是对于企业内部的员工间、及企业与企业间的业务开展&#xff0c;数据和文件的发送、业务留痕大多都基于邮箱展开。 邮箱的普遍使用给用户基于邮箱进行业务沟通提供了前提&#xff0c;其中&#xff0c;Outlook邮箱是使用最广…

JVM学习-JVM运行时参数

JVM参数选项 标准参数选项 特点 稳定&#xff0c;后续版本不会变化以【-】开头 各种选项 运行java或者java -help可以看到所有的标准选项 补充内容 -server&#xff1a;64位机器上只支持Server模式的JVM&#xff0c;适用于需要大内存的应用程序&#xff0c;默认用并行垃圾回…

18 - 各赛事的用户注册率(高频 SQL 50 题基础版)

18 - 各赛事的用户注册率 -- 注册率注册用户数/所有用户数 selectr.contest_id,round(100*count(*)/(select count(*) from Users),2) percentage from Register r group by r.contest_id order bypercentage desc,r.contest_id ASC;

Phpstorm使用xdebug断点调试

一、目标 1、在浏览器地址栏里操作页面访问接口时&#xff0c;可以在项目代码对应入口处断点拦截调试&#xff1b; 2、在postman调用接口时&#xff0c;可以在项目代码对应入口处断点拦截调试&#xff1b; phpstorm版本&#xff1a;PhpStorm 2024.1.2 二、具体操作 1、安装…

Python离线查询IP地址对应的国家和城市

使用场景&#xff1a; 在没网的情况下使用python代码实现对ip地址进行查询国家和地市 代码实现&#xff1a; 需要安装 pip install geoip2 库 import geoip2.databasedef get_location_by_ip(ip_address, db_path):reader geoip2.database.Reader(db_path)try:response r…

什么是输入偏置电流?

输入偏置电流&#xff08;input bias current&#xff09;&#xff1a;运放同相与反相端流入和流出的电流。理想的运放同相和反相端的阻抗是无穷大的&#xff0c;所以是无法流进和流出电流。 第一种定义&#xff1a;同相与反相端电流和的平均值 以AD8031运放举例&#xff0c;…