当前位置: 首页 > news >正文

docker系列(7) - Dockerfile

文章目录

  • 7. Dockerfile
    • 7.1 Dockerfile介绍
    • 7.2 指令规则
    • 7.3 指令说明
      • 7.3.1 RUN命令的两种格式
      • 7.3.1 CMD命令覆盖问题
      • 7.3.2 ENTRYPOINT命令使用
      • 7.3.3 ENV的使用
    • 7.4 构建tomcat Dockerfile案例
      • 7.4.1 准备原始文件
      • 7.4.2 编写Dockerfile
      • 7.4.3 构建镜像
      • 7.4.4 验证镜像
    • 7.5 构建jdk基础镜像(alpine-java8)
      • 7.5.1 准备glibc包
      • 7.5.2 编写Dockerfile
      • 7.5.3 构建镜像
      • 7.5.4 验证镜像
      • 7.5.5 上传镜像到docker-hub
        • 7.5.5.1 注册创建存储库
        • 7.5.5.2 打标签
        • 7.5.5.3 上传镜像
    • 7.6 基于自定义的镜像构建微服务(SpringBoot)案例
      • 7.6.1 准备微服务包
      • 7.6.2 编写Dockerfile
      • 7.6.3 构建镜像
      • 7.6.4 运行镜像

7. Dockerfile

7.1 Dockerfile介绍

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需要的指令和参数构成的脚本。
官方语法文档:https://docs.docker.com/engine/reference/builder/
上面打不开的,可以https://9w94o-jhdoy-qp3y6-s66fo.glados.space 通过这个地址申请打开。

7.2 指令规则

  1. 指令大写,后面跟随至少一个参数
  2. 指令按照从上到下顺序执行
  3. #表示注释
  4. 每条指令会创建一个新的镜像层,并对镜像进行提交

7.3 指令说明

指令说明
FROM基础镜像,当前新镜像是基于哪个镜像的,指定一个存在的镜像作为模板,第一条必须是FROM
MAINTAINER镜像作者的姓名和邮箱
RUN容器构建时需要执行的命令
两种格式:shell格式和exec格式
RUN命令是在docker构建时运行
EXPOSE当前容器对外暴露的端口
WORKDIR指定在创建容器后,终端默认登录进来的工作目录
USER指定该镜像以什么样的用户去执行,如果不指定,默认是root
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY将容器内路径和主机路径关联。
VOLUME容器卷,用于数据保存和持久化工作
VOLUME指定的路径宿主机和容器内部的路径必须是相同的,如果要不同,只能通过docker run -v的形式指定
CMD指定容器启动后,需要执行的某个命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。
ENTRYPOINT类似于CMD命令,但是ENTRYPOINT不会被docker run后面的命令覆盖,
而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。

7.3.1 RUN命令的两种格式

shell格式:RUN yum -y install vim
exec格式:RUN [“./test.php”,“dev”,“offline”]

7.3.1 CMD命令覆盖问题

注意事项:当带参数执行docker run命令时,参数会覆盖已有的CMD命令。

# 第一种,不带参数的,这种情况可以正常运行
docker run -it -p 8080:8080 billygoo/tomcat8-jdk8

在这里插入图片描述

在这里插入图片描述

# 第二种,带参数/bin/bash,这种情况不能正常运行
docker run -it -p 8080:8080 billygoo/tomcat8-jdk8 /bin/bash

在这里插入图片描述

在这里插入图片描述

这时候就没看到tomcat启动起来,通过docker ps -a可以看到COMMAND列被替换为了/bin/bash,所以就根本没执行catalina.sh run

CMD是在docker run时运行,而RUN是在docker build时运行。

7.3.2 ENTRYPOINT命令使用

当ENTRYPOINT和CMD一起使用时,即在ENTRYPOINT的后面一行添加了CMD命令,那么CMD不再是直接运行的命令,而是将其内容作为参数传递给ENTRYPOINT指令。

ENTRYPONIT ["nginx" "-c"]     # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

比如上面的2行,CMD后面的不再是可以直接运行的命令,而是当做参数传递给了ENTRYPOINT,那么在实际执行时会执行下面shell命令

nginx -c /etc/nginx/nginx/conf

第一点需要注意的地方
这里的CMD包含的内容,就是给nginx指定了在启动时,默认的配置文件是/etc/nginx/nginx/conf。

第二点需要注意的地方
假设在执行docker run的命令时,如果又指定了外部的参数,如下:

docker run nginx:test -c /etc/nginx/new.conf

这里对照docker run的语法对比了下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

-c如果作为COMMAND,那么/etc/nginx/new.conf就作为ARG, 即如下:

docker run nginx:test /etc/nginx/new.conf

这时/etc/nginx/new.conf作为参数可以替换掉原有的CMD中的参数。

7.3.3 ENV的使用

ENV可以用来定义变量:

# 指定进入到容器内部时的默认路径
ENV BASE_PATH /opt/local/
WORKDIR $BASE_PATH

7.4 构建tomcat Dockerfile案例

7.4.1 准备原始文件

glic文件,从下面连接获取。
https://gitee.com/pang123/alpine-tomcat/

tomcat文件,从官网下载,这里下载tomcat8 core包10m。
https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.93/bin/apache-tomcat-8.5.93.tar.gz

基础镜像包,这里选用alpine linux,非常小,只有5.61MB,不需要手工下载。

7.4.2 编写Dockerfile

FROM alpine:3.18.3COPY glibc/ .
ADD apache-tomcat-8.5.93.tar.gz /usr/local   
ENV TOMCAT_HOME=/usr/local/apache-tomcat-8.5.93
RUN \mv sgerrand.rsa.pub /etc/apk/keys/sgerrand.rsa.pub; \apk add *.apk; \rm -rf *.apk; \#install jdk and useful utilsecho "http://mirrors.aliyun.com/alpine/v3.18/main/" > /etc/apk/repositories; \echo "http://mirrors.aliyun.com/alpine/v3.18/community/" >> /etc/apk/repositories; \apk upgrade; \apk add --no-cache ca-certificates unzip curl bash bash-completion wget vim net-tools tzdata openjdk8; \rm -rf /tmp/* /var/cache/apk/*; \ln -s $TOMCAT_HOME /usr/local/tomcat;ENV CATALINA_HOME=/usr/local/tomcat \LANG=C.UTF-8 \TZ=Asia/Shanghai
ENV PATH=$CATALINA_HOME/bin:$PATH
WORKDIR /usr/local/tomcat
EXPOSE 8080CMD ["catalina.sh", "run"]

7.4.3 构建镜像

# 构建命令语法(最后有一个点号)
docker build -t 新镜像名字:TAG .# tomcat案例
docker build -t tomcat:8.5.93 .

构建时间比较长,大约5分钟,构建成功后,在dokcer images中可以查看到镜像只有190M左右。

在这里插入图片描述

7.4.4 验证镜像

docker run -d -p 8080:8080 tomcat:8.5.93

在这里插入图片描述

7.5 构建jdk基础镜像(alpine-java8)

由于每次基于alpine构建镜像时间非常长,所以我们先基于alpine构建jdk8环境的基础镜像。
以后安装java应用时,可以直接使用此镜像扩展,也不需要再准备glibc包,这里jdk环境是基于openjdk8。

7.5.1 准备glibc包

https://gitee.com/pang123/alpine-tomcat/下面的glibc文件夹整个拷贝到和Dockerfilie相同目录。

7.5.2 编写Dockerfile

FROM alpine:3.18.3
MAINTAINER 硅谷工具人COPY glibc/ .
RUN \mv sgerrand.rsa.pub /etc/apk/keys/sgerrand.rsa.pub; \apk add *.apk; \rm -rf *.apk; \#install jdk and useful utilsecho "http://mirrors.aliyun.com/alpine/v3.18/main/" > /etc/apk/repositories; \echo "http://mirrors.aliyun.com/alpine/v3.18/community/" >> /etc/apk/repositories; \apk upgrade; \apk add --no-cache ca-certificates unzip curl bash bash-completion wget vim net-tools tzdata openjdk8; \rm -rf /tmp/* /var/cache/apk/*;CMD /bin/bash

7.5.3 构建镜像

docker build -t alpine_java8:1.0.0 .

在这里插入图片描述

7.5.4 验证镜像

docker run -it alpine_java8:1.0.0 

在这里插入图片描述

7.5.5 上传镜像到docker-hub

7.5.5.1 注册创建存储库

先注册,https://hub.docker.com
然后创建docker-hub的存储库。
在这里插入图片描述

7.5.5.2 打标签
docker tag alpine_java8:1.0.0 wz220321/alpine_java8:1.0.0

tag后面第一个alpine_java8:1.0.0是本地的镜像的名称和版本
tag后面第二个wz220321/alpine_java8:1.0.0 是docker-hub服务器存储库的名称和指定的版本号。
在这里插入图片描述

7.5.5.3 上传镜像

注意:先登录,然后才能上传,不然没权限,账号和密码就是注册时填写的。
先登录成功后,将本地打过标签的镜像上次到Docker Hub的仓库中。

docker login -u wz220321 -p 你的密码
docker push wz220321/alpine_java8:1.0.0

在这里插入图片描述

然后去docker_hub上查看就可以看到,这个包含jdk8的压缩包仅仅100m左右。
在这里插入图片描述

我们也可以直接通过search看到这个镜像。
在这里插入图片描述

7.6 基于自定义的镜像构建微服务(SpringBoot)案例

7.6.1 准备微服务包

准备好SpringBoot程序,启动端口是9001。
在这里插入图片描述

本地测试:
在这里插入图片描述

程序打包jar
在这里插入图片描述

7.6.2 编写Dockerfile

这里基于7.5中自己制作的jdk8的镜像wz220321/alpine_java8镜像编写。

FROM wz220321/alpine_java8:1.0.0
MAINTAINER 硅谷工具人# 映射本地宿主机目录/tmp链接到容器的/tmp目录
VOLUME /tmp
# 将jar包添加到容器中,并重命名
ADD springboot-demo-1.0-SNAPSHOT.jar springboot.jar
# 运行jar包
#RUN bash -c 'touch /springboot.jar'
ENTRYPOINT ["java", "-jar", "/springboot.jar"]
EXPOSE 9001

7.6.3 构建镜像

docker build -t springboot:1.0 .

在这里插入图片描述

7.6.4 运行镜像

docker run -d -p 9001:9001 springboot:1.0

web测试:
在这里插入图片描述

通过上面的案例可以看到这个容器运行springboot程序,整个镜像只需要195M就可以了。
alipine是个非常轻量级linux,推荐大家使用,如果是部署java程序则可以直接引用我制作的jdk镜像(wz220321/alpine_java8:1.0.0)。

相关文章:

docker系列(7) - Dockerfile

文章目录 7. Dockerfile7.1 Dockerfile介绍7.2 指令规则7.3 指令说明7.3.1 RUN命令的两种格式7.3.1 CMD命令覆盖问题7.3.2 ENTRYPOINT命令使用7.3.3 ENV的使用 7.4 构建tomcat Dockerfile案例7.4.1 准备原始文件7.4.2 编写Dockerfile7.4.3 构建镜像7.4.4 验证镜像 7.5 构建jdk基…...

Spring面试题8:面试官:说一说Spring的BeanFactory

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory Spring的BeanFactory是Spring框架的核心容器,负责管理和创建Bean对象。它是一个工厂类,用于实例化、配置和管理Bean的…...

Win10专业版系统一键重装怎么操作?

Win10专业版系统一键重装怎么操作?与传统的系统重装相比,一键重装不仅省去了繁琐的安装步骤,这一简单操作使得系统维护和恢复变得更加便捷,让用户不再为系统问题而烦恼。下面小编给大家详细介绍关于一键重装Win10专业版系统的操作…...

十大服装店收银系统有哪些 好用的服装收银软件推荐

服装店收银系统对于门店和服装卖场来说非常重要,可以提高工作效率。下面是推荐的十大服装店收银系统,供开设服装店的企业选择合适的收银软件用于经营管理。 1、核货宝收银系统 支持快速收银,同时适用于服装行业,能够支持多规格多…...

算法通过村第八关-树(深度优先)白银笔记|深度和高度问题

文章目录 前言1. 最大深度问题2. 判断平衡树3. 最小深度4. N叉树的最大深度总结 前言 提示:我的整个生命,只是一场为了提升社会地位的低俗斗争。--埃莱娜费兰特《失踪的孩子》 这一关我们看一些比较特别的题目,关于二叉树的深度和高度问题。这…...

Redis安装和使用

这里写目录标题 Redis安装和使用一.数据库类型1.关系型数据库2.非关系型数据库3.区别(1)数据存储方式不同(2)扩展方式不同(3)对事务性的支持不同 二.redis简介1.Redis 优点2.哪些数据适合放入缓存中&#x…...

UML基础与应用之面向对象

UML(Unified Modeling Language)是一种用于软件系统建模的标准化语言,它使用图形符号和文本来描述软件系统的结构、行为和交互。在面向对象编程中,UML被广泛应用于软件系统的设计和分析阶段。本文将总结UML基础与应用之面向对象的…...

将 Ordinals 与比特币智能合约集成:第 2 部分

在上一篇文章中,我们展示了一种将 Ordinal 与智能合约集成的方法,即将Ordinal和合约放在同一个 UTXO 中。 今天,我们介绍了一种集成它们的替代方案,即它们位于单独的 UTXO 中。 作为展示,我们开发了一个智能合约&…...

PCL 法线空间采样(C++详细过程版)

法线空间采样 一、概述二、代码实现三、结果展示1、原始点云2、采样结果一、概述 法线空间采样在PCL里有现成的调用函数,具体算法原理和实现代码见:PCL 法线空间采样。为充分了解法线空间采样算法实现的每一个细节和有待改进的地方,使用C++代码对算法实现过程进行复现。 二…...

论文阅读:AugGAN: Cross Domain Adaptation with GAN-based Data Augmentation

Abstract 基于GAN的图像转换方法存在两个缺陷:保留图像目标和保持图像转换前后的一致性,这导致不能用它生成大量不同域的训练数据。论文提出了一种结构感知(Structure-aware)的图像转换网络(image-to-image translation network)。 Proposed Framework…...

CNC 3D浮雕 Aspire 11.55 Crack

Aspire 提供了功能强大且直观的软件解决方案,用于在 CNC 铣床上创建和切割零件。有用于 2D 设计和计算 2D 刀具路径的工具,例如仿形、型腔加工和钻孔以及 2.5D 刀具路径,包括:V 形雕刻、棱镜雕刻、成型刀具路径、凹槽、 倒角刀具路…...

【Clickhouse2022.02 查询优化】

一、现场场景概述 现场每天每张表入库数据量大约2-4亿条,页面涉及到自定义时间段查询(白天08:00-15:00,夜晚23:00-06:00)与不同时间段(最近一天、一周、一个月和全部)的统计指标查询。 二、主要问题 时间跨度大无查询或查询条件命中数据过多的分页查询场景速度慢 (主要是数据…...

PMP证书在国内已经泛滥了,还有含金量吗?

没有泛滥吧?这个证书现在就是趋向于项目管理人士要去考的呀,也不是考了没用,提升自身个人的能力、找工作方面和晋升加薪方面确实有用呀,不然报名费那么贵,为什么越来越多人考呢? 1、提升自身个人的能力 首…...

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流,相关的技术框架大行其道,就以目前主流的Vue、React框架来说,它们都基于组件化、响应式、虚拟DOM等技术思想的实现,但是具有不同开发使用方式以及实现原理&#…...

数据采集技术在MES管理系统中的应用及效果

在现代制造业中,MES生产管理系统已成为生产过程中不可或缺的一部分。MES管理系统能够有效地将生产计划、生产执行、质量管理等各个生产环节有机地衔接起来,从而实现生产过程的全面优化。本文将以某车间为例,探讨结合MES系统的数据采集技术的应…...

php函数usort使用方法

在 PHP 中,usort() 函数用于对数组进行排序,它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法: usort(array &$array, callable $cmp_function): bool参数说明: $array:要排序的数…...

35.浅谈贪心算法

概述 相信大家或多或少都对贪心算法有所耳闻,今天我们从一个应用场景展开 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号? 广播台覆盖地区k1北京、上海、天津…...

QT时间日期定时器类(1.QDate类)【QT基础入门 Demo篇】

使用时候需要包含头文件   创建一个 QDate 实例   设置 QDate 的日期   获取 QDate 的日期   获取当前是周几   判断 QDate 的有效性  格式化 QDate 的显示字符串   计算 QDate 的差值  QDate显示格式   年月日转换时间戳时间戳转换年月日 QDate相关…...

记一次实战案例

1、目标:inurl:news.php?id URL:https://www.lghk.com/news.php?id5 网站标题:趋时珠宝首饰有限公司 手工基础判断: And用法 and 11: 这个条件始终是为真的, 也就是说, 存在SQL注入的话, 这个and 11的返回结果必定是和正常页…...

Serv-U FTP服务器结合cpolar内网穿透实现共享文件并且外网可远程访问——“cpolar内网穿透”

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能…...

双模型混搭方案:OpenClaw同时接入千问3.5-27B与Llama3

双模型混搭方案:OpenClaw同时接入千问3.5-27B与Llama3 1. 为什么需要多模型混搭 去年我在尝试用AI自动化处理技术文档时,发现单一模型总是存在能力短板。比如用纯文本模型生成示意图说明时,要么需要手动补充描述,要么得额外调用…...

Redis专题(一)

1. 主从部署主从复制主要⽤于实现数据的冗余备份和读分担,并不是真正的高可用。一个主节点,一个或者多个从节点。同步数据的方向:单向 ,只能主节点到从节点。作用:数据冗余:除了数据持久化之外的一种数据冗…...

在Vivado里调通3/4删余卷积码Viterbi译码:从分支度量到回溯的完整避坑指南

Vivado平台实现3/4删余卷积码Viterbi译码的工程实践 在数字通信系统中,卷积码因其优异的纠错性能被广泛应用。802.11a等标准中采用的删余卷积码技术,通过有选择地删除部分编码比特来提高码率。本文将深入探讨如何在Vivado平台上实现3/4删余卷积码的Viter…...

论文写作卡壳不用愁!这几款AI工具帮你高效赶稿

写论文最怕思路卡壳?大纲憋不出来、正文续写没头绪、降重改到崩溃,还担心AI生成痕迹过不了检测?以下几款实用AI写作工具直击本硕生核心需求,从初稿到答辩全流程辅助,让写作效率直接翻倍。 一、SpeedAI科研小助手&#…...

定时任务XXL-Job

目录为什么是XXL-Job?SpringBoot 整合XXL-Job1)环境准备2)SpringBoot 项目依赖3)application.yml 配置4)XXL-Job 配置类5)定时任务业务类(核心代码)6)调度中心Web可视化界…...

谐波注入抑制永磁同步电机转矩脉动的复现研究

提取特定谐波注入抑制永磁同步电机转矩脉动【复现】 [1]复现文献:《用谐波注入抑制永磁同步电机转矩脉动_廖勇》 [2]控制思路:以抑制电机电流中较大的 5、7 次谐波分量为目的,实时提取谐波电流,注入谐波电压来抵消电机运行时电机电…...

Windows下OpenClaw安装详解:对接Kimi-VL-A3B-Thinking图文模型

Windows下OpenClaw安装详解:对接Kimi-VL-A3B-Thinking图文模型 1. 为什么选择OpenClaw与Kimi-VL-A3B-Thinking组合 去年我在处理大量图文资料归档时,发现手动整理效率极低。直到尝试将OpenClaw与Kimi-VL-A3B-Thinking模型对接后,才真正实现…...

搞定AI教材写作!工具分享及低查重策略,提升编写效率!

完成教材的初稿后,进行修改和优化的过程简直是一场“折磨”!在全面阅读全文时,要细致地查找逻辑漏洞和知识点错误,耗费的时间着实不小;而当调整一个章节的结构时,往往会牵涉到后面的多个部分,导…...

Docker 快速通关

一、Docker 大致介绍 Docker 可以帮助我们完成应用的 运行(run)、构建(build) 和 分享(share)。 它的核心目标很简单: 把应用和环境打包起来让应用在不同机器上尽量保持一致方便部署、迁移和…...

Linux网络诊断工具ping、traceroute等命令实战指南

在Linux系统的网络世界里,网络诊断工具就像是我们手中的“听诊器”,能够帮助我们精准地找出网络中存在的问题。今天,我们就来深入了解ping、traceroute等网络诊断命令的使用,通过实际操作和示例,让你轻松掌握使用这些工…...