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.xdnf.cn/news/143199.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 接雨水 木桶理论、dp预处理

原题链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题面: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入&#xff1a…

计算机里的神灵(SCIP)

计算机程序的构造和解释 我找到计算机里的神灵了,开心一刻 下面是从MIT官网下载的 SCIP求值器(解释器)的代码,这个官网是个宝藏库 还有其他视频课程和 SCIP的问题答案和可运行代码 链接:https://ocw.mit.edu/courses/6…

VS2022 编译protobuf , qt 使用

一、下载源码 protobuf: 同步 https://github.com/protocolbuffers/protobuf (gitee.com) 下载如v3.11.2 版本 二、下载CMake 三、编译 1、在1处选择源码目录下的cmake 目录;在2处选择一处空目录(自己随便建) 2、点击config,选择…

系统架构设计师-大数据

目录 一、大数据 1、大数据架构 2、大数据技术生态 3、Lambda架构 4、Kappa架构 5、Lambda架构与Kappa架构对比 一、大数据 1、大数据架构 大数据是指其大小或复杂性无法通过现有常用的软件工具,以合理的成本并在可接受的时限内对其进行捕获、管理和处理的数据集。…

【rhce考试时间是每年什么时候呢?】

RHCE9.0 新技术 公开课 10月11日,12日 感兴趣可留言 如果你是一个系统管理员,或者正朝着这个方向努力前进,那么你可能已经听过RHCE这个词。RHCE是Red Hat Certified Engineer的缩写,是全球公认的Linux系统工程师认证之一。通过获…

获取热门电影算法

功能#2:获取热门电影 为我们的“Netflix”项目实现“获取热门电影”功能。 我们将介绍以下内容 描述 解决方案 复杂性措施 时间复杂度 空间复杂度 描述# 现在,我们需要建立一个标准,以便将来自多个国家的顶级电影组合成一个单一的顶级电影…

postman访问新建项目报404

"status": 404 查看项目,发现启动类和代码执行部分没有在同一个包下,导致controller的访问没有注册到启动类下;

定义现代化实时数据仓库,SelectDB 全新产品形态全面发布

导读:9 月 25 日,2023 飞轮科技产品发布会在线上正式召开,本次产品发布会以 “新内核、新图景” 为主题,飞轮科技 CEO 马如悦全面解析了现代化数据仓库的演进趋势,宣布立足于多云之上的 SelectDB Cloud 云服务全面开放…

【设计模式】五、原型模式

文章目录 概述示例传统的方式的优缺点原型模式原理结构图-uml 类图 原型模式解决克隆羊问题的应用实例Sheep类实现clone()运行原型模式在 Spring 框架中源码分析 深入讨论-浅拷贝和深拷贝浅拷贝的介绍 小结 概述 示例 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年…

【轮趣-科大讯飞】M260C 环形六麦测试 1 - 产品介绍与配置

原文发布在飞书上,想要的伙伴请联系我,懒得把飞书链接放这了

二十二、MySQL联合查询

1、基础概念 (1)语法: select …… from …… union [all] select …… from …… (2)理解: 所谓的联合查询,就是对多个条件查询结果进行联合处理,取其并集。 2、实际操作 &…

K8S:pod集群调度及相关操作

文章目录 一.pod集群调度概念1.调度约束( List-Watch组件)2.List-Watch的工作机制(1)List-Watch的工作机制流程(2)List-Watch的工作机制图示 3.调度的过程(1)调度的任务(2)调度选择p…

Java 设计模式——抽象工厂模式

目录 1.概念2.结构3.实现4.优缺点5.使用场景6.模式扩展7.JDK源码解析——Collection.iterator方法 1.概念 (1)Java 设计模式——工厂方法模式 中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机等。这些工厂只生产同种类产品…

sqlmap tamper脚本编写

文章目录 tamper脚本是什么?指定tamper脚本运行sqlmap安全狗绕过tamper脚本 tamper脚本是什么? SQLMap 是一款SQL注入神器,可以通过tamper 对注入payload 进行编码和变形,以达到绕过某些限制的目的。但是有些时候,SQLM…

Qt创建线程(使用moveToThread方法创建子线程)

1.moveTothread方法: (1)要使用moveToThread方法必须继承与QObject类 (2)创建任务对象时不能指定父对象 例子: MyWork* work new MyWork(this); // error MyWork* work new MyWork; // ok (3&#…

InputAction的使用

感觉Unity中InputAction的使用,步步都是坑。 需求点介绍 当用户长按0.5s 键盘X或者VR left controller primaryButton (即X键)时,显示下一个图片。 步骤总览 创建InputAction资产将该InputAction资产绑定到某个GameObject上在对应的script中&#xf…

[Linux]多线程编程

[Linux]多线程编程 文章目录 [Linux]多线程编程pthread_create函数pthread_join函数pthread_exit函数pthread_cancel函数pthread_self函数pthread_detach函数理解线程库和线程id Linux操作系统下,并没有真正意义上的线程,而是由进程中的轻量级进程&#…

9、SpringBoot_日志使用

三、日志 1.日志的使用 使用 RestController public class LogController {public static final Logger log LoggerFactory.getLogger(LogController.class);GetMapping("/index")public String index(){log.info("请求info 信息");log.debug("请…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller,用于处理请求、获取数据、返回结果(重要) 作…

JetBrains常用插件

Codota AI Autocomplete Java and JavaScript:自动补全插件 Background Image plus:背景图片设置 rainbow brackets:彩虹括号,便于识别 CodeGlance2: 类似于 Sublime 中的代码缩略图(代码小地图&#xff…