通过Dockerfile构建镜像

案例一:

使用Dockerfile构建tomcat镜像

cd /opt
mkdir tomcat
cd tomcat/
上传tomcat所需的依赖包
使用tar xf 解压三个压缩包vim Dockerfile
FROM centos:7
LABEL function="tomcat image" author="tc" createtime="2024-07-16"ADD jdk-8u391-linux-x64.tar.gz /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHADD apache-tomcat-9.0.16.tar.gz /opt/
EXPOSE 8080
CMD ["/opt/apache-tomcat-9.0.16/bin/catalina.sh", "run"]docker build -t tomcat:9.0 .   #构建镜像
docker images   #查看镜像
docker run -d --name tomcat1 -p 666:8080 tomcat:9.0   #启动容器

 

登录网页查看 

通过ARG传参构建不同版本的tomcat

以上述构建的tomcat镜像为基础

cd /opt/tomcat
vim DockerfileFROM centos:7
LABEL function="tomcat image" author="tc" createtime="2024-07-16"ADD jdk-8u391-linux-x64.tar.gz /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHARG VER
ADD $VER /opt/tomcat
EXPOSE 8080
CMD ["/opt/tomcat/bin/catalina.sh", "run"]docker build --build-arg VER=apache-tomcat-8.5.16 -t tomcat:8.5 . #构建8.5版本tomcat镜像
docker build --build-arg VER=apache-tomcat-9.0.16 -t tomcat:9.0 . #构建9.0版本tomcat镜像

 

验证:

案例二:缩小镜像的体积

方法一:使用较小体积的基础镜像

以上述实验为基础

cd /opt/tomcat
mv Dockerfile Dockerfile.bakvim Dockerfile
FROM openjdk:8-jdk-alpine
ARG VER
COPY $VER /opt/tomcat/
CMD ["/opt/tomcat/bin/catalina.sh", "run"]docker build --build-arg VER=apache-tomcat-9.0.16 -t tomcat:9 . #构建镜像
docker run -d --name a3 -p 1313:8080 tomcat:9

测试访问

方法二:多级构建减少体积

1、先源码编译nginx

cd /opt
mkdir nginx_bian
cd nginx_bian/
上传nginx压缩包
cd /etc/yum.repos.d/
cp CentOS-Base.repo /opt/nginx_bian/cd /opt/nginx_bian/
vim Dockerfile
FROM centos:7LABEL author="ikun" createtim="2024-07-15" usage="nginx image"ADD nginx-1.26.1.tar.gz /opt/
ADD CentOS-Base.repo /etc/yum.repos.d/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \useradd -M -s /sbin/nologin nginx && \cd /opt/nginx-1.26.1/ && \./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \make && \make installCMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]docker build -t nginxsrc:v1 .docker run -id nginx:v1
docker ps -acd /opt/nginx
cp -r html /opt/nginx_bian/docker run -id --name aaa -p 123:80 -v /opt/nginx_bian/html/:/usr/local/nginx/html/ nginx:v1docker ps -a

 

 2、多级构建减小体积

vim Dockerfile
FROM centos:7 as first   #为第一级构建镜像设置别名ADD nginx-1.26.1.tar.gz /opt/
ADD CentOS-Base.repo /etc/yum.repos.d/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \useradd -M -s /sbin/nologin nginx && \cd /opt/nginx-1.26.0/ && \./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \make && \make installFROM centos:7      #开启第二级构建
COPY --from=first /usr/local/nginx/ /usr/local/nginx/     #copy --from 从其他构建阶级中复制源文件
RUN useradd -M -s /sbin/nologin nginx   #运行用户必要命令CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]docker build -t nginx:v2 .
docker images
docker run -d --name mmm -p 80:80 nginx:v2
docker ps -a

 

 浏览器访问测试:http://192.168.10.101:10

总结:

如何缩小镜像的体积大小?

1)尽可能的使用较小体积的基础镜像(推荐使用 alpine 镜像)
2)尽可能的减少Dockerfile中的指令数量,从而减少镜像的层数
3)在RUN指令结尾添加清空安装软件的缓存和软件包的命令
4)使用 .dockerignore 文件,添加不需要复制到镜像里的文件名或子目录名
5)容器镜像里一般只运行单个应用
6)使用多阶段构建的方法           
FROM 第一构建阶段的基础镜像 as 阶段别名      #在第一阶段,安装依赖项并构建项目
....  
FROM 第二构建阶段的基础镜像                  #在第二阶段,复制上一阶段构建产物的文件或目录,并使用它来运行应用程序,这样最终的镜像中就不会有不必要的依赖和代码
COPY --from=第一构建阶段的别名  第一构建阶段的项目文件或目录  当前阶段的路径
....
CMD或ENTRYPOINT 指定容器启动命令     

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

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

相关文章

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆💖 远程ssh💖查看ubuntu桌面💖 远程向日葵 二、部署LLMS大模型&yolov5物体检测⭐2.1 快速启动LLMS大模型💖拉取代码💖下载mode数据&#x…

第九课:服务器发布(静态nat配置)

一个要用到静态NAT的场景,当内网有一台服务器server1,假如一个用户在外网,从外网访问内网怎么访问呢,无法访问,这是因为外网没办法直接访问内网,这时候需要给服务器做一个静态NAT。 静态NAT指的是给服务器…

gltf模型加载 与3d背景贴图

Poly Haveny 用于3d模型跟贴图下载资源 Sketchfab 里面有免费的模型 模型放到public里面 const loader new GLTFLoader()// 加载GLTF模型loader.load(/scene.gltf,(gltf) > {// 将加载的模型添加到场景中scene.add(gltf.scene)// 现在你可以开始渲染循环了let angle …

深度学习落地实战:基于UNet实现血管瘤超声图像分割

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代…

minimap2安装与使用(v 2.28)生物信息学工具26

01 背景 Minimap2 是一个多功能的序列比对程序,可以将 DNA 或 mRNA 序列与大型参考数据库进行比对。典型的使用案例包括:(1)将 PacBio 或 Oxford Nanopore 基因组读长映射到人类基因组;(2)在误…

类和对象(补充)

1.static成员 1>静态成员变量在类外进行初始化 2>静态成员变量为所有类对象所共享,不属于任何具体对象,存放在静态区中 3>静态成员函数没有this指针,可访问其他静态成员,但不可访问非静态的 4>非静态成员函数可以…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免…

SQL Server 使用 OPTION (RECOMPILE) 和查询存储的查询

设置 我们正在使用 WideWorldImporters 数据库,您可以从 Github 下载【sql-server-samples/samples/databases/wide-world-importers at master microsoft/sql-server-samples GitHub】。我正在运行SQL Server 2017 的最新 CU【https://sqlserverbuilds.b…

[Vulnhub] digitalworld.local-JOY snmp+ProFTPD权限提升

信息收集 IP AddressOpening Ports192.168.101.150TCP:21,22,25,80,110,139,143,445,465,587,993,995 $ nmap -p- 192.168.101.150 --21,22,25,min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP logi…

基于Java中的SSM框架实现求职招聘网站系统项目【项目源码】

基于Java中的SSM框架实现线求职招聘网站系统演示 研究方法 本文的研究方法主要有: (1)调查法 调查法就是在系统的构思阶段,设计者对系统的功能和系统的现状有些不了解,需要去实地的去和本系统相关的区域进行调查&am…

函数的形状怎么定义?

在TypeScript中,函数的形状可以通过多种方式定义,以下是几种主要的方法: 1、函数声明:使用function关键字声明函数,并直接在函数名后的括号内定义参数,通过冒号(:)指定参数的类型&a…

Mojo AI编程语言(六)异常处理:提升代码健壮性

目录 1. 概述 2. 异常处理的基本概念 2.1 什么是异常 2.2 异常处理的重要性 3. Mojo语言中的异常处理机制 3.1 异常的定义 3.2 抛出异常 3.3 捕获异常 4. 异常处理的详细实现 4.1 多重异常捕获 4.2 异常链 4.3 使用自定义异常 4.4 异常的嵌套捕获 4.5 使用 asser…

数据结构——单链表详解(超详细)(2)

前言: 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现,不过为了保证文章的简洁,小编把它分成了两篇来写,这一篇小编紧接上一篇文章继续写单链表函数功能的实现: 目录: 1.单链表剩余函数的编写 1.…

Lua 运算符

Lua 运算符 Lua 是一种轻量级的编程语言,广泛用于游戏开发、脚本编写和其他应用程序。它具有一套丰富的运算符,用于执行各种数学和逻辑操作。本文将详细介绍 Lua 中的运算符,包括算术运算符、关系运算符、逻辑运算符和其他特殊运算符。 算术…

高级java每日一道面试题-2024年7月17日

面试官: java中都有哪些引用类型? 我回答: 强引用(Strong Reference) 描述:这是最常见和最直观的引用类型,我们通常在代码中创建的对象引用就是强引用。例如,Object obj new Object();。只要强引用存在,…

Idea如何快速高效的修改项目的包名

文章目录 前言一、全局替换的快捷键二、弹出如下的界面 前言 当我们有时候在做项目迁移的时候,需要快速的修改项目的包名!那么如何快速高效的修改项目的报名呢? 经过尝试了很多方法!最简单的方法就是利用全局替换来直接替换报名&…

微服务到底是个什么东东?

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的…

通过反射机制给已知属性赋值

最近在看spring,在手写spring框架之前,需要巩固一下反射。 反射有这样一个简单的例子,记录一下。 假如你知道age这个属性名,但是不知道属性类型,也可以写: 可以获取到属性的类型

昇思25天学习打卡营第11天 | mindspore 实现 ResNet 50 迁移学习

1. 背景: 使用 mindspore 学习神经网络,打卡第 11 天;主要内容也依据 mindspore 的学习记录。 2. 迁移学习介绍: mindspore 实现 ResNet 50 迁移学习; 具体 ResNet 50 的模型原理以及实现,可以参考本博客…

谈谈我对李彦宏说的“不要卷模型,要卷应用”的理解

我理解李彦宏的发言是强调人工智能技术应该关注应用而不是仅仅关注模型的发展。他认为AI技术已经从辨别式(discriminative)转向了生成式(generative),意味着AI不再仅仅是识别和分类问题,而是能够创造新的内…