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)。

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

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

相关文章

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…

springboot实战(七)之jackson配置前后端交互下划线转驼峰对象序列化与反序列化

目录 环境: 1.驼峰转下划线配置 1.1单个字段命名转化使用JsonProperty注解 1.2单个类进行命名转化 3.全局命名策略配置 2. 序列化以及反序列化 2.1序列化 2.2反序列化 3.自定义序列化与反序列化 在Web开发中,JSON(JavaScript Obje…

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…

数据结构题型10-链栈

//参考博客&#xff1a;https://blog.csdn.net/weixin_37716512/article/details/104068102 #include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct Linknode {Elemtype data;…

DS18B20温度传感器

DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器 这种一线总线就是 三线制 SPI DS18B20的 配置寄存器&#xff1a; TM 是测试位&#xff0c;出厂设置就被设置为0&#xff0c;不需要改动&#xff0c; R1、R…

企业架构LNMP学习笔记61

Nginx作为tomcat的前段反向代理&#xff1a; 在实际业务环境中&#xff0c;用户是直接通过域名访问&#xff0c;基于协议一般是http、https等。默认tomcat运行在8080端口。一般会通过前端服务器反向代理到后端的tomcat的方式&#xff0c;来实现用户可以通过域名访问tomcat的we…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家&#xff0c;我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司&#xff0c;但了解到的收款手续费率通常都在0.6左右&#xff0c;最低也只能降到0.38。这个过程吃过不少苦头。毕竟&#xff0c;收款功能是我们商家的命脉&…

AI聊天ChatGPT系统源码卡密验证开源版

ChatGPT卡密验证版源码是一个基于PHP7.4和MySQL5.6的聊天AI源码&#xff0c;它不仅支持暗黑模式、反应速度极快&#xff0c;而且充值方面采用后台生成卡密方式&#xff0c;方便快捷&#xff0c;如果您有能力将其接入在线支付&#xff0c;即可进一步拓展充值方式&#xff0c;为更…

KMeans算法全面解析与应用案例

目录 一、聚类与KMeans介绍聚类的基础概念KMeans算法的重要性 二、KMeans算法原理数据集和特征空间距离度量算法步骤 三、KMeans案例实战案例背景&#xff1a;客户细分数据集说明Python实现代码输出与解释 四、KMeans的优缺点优点计算效率高算法简单易于实现 缺点需要预设K值对…

一、机器学习基础知识:基本概念与Python开发环境

文章目录 1、机器学习的不同类型1.1 监督学习1.2 无监督学习1.3 强化学习 2、Python开发环境2.1 Python第三方库2.2 AnacondaPycharm集成开发环境 1、机器学习的不同类型 机器学习属于人工智能的一个分支&#xff0c;专门用于对数据进行自动分析以发现相关规律&#xff0c;从而…

视频监控/视频汇聚/安防视频监控平台EasyCVR配置集群后有一台显示离线是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

芯片验证就是一次旅行

如果你国庆希望去一个你不曾去过的城市旅行&#xff0c;比如“中国苏州”。对游客来说&#xff0c;它是个蛮大的城市&#xff0c;有许多景点可以游玩&#xff0c;还有许多事情可以做。但实际上&#xff0c;即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…

肖sir__mysql中数据库后端无法展示

mysql中数据库后端无法展示&#xff1a; 错误现象 解决方法&#xff1a; mysql中数据库后端无法展示&#xff1a;my.cnf (5,7数据库) 在 mysql 配置文件中加入&#xff1a; sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 或者重启数据库

Android Kotlin 基础详解

1,基础语法 1.1 可变变量与不可变变量 可以多次赋值的变量是可变变量&#xff0c;用关键字var表示&#xff1a; var <标识符> : <类型> <初始化值> 注意&#xff0c;在kotlin中成员变量不会赋默认值&#xff0c;不像java一样&#xff0c;必须手动添加默…

Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl总结(一百六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

「大数据-2.1」HDFS集群启停命令

目录 一、HDFS集群一键启停脚本 1. HDFS集群的一键启动脚本 2. HDFS集群的一键关闭脚本 二、单进程启停 1. hadoop-daemon.sh脚本 2. hdfs脚本 三、总结 1. 一键启停脚本 2. 独立进程启停 一、HDFS集群一键启停脚本 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 1. HDFS集群…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy&#xff08;5.15&#xff09; ros2版本: humble 安装参考&#xff1a; Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可&#xff0c;到安装软件包的时候&#xff0c;若只为开发&#xff0…

【LeetCode热题100】--56.合并区间

56.合并区间 排序&#xff1a; 如果按照区间的左端点排序&#xff0c;那么在排完序的列表中&#xff0c;可以合并的区间一定是连续的&#xff0c;如下图所示&#xff0c;标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间&#xff0c;它们在排完序的列表中是连续的 算法&a…

安科瑞AMC16-DETT铁塔jizhan直流电能计量模块,直流计量用

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 9月20日&#xff0c;在杭州亚运会火炬传递的现场&#xff0c;不少人通过网络与亲友连线&#xff0c;共同见证火炬传递的历史时刻。上午6时&#xff0c;杭州铁塔的一线通信保障人员共27人就已经在本次火炬传递收官点位奥体中心西广场附近&a…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序&#xff1a; ① 当前运行的进程&#xff1a;陷阱程序&#xff08;系统调用&#xff09; 和 故障程序&#xff08;page fault&#xff09; &#xff0c;进程运行在内核态的时候&#xff0c;其实就是在执行进程在用户态触发的…