Docker-自定义镜像

目录

1 前言

2 构建java应用的步骤及镜像结构图

2.1 构建步骤

2.2 镜像结构图

3 Dockerfile常用指令

4 Dockerfile的内容举例

4.1 一般形式

4.2 一般形式的优化

5 构建镜像

5.1 指令

5.2 实操

5.2.1 加载jdk镜像(基础镜像)

5.2.2 构建我们的镜像

5.2.3 使用我们的镜像


1 前言

本文参考自黑马程序员,算是学习笔记。

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。具体如下。

2 构建java应用的步骤及镜像结构图

2.1 构建步骤

①准备一个Linux运行环境

②安装JRE并配置环境变量

③拷贝Jar包

④编写运行脚本

2.2 镜像结构图

该图片来自黑马程序员:

3 Dockerfile常用指令

指令说明示例
FROM指定基础镜像FROM centos:7
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./jre11.tar.gz /tmp
RUN执行Linux的shell命令,一般是安装过程的命令RUN tar -zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11:$path
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的,只是一个描述EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

更多详细内容可查看官网:

Dockerfile reference | Docker Docs

4 Dockerfile的内容举例

4.1 一般形式

# 指定基础镜像
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
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

语句解释:

  1. FROM ubuntu:16.04:指定基础镜像为Ubuntu 16.04。

  2. ENV JAVA_DIR=/usr/local:设置环境变量JAVA_DIR/usr/local,表示JDK的安装目录。

  3. COPY ./jdk8.tar.gz $JAVA_DIR/:将本地的jdk8.tar.gz文件复制到容器的/usr/local/目录下。

  4. COPY ./docker-demo.jar /tmp/app.jar:将本地的docker-demo.jar文件复制到容器的/tmp/目录下。

  5. RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8:在容器中执行的命令,解压jdk8.tar.gz文件,并将解压后的目录重命名为java8

  6. ENV JAVA_HOME=$JAVA_DIR/java8:设置环境变量JAVA_HOME/usr/local/java8,指定JDK的安装路径。

  7. ENV PATH=$PATH:$JAVA_HOME/bin:将Java的bin目录添加到系统的PATH环境变量中,以便可以直接运行Java命令。

  8. ENTRYPOINT ["java", "-jar", "/app.jar"]:指定容器启动时执行的默认命令,即运行Java应用程序。这里使用java -jar /app.jar启动/tmp/app.jar中的Java应用程序。

4.2 一般形式的优化

一般形式中存在着许多可以复用的内容,在我们编程的时候,我们经常会将可复用的内容写成一个函数。同理,有人也将Dockerfile的可复用部分打包成了一个基础镜像。因此可以优化如下:

# 基础镜像
FROM openjdk:11.0-jre-buster
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

5 构建镜像

5.1 指令

docker build -t myImage:1.0 .

这个命令中,最后一部分表示在目录中查找名为 Dockerfile 的文件(如果是点则表示当前目录),并使用它来构建(-t)一个名为 myImage 版本号为 1.0(没指定版本号默认latest)的Docker镜像。

5.2 实操

5.2.1 加载jdk镜像(基础镜像)

jdk镜像的百度网盘链接如下:

链接: https://pan.baidu.com/s/1p7jNRQX42cyZ3M4uOaSOMA?pwd=5ew2

提取码: 5ew2

5.2.2 构建我们的镜像

5.2.3 使用我们的镜像

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

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

相关文章

WPF LinearGradientBrush立体效果

WPF LinearGradientBrush立体效果 渐变方向 1. 默认是左上角到右下角 2.从左到右 <Border Height"35" Width"120"><Border.Background><LinearGradientBrush EndPoint"1,0"><GradientStop Color"Yellow"Offs…

Mybatis-Plus 入门

文章目录 1 MybatisPlus简介1.1 MybatisPlus概述1.2 MP愿景1.3 MP特性1.4 开发MP版本 2 MP快速入门2.1 MP入门流程分析2.2 数据库环境准备2.3 创建工程&#xff0c;引入场景依赖2.4 编写DataSource相关配置2.5 编码2.6 测试 1 MybatisPlus简介 1.1 MybatisPlus概述 ​ MyBati…

C++之类型转换

C语言中的类型转换 在C语言中, 如果赋值运算符左右两侧类型不同, 或者形参与实参类型不匹配, 或者返回值类型与 接收返回值类型不一致时, 就需要发生类型转化, C语言中总共有两种形式的类型转换: 隐式类型转换和显式类型转换 1. 隐式类型转化是关联度很强, 意义相近的类型之间…

App 测试必备 - 建议所有测试人收藏

移动端App性能测试需要关注多个方面&#xff0c;包括响应时间、稳定性、内存使用、CPU使用率、网络性能、电池消耗以及设备兼容性等。通过综合考虑这些方面&#xff0c;并在不同条件下进行全面的测试&#xff0c;可以确保应用程序在各种情况下都能够提供优质的用户体验&#xf…

<C++>【继承篇】

​ ✨前言✨ &#x1f393;作者&#xff1a;【 教主 】 &#x1f4dc;文章推荐&#xff1a; ☕博主水平有限&#xff0c;如有错误&#xff0c;恳请斧正。 &#x1f4cc;机会总是留给有准备的人&#xff0c;越努力&#xff0c;越幸运&#xff01; &#x1f4a6;导航助手&#x1…

东南亚媒体发稿案例分析 海外媒体宣传首选CloudNEO

近年来&#xff0c;东南亚地区以其快速发展的经济和多元化的文化成为全球企业竞相进军的热门目的地之一。在这样一个竞争激烈的市场中&#xff0c;有效的媒体宣传成为企业拓展业务、树立品牌形象的重要手段。本文将以东南亚媒体发稿案例为例&#xff0c;分析如何利用CloudNEO提…

PaddleOCR CPU 文本文字识别 docker部署

需求&#xff1a; 需要把所有滑块图片的数据文字提取出来 启动服务 mkdir paddle cd paddle docker run -itd --name ppocr -v $PWD:/paddle --networkhost -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash docker exec -it ppocr bash …

大唐杯学习笔记:Day6

1.1小区选择 一、概述 1.UE在RRC_IDLE和RRC——INACTIVATE状态下进行的过程&#xff1b; 2.UE首先需要完成PLMN的选择,在已选择的PLMN上寻找合适的小区,获取合适的服务,监听控制信道,这个过程即小区选择过程&#xff1b; 3.根据小区重选准则,UE寻找其他更适合的小区进行小区…

直播预告|小白开箱: 云数据库在五朵云上的评测

3 月 7 日&#xff0c;周四晚上 19:00-20:30 由明说三人行组织&#xff0c;邀请了 NineData 国际总经理(GM) Ni Demai、云猿生数据 CTO &#xff06; 联合创始人子嘉&#xff0c;和《明说三人行》创始人 &主持人明叔&#xff0c;共同围绕《小白开箱: 云数据库在五朵云上的评…

OpenCV 视频处理(关于摄像头和视频文件的读取、显示、保存等等)

1、前言 OpenCV不仅能够处理图像&#xff0c;还能够处理视频 视频是由大量的图像构成的&#xff0c;这些图像是以固定的时间间隔从视频中获取的。这样&#xff0c;就能够使用图像处理的方法对这些图像进行处理&#xff0c;进而达到处理视频的目的。要想处理视频&#xff0c;需…

JVM运行时数据区——对象的实例化内存布局与访问定位

文章目录 1、对象的实例化1.1、创建对象的方式1.2、创建对象的步骤 2、对象的内存布局3、对象的访问定位3.1、对象访问的定位方式3.2、使用句柄访问3.3、使用指针访问 4、小结 平时大家经常使用new关键字来创建对象&#xff0c;那么我们创建对象的时候&#xff0c;怎么去和运行…

蓝桥杯备战刷题four(自用)

1.砝码称重 #include <iostream> #include <vector> using namespace std; const int N110; const int M100010; int w[N]; int n; int f[N][M]; int m; int ans; //f[i][j]表示到第i个砝码进行放置时的称得的重量为j的方案数 int main() {cin>>n;for(int i1…