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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能驱动|ChatGPT视角下的告警事件闭环响应

背景 在人工智能技术浪潮发展驱动的背景下&#xff0c;数字化、智能化、多元化的网络安全格局逐渐形成。在这个时代如何有效利用好智能工具&#xff0c;促进工作有效开展&#xff0c;显得极为重要。很多安全企业也在大力发展GPT机器人从而实现数据智能化应用&#xff0c;发挥其…

深度学习笔记:1.anaconda安装

Download Anaconda Distribution | Anaconda 双击安装 设置环境变量 anaconda常用命令大全&#xff08;保姆级别建议收藏)-CSDN博客https://blog.csdn.net/m0_64892604/article/details/128806043?ops_request_misc%257B%2522request%255Fid%2522%253A%252217174671831680018…

推荐ChatGPT4.0——Code Copilot辅助编程、Diagrams: Show Me绘制UML图、上传PDF并阅读分析

5月14日凌晨1点、太平洋时间的上午 10 点&#xff0c;OpenAI的GPT-4o的横空出世&#xff0c;再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓&#xff0c;它更像是向世界宣告AI技术已迈入了一个全新的纪元&#xff0c;连OpenAI的领航者萨姆奥特曼也不禁…

图书管理系统(https://github.com/plusmultiply0/bookmanagesystem)

特意去github找了一个用flask框架的项目&#xff0c;一起来学习它吧 这个系统包括很多功能&#xff1a;用户权限管理模块&#xff08;管理员和普通用户&#xff09;&#xff0c;注册登录模块&#xff08;滑块验证码功能&#xff09;&#xff0c;图书有关信息模块&#xff08;借…

Django使用正则表达式

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 在Django框架的新版本&#xff08;v2.0 &#xff09;中&#xff0c;URLc…

低比特大模型排行版暨AutoRoundV0.2发布

由于大量的量化模型没有精度数据&#xff0c;为了让用户更好地找到适配自己的模型或量化算法&#xff0c;最近推出了低比特大模型排行版&#xff0c;评估的指标主要涵盖10个zero shot的任务,如果有什么建议或者意见可以去社区提~目前支持13B以下模型的评估&#xff0c;后面可能…

2024专精特新趋势论坛,汉王友基分享数字化创新实践之路

5月31日&#xff0c;由深圳市中小企业服务局作为指导单位&#xff0c;36氪主办的“WISE新风向2024专精特新趋势论坛”在粤港澳大湾区顺利举办。 汉王友基作为国家级专精特新“小巨人”企业代表&#xff0c;受邀参加此次大会&#xff0c;企业CTO邓立明先生进行了《数字赋能&…

网易云音乐格式在线转换

应用分享&#xff1a;众所周知网易云下载的格式为 .NCM&#xff0c;只能在网易云音乐里播放。 今天提供在线转换为MP3格式 NCM TO MP3&#xff0c;无需安装&#xff0c;转换后就能在任意播放器使用。 使用地址&#xff1a; https://ncm.worthsee.com/ 网络研究观 数据泄露…

【力扣】矩阵中的最长递增路径

一、题目描述 二、解题思路 1、先求出以矩阵中的每个单元格为起点的最长递增路径 题目中说&#xff0c;对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。那么以一个单元格为起点的最长递增路径就是&#xff1a;从该单元格往上…

PDF 文件的解析

1、文本 PDF 的解析 1.1、文本的提取 进行文本提取的 Python 库包括&#xff1a;pdfminer.six、PyMuPDF、PyPDF2 和 pdfplumber&#xff0c;效果最好的是 PyMuPDF&#xff0c;PyMuPDF 在进行文本提取时能够最大限度地保留 PDF 的阅读顺序&#xff0c;这对于双栏 PDF 文件的抽…

arduino 与 nodeMcu 之间的通信

一、前言 当在 arduino 板子处理好了传感器的数据应该发送给远程服务器这时候就需要用 nodeMcu 了&#xff0c;但是怎么把 arduino 的数据发送到 nodeMcu 呢&#xff0c;这就是本文要实现的。 两个板子之间通信很简单&#xff0c;直接使用 arduino IDE 提供的 Serial.println…

【C++】——list模拟实现(包懂的,细节满满)

前言 list的模拟实现和string和vector的有区别的&#xff0c;但是也有相同。 区别&#xff1a;list的迭代器底层和其他两个迭代器底层有很大区别&#xff0c;因为list的链式结构决定了与它们两个的不一样 相同&#xff1a;迭代器用法大致一样&#xff0c;其他成员函数的使用也…

解决Mac ~/.bash_profile 配置的环境变量重启终端后失效问题

在Mac系统中&#xff0c;配置环境变量通常是在~/.bash_profile文件中进行。然而&#xff0c;有时会遇到配置的环境变量在重启终端后失效的问题。 解决办法&#xff1a; 在~/.zshrc文件最后或最前面&#xff0c;增加一行 source ~/.bash_profile

Linux 搭建 ZeroTier 的 Moon 服务器

系统&#xff1a;centos 7.6 轻量云服务器&#xff1a;腾讯云 Moon是什么&#xff0c;为什么需要Moon&#xff1f; ZeroTier通过自己的多个根服务器帮助我们建立虚拟的局域网&#xff0c;让虚拟局域网内的各台设备可以打洞直连。这些根服务器的功能有些类似于通过域名查询找到…

SOFA-RPC学习记录

文章目录 需求分析模块划分微服务模块交互模块 可拓展架构插件机制 功能分析交互模块 学习微服务模块交互模块 dubbo与nacos集成学习Nacos配置中心实战 dubbo与apollo集成学习配置中心组件与k8s的抉择参考资料 结论 本报告旨在深入学习SOFA-RPC框架&#xff0c;特别是其动态配置…

基于小波区间相关的信号降噪方法(MATLAB 2021B)

在我们处理信号过程中最重要的任务就是找到信号隐藏的规律和信号的特征。常用的傅里叶分析法只能用于在时间域或者频率域上分析信号&#xff0c;而通常的数据会在时间域和频率域均有特征。而小波分析是继傅里叶分析之后的一大突破性创新&#xff0c;也是近年来在学术界非常热门…

python字符串的索引

上一篇回顾 上一关中&#xff0c;我们重识了 字符串&#xff0c;还了解了 字符串拼接 和 字符串格式化输出 的方法。 字符串的“乘法”可以很方便地“复读”字符串&#xff0c;让字符串与一个整数 n 相乘&#xff0c;字符串就会原样复制 n 次。 在体验课中我们学到&#xff…

嵌入式Linux系统编程 — 1.2 文件管理与错误处理

目录 1 Linux 系统如何管理文件 1.1 什么是静态文件 1.2 扇区&#xff08;Sector&#xff09;和块&#xff08;Block&#xff09;概念&#xff1f; 1.3 inode 1.4 进程控制块&#xff08;PCB&#xff09; 2 返回错误处理与 errno 2.1 errno变量介绍 2.3 perror函数介绍…

python-验证子串

题目描述 输入两个字符串&#xff0c;验证其中一个串是否为另一个串的子串。 输入两个字符串&#xff0c; 每个字符串占一行&#xff0c;长度不超过200且不含空格。 输出 若第一个串s1是第二个串s2的子串&#xff0c;则输出(s1) is substring of(s2)否则&#xff0c;若第二个串…

【云原生】kubernetes中secret原理详解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…