当前位置: 首页 > 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. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...