Docker之Dockerfile构建镜像

  🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

前言

        在上一期有关Docker的博客分享中我们学习到了Docker的一些数据卷和数据卷容器的一些基本的使用以及概念性的学习。本次的博客给大家带来的是有关Docker中的Dockerfile的学习。

一、什么是Dockerfile构建镜像

1. 基本概述

        Dockerfile是一个文本文件,其中包含一组用于自动化Docker镜像构建的指令和配置。通过编写Dockerfile,用户可以定义镜像的内容、环境和运行时配置。构建过程基于这个Dockerfile文件,并通过Docker引擎执行一系列指令来生成最终的Docker镜像。

2.  Dockerfile指令和它们的作用:

2.1 From :指定基础镜像,构建新镜像的起点。

FROM ubuntu:20.04

2.2 MAINTAINER: 标识镜像的维护者。

MAINTAINER Your Name <your.email@example.com>

2.3 RUN: 在镜像中执行命令,用于安装软件包、更新系统等。

RUN apt-get update && apt-get install -y nginx

2.4 COPY/ADD: 将文件或目录从构建上下文复制到镜像中。

COPY ./app /app

2.5 WORKDIR: 设置工作目录,后续的命令将在该目录下执行

WORKDIR /app

2.6 EXPOSE: 声明容器运行时要监听的端口。

EXPOSE 80

2.7 CMD: 提供容器默认的执行命令,可以被docker run时的参数覆盖。

CMD ["nginx", "-g", "daemon off;"]

2.8 ENTRYPOINT: 设置容器启动时执行的命令,不可被docker run时的参数覆盖。

ENTRYPOINT: 设置容器启动时执行的命令,不可被docker run时的参数覆盖。

简单示例

        通过编写Dockerfile,用户可以定义从基础镜像到最终镜像的整个构建过程,确保应用程序在Docker容器中正确运行。构建镜像的命令通常是使用docker build,并在构建上下文中包含Dockerfile文件。例如:

docker build -t my_custom_image:tag .

         上述命令将使用当前目录的Dockerfile构建一个名为my_custom_image的Docker镜像,并指定了一个标签tag

3.  基本结构

        Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
        一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
Dockerfile的基本结构
部分命令
基础镜像信息
FROM
维护者信息
MAINTAINER
镜像操作指令
RUN ENV COPY ADD EXPOSE WORKDIR ONBUILD USER
VOLUME
容器启动时执行指
CMD ENTRYPOINT

图解说明 

二、示例使用及说明、

1. 构建镜像文件

        接下来为大家讲解如何去根据需求构建一个自定义的镜像文件供自己使用,构建镜像时必须得有一个基础的镜像。我们这里使用的是Centtos(原本没有携带东西),我们输入指令

vim Dockerfile文件进行新建及编辑

vim Dockerfile

         输入的内容如下

FROM centos

MAINTAINER 2081718134@qq.com

WORKDIR /test

COPY spring.jar /test
#1.指定基础镜像,并且必须是第一条指令
FROM centos:latest
#2.指明该镜像的作者和其电子邮件
MAINTAINER xx "xx@qq.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java
#4.一个复制命令,把jdk安装文件复制到镜像中,注意:jdk*.tar.gz使用的是相对路径
COPY spring.jar /test

        输入完成之后按esc按键,输入;wq保存并且退出。接下来是我们进行构建镜像。

输入指令:docker build -t spring:v1 .

 

         我们然后我们进行查看我们刚才构建的镜像文件。

输入指令:docker images

         我们进入我们的镜像文件的容器中

输入命令:docker run -it spring:v1

        我们可以输入指令:ls查看我们文件下所存在的文件 

         我们运行这个jar包文件,输入指令:java -jar spring.jar

        无法运行的原因是因为我们使用的数基础镜像centos没有启动jar包的jdk,因此启动jar该需要我们下载所需的jdk文件。 

2.  镜像运行

        接下来我们需要去下载我们的jdk环境变量,我们输入指令:vim /etc/profile 进行配置环境变量 

         配置jdk环境变量内容

#java environment
export JAVA_HOME=/javaxl/jdk1.8.0_151(jdk解压路径)
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

         这是我们之前在centos中安装时的步骤,在Docker中不一样。

ADD jdk-8u221-linux-x64.tar.gz /test

ENV JAVA_HOME=/test/jdk1.8.0_221

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV PATH=$JAVA_HOME/bin:$PATH

         我们在我们的镜像配置文件中添加上述的内容在后面,但首先我们先要导入我们的jdk的压缩包和jre的压缩包。

 

        我们对其镜像文件Dockerfile进行编辑 

         我们将镜像文件重新编译一遍

        我们进入该镜像文件中进行查看文件 

         接下来是检查我们安装的jdk是否生效

         接下下我们可以测试运行spring.jar包

         我们接下来进行运行项目,我们运行时不是使用run因为我们是等容器打开后再运行因此使用的cmd命令。

CMD ["java -jar spring.jar"] 

        我们在重新构建一个镜像文件 

        我们在运行这个文件 

         我们重新编辑一下我们的Dockerfile文件,重新构建一个镜像文件并且运行

3. 镜像优化

        在我们的开发过程中jdk是我们必不可少的,但是在我们的运行项目中所需的是jre,因此接下来的操作就是将jdk修改为jre进行一系列的优化。下面我们首先修改Dockerfile文件内容,然后构建镜像文件

FROM centos

MAINTAINER 2081718134@qq.com

WORKDIR /test

COPY spring.jar /test

ADD jre-8u391-linux-x64.tar.gz /test

ENV JAVA_HOME=/test/jre1.8.0_391

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV PATH=$JAVA_HOME/bin:$PATH

CMD java -jar spring.jar

         我们接下来就是访问项目,首先清除掉所有的容器,然后创建对应的容器进行运行使用,最后再网页进行访问。

         我们接下来的操作时将我们的镜像文件上传到我们的仓库之中,但是默认的仓库是docker.io/library/spring的官网仓库,需要我们去注册。但是我们可以使用阿里的仓库进行上传,上传快还方便。

网址:容器镜像服务 (aliyun.com)

         我们选择个人版示例进行新建对其进行一系列的操作。我们进行一系列操作后的界面如下

         我们使用前需要登陆我们的阿里账号

        我我们直接执行该命令,然后在输入我们的之前设置的密码即可。 

 

        我们对其创建一个命名空间 

 

         我们新建完命名空间之后我们还要去新建一个仓库,用于我们上传镜像文件。

        我们创建好仓库之后,镜像版本中没有任何东西,需要我们进行手动的推送上去。 推送的操作网页上有

        给我们要上传的镜像取一个别名。 

 

 

         我对其要上传的镜像修改为我们阿里的仓库地址

         上述图片是修改上传的网址路径,我们在查看我们的镜像。 

         我们在将其这个进行进行推送到我们的仓库中

         我们可以在我们的仓库中查看我们的镜像

         下载镜像输入指令

docker pull +镜像名+版本即可


 🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

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

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

相关文章

Shiro框架:ShiroFilterFactoryBean过滤器源码解析

目录 1.Shiro自定义拦截器SpringShiroFilter 1.1 ShiroFilterFactoryBean解析 1.1.1 实现FactoryBean接口 1.1.2 实现BeanPostProcessor接口 1.2 SpringShiroFilter解析 1.2.1 OncePerRequestFilter过滤逻辑实现 1.2.2 AbstractShiroFilter过滤逻辑实现 1.2.2.1 创建Sub…

网页测试遇到自动弹窗,Alert类无法处理?或许你该来学学这招了!

相信大家在使用selenium做网页自动化时&#xff0c;会遇到如下这样的一个场景&#xff1a; 在你使用get访问某一个网址时&#xff0c;会在页面中弹出如上图所示的弹出框。 首先想到是利用Alert类来处理它。 然而&#xff0c;很不幸&#xff0c;Alert类处理的结果就是没有结果…

矩阵快速幂算法总结

题目链接 活动 - AcWing 本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1305/ 题解 代码 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;type…

如何创作出优秀的电子邮件营销(EDM)?

EDM出现的时间很早&#xff0c;是非常传统的一种推广方式。即便是其他推广方式的蓬勃兴起&#xff0c;EDM依旧深受很多行业的喜爱。主要源于它极高的性价比&#xff0c;据可靠数据&#xff0c;EDM的投资回报比达1&#xff1a;48。 那一封优秀的EDM应该是怎么样的呢&#xff1f;…

一分钟带你了解--电商控价

电商行业发展至今带来了许多机遇&#xff0c;但同时也伴随着一些挑战。品牌电商在运营过程中&#xff0c;面临着诸如乱价、低价、窜货和假货等问题&#xff0c;这些问题不仅损害了品牌的形象和价值&#xff0c;也破坏了市场秩序&#xff0c;侵害了消费者的权益。 电商控价是解…

恒温器探针样品座

恒温器探针样品座是一种用采用可移动探针完成恒温器电缆和被测样品的电学连接&#xff0c;避免了每次样品电引线的焊接&#xff0c;探针可移动&#xff0c;5mm--20mm大小的样品均可适用&#xff0c;探针可以安装6个&#xff0c;标准配置探针数量为4个。 恒温器探针样品座由T型…

深入理解 go reflect - 反射基本原理

反射概述 反射是这样一种机制&#xff0c;它是可以让我们在程序运行时&#xff08;runtime&#xff09;访问、检测和修改对象本身状态或行为的一种能力。 比如&#xff0c;从一个变量推断出其类型信息、以及存储的数据的一些信息&#xff0c;又或者获取一个对象有什么方法可以…

map和set使用讲解

map的使用 map的介绍 map是C STL&#xff08;标准模板库&#xff09;中的一个关联容器。 它提供了一种有序的键值对存储方式&#xff0c;其中每个元素都由一个键和一个值组成。 map中的元素根据键的值自动进行排序&#xff0c;并且通过键快速访问对应的值。 map使用红黑树数…

SD-WAN解决跨国公司海外工厂网络安全问题

在跨境业务蓬勃发展的今天&#xff0c;越来越多的大型企业出于人力成本的考虑&#xff0c;在人力成本较低的发展中国家建立工厂。然而&#xff0c;传统基于路由器的网络架构已无法为这些跨国企业提供可靠的安全网络。那么&#xff0c;如何解决跨国企业海外工厂的网络难题呢&…

Structured_Streaming和Kafka整合

结构化编程模型 输出终端/位置 默认情况下&#xff0c;Spark的结构化流支持多种输出方案&#xff1a; 1- console sink: 将结果数据输出到控制台。主要是用在测试中&#xff0c;并且支持3种输出模式 2- File sink: 输出到文件。将结果数据输出到某个目录下&#xff0c;形成文…

数据绑定,defineProperty,v-on,事件处理

目录​​​​​​​ v-bind单向数据绑定 defineProperty 是v-on的简写 事件处理 v-bind单向数据绑定 从name绑定到v-bind到value单向数据绑定&#xff1a; <input type"text" :value"name"> <input type "text" v-model"na…

【Spring】SpringBoot 统一功能处理

文章目录 前言1. 拦截器1.1 什么是拦截器1.2 拦截器的使用1.2.1 自定义拦截器1.2.2 注册配置拦截器 1.3 拦截器详解1.3.1 拦截路径1.3.2 拦截器执行流程1.3.3 适配器模式 2. 统一数据返回格式3. 统一异常处理 前言 在日常使用 Spring 框架进行开发的时候&#xff0c;对于一些板…

什么是Java泛型?泛型在Java中应用场景

目录 一、什么是Java泛型 二、泛型类 三、泛型接口 四、泛型方法 一、什么是Java泛型 Java泛型是一种在编译时进行类型检查和类型安全的机制。它允许编写能够操作多种类型的代码&#xff0c;而不需要进行类型转换或使用Object类型。通过在定义类、接口或方法时使用泛型参数…

Arduino快速上手esp8266方案开发

认识ESP8266 ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目&#xff0c;目前有非常高的市场普及率&#xff0c;还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32&#xff0c;可以在乐鑫官网查看完整的芯片列表。 ESP8266芯…

克服大模型(LLM)部署障碍,全面理解LLM当前状态

近日&#xff0c;CMU Catalyst 团队推出了一篇关于高效 LLM 推理的综述&#xff0c;覆盖了 300 余篇相关论文&#xff0c;从 MLSys 的研究视角介绍了算法创新和系统优化两个方面的相关进展。 在人工智能&#xff08;AI&#xff09;的快速发展背景下&#xff0c;大语言模型&…

element中el-cascader级联选择器只有最后一级可以多选

文章目录 一、前言二、实现2.1、设置popper-class和multiple2.2、设置样式 三、最后 一、前言 element-ui中el-cascader级联选择器只有最后一级可以多选&#xff0c;其它级只有展开子节点的功能&#xff0c;如下图所示&#xff1a; 可以观察到最后一级的li节点上没有属性aria-…

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据 安装&#xff1a;pip install requests requests模块发送简单的get请求、获取响应 需求&#xff1a;通过requests向百度首页发送请求&#xff0c;获取百度首页的…

MATLAB R2023b for Mac 中文

MATLAB R2023b 是 MathWorks 发布的最新版本的 MATLAB&#xff0c;适用于进行算法开发、数据可视化、数据分析以及数值计算等任务的工程师和科学家。它包含了一系列新增功能和改进&#xff0c;如改进了数据导入工具&#xff0c;增加了对数据帧和表格对象的支持&#xff0c;增强…

pr怎么剪掉不要的部分?

在我们的日常工作中&#xff0c;剪视频的时候常常会需要把某个视频中我们不想要的地方剪掉&#xff0c;有的时候是一段&#xff0c;也有可能是好几段。但具体应该怎么样把不要的视频剪掉呢&#xff1f;其实&#xff0c;用pr软件就可以啦&#xff01;那么&#xff0c;pr怎么剪掉…

微信小程序开发WebSocket通讯

官方文档说明&#xff1a;入口 WebSocket连接的链接只支持wss加密方式&#xff0c;且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用&#xff0c;开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址&#xff1a;dtu.aab…