Docker Dockerfile解析

news2024/12/24 22:13:46

Dockerfile是什么

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

官网:Dockerfile reference | Docker Docs

构建三步骤:

  • 编写Dockerfile文件
  • docker build命令构建镜像
  • docker run依镜像运行容器实例

Dockerfile构建过程解析

Dockerfile内容基础知识

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

Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成

小总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

*  Dockerfile是软件的原材料

*  Docker镜像是软件的交付品

*  Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

1、Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

3、Docker容器,容器是直接提供服务的。

Dockerfile常用保留字指令

参考tomcata8的dockerfile入门:https://github.com/docker-library/tomcat

FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from。

MAINTAINER

镜像维护者的姓名和邮箱地址。

RUN

容器构建时需要运行的命令。(RUN是在docker build时运行

两种格式:

1、shell格式

实例:RUN yum -y install vim

2、exec格式

EXPOSE

当前容器对外暴露出的端口。

WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点。

USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root。

ENV

用来在构建镜像过程中设置环境变量。

ENV MY_PATH /usr/mytest

        这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包(一般用这个,不用copy)

COPY

类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

  • COPY src dest
  • COPY ["src","dest"]
  • <src源路径>:源文件或者源目录
  • <dst目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

VOLUME

容器数据卷,用于数据保存和持久化工作.

CMD

指定容器启动后的要干的事情。

注意:

        Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

----------------------------------


参考官网Tomcat的dockerfile演示讲解:

1、官网最后一行命令


2、我们演示自己的覆盖操作

它和前面RUN命令的区别:

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

ENTRYPOINT

        也是用来指定一个容器启动时要运行的命令。类似于CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序

命令格式:

        ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

        当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成<ENTRYPOINT>"<CMD>"

案例如下:

        假设已通过 Dockerfile 构建了 nginx:test 镜像

优点:在执行docker run的时候可以指定ENTRYPOINT运行所需的参数。

注意:如果Dockerfile中如果存在多个ENTRYPOINT指令,仅最后一个生效。

小总结

案例

自定义镜像mycentosjava8

要求

镜像具备vim+ifconfig+jdk8功能。

JDK官网下载地址:Java Downloads | Oracle

JDK的下载镜像地址:小柒博客 | 开源软件镜像站

编写

Dockerfile文件(大写字母D)

FROM centos
MAINTAINER zzyy<zzyybs@126.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/

#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

构建

docker build  -t  新镜像名字:TAG .
注意:上面TAG后面有个空格,有个点

案例:docker build -t centosjava8:1.5 .

运行

docker run -it  新镜像名字:TAG

案例:docker run -it centosjava8:1.5 /bin/bash

虚悬镜像

是什么

仓库名、标签都是<none>的镜像,俗称dangling image。

Dockerfile写一个案例

        1、vim Dockerfile

from ubuntu
CMD echo 'action is success'

        2 docker build .

查看

docker image Is-f dangling=true

删除

命令:docker image prune

虚悬镜像已经失去存在价值,可以删除。

Docker 微服务实战

1、写一个springboot项目,端口为6001,并提供接口

@RestController
public class OrderController {
    @Value("${server.port}")
    private String port;

    @RequestMapping("/order/docker")
    public String helloDocker() {
        return "hello docker"+"\t"+port+"\t"+ UUID.randomUUID().toString();
    }

    @RequestMapping(value ="/order/index",method = RequestMethod.GET)
    public String index() {
        return "服务端口号: "+"\t"+port+"\t"+UUID.randomUUID().toString();
    }
}

2、把springboot打包成一个jar,例如:docker_boot-0.0.1-SNAPSHOT.jar

3、编写Dockerfile文件

# 基础镜像使用java

FROM java:8

# 作者

MAINTAINER zzyy

# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp

VOLUME /tmp

# 将jar包添加到容器中并更名为zzyy_docker.jar

ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar

# 运行jar包

RUN bash -c 'touch /zzyy_docker.jar'

ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]

#暴露6001端口作为微服务

EXPOSE 6001

4、将微服务jar包和Dockerfile文件上传到同一个目录下/mydocker

5、构建镜像(注意结尾有个点)

案例:docker build -t zzyy_docker:1.6 .

6、运行容器

案例:docker run -d -p 6001:6001 zzyy_docker:1.6

7、访问测试

总结

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

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

相关文章

Bun 1.0 正式发布,爆火的前端运行时,速度遥遥领先!

文章目录 一、包子1.0二、Bun 是一个一体化工具包为什么包子存在 二、Bun 是一个 JavaScript 运行时Node.js 兼容性速度TypeScript 和 JSX 支持ESM 和 CommonJS 兼容性网络 API热重载插件 一、包子1.0 Bun 1.0终于来了。 Bun 是一个快速、一体化的工具包&#xff0c;用于运行…

云原生微服务治理:服务发现、负载均衡与熔断策略

文章目录 什么是云原生微服务治理&#xff1f;服务发现客户端发现服务器端发现 负载均衡Ribbon - 基于客户端的负载均衡Nginx - 基于服务器的负载均衡 熔断策略Hystrix - 熔断器模式 结论 &#x1f389;欢迎来到云计算技术应用专栏~云原生微服务治理&#xff1a;服务发现、负载…

【AI视野·今日Robot 机器人论文速览 第三十九期】Fri, 22 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 22 Sep 2023 Totally 39 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers ForceSight: Text-Guided Mobile Manipulation with Visual-Force Goals Authors Jeremy A. Collins, Cody Houff, You Liang …

【项目】在线音乐播放器测试报告

目录 项目背景 项目功能 测试计划 功能测试 登录页面的测试 测试用例 测试结果 注册页面的测试 测试用例 测试结果 音乐列表页面的测试 测试用例 测试结果 出现的bug 搜索功能的bug 问题解决 删除功能的bug 问题解决 喜欢列表页面的测试 测试用例 测试结果…

【Web3】DAO相关的基础知识

这里写目录标题 DAO 的基础概念为什么需要 DAO&#xff1f;DAO 的种类 DAO 的运作方式知名 DAO 的介绍Bankless DAOSeeDAO DAO 的生态全景图分类治理框架DAO 的工具 DAO 众筹平台介绍 - JuiceBoxDAO 投票治理介绍 - SnapshotDAO 贡献 & 激励 - POAPDAO 信息管理 - NotionDA…

2023手把手教授neo4j安装及环境配置

安装包下载&#xff1a; 首先进入Neo4j官网&#xff1a;Neo4j Graph Database & Analytics | Graph Database Management System 在上方选择栏中选择“Products”&#xff0c;在其中选择“Deployment Center”&#xff0c;点击“Download Neo4j to get started” 然后往下…

qt操作sqlite数据库

有两种方法&#xff0c;一种使用qt中的QSqlDatabase模块&#xff0c;另一种使用sqlite3提供的c/c接口。 其中第一种需要需要在工程下的.pro文件中加入“QT sql”&#xff0c;在qt安装目录对应的编译器下的plugins目录中要有sqldrivers文件夹 第二种方法需要在sqlite官网&am…

umi+react+dva简单搭建一个项目框架(配置layout、antd、路由等)

目录 umireactdva简单搭建一个项目框架(配置layout、antd、路由等)创建项目引入antd抽离配置 config01: config / config.js02: config / router / router.js03&#xff1a;配置layout03_1 config.js03_2 router.js效果 umireactdva简单搭建一个项目框架(配置layout、antd、路由…

Vue系列(三)之 基础语法下篇【事件处理,表单综合案例,组件通信】

一. 事件处理 在 Vue.js 中&#xff0c;v-on 指令被用于监听 DOM 事件&#xff0c;并在事件触发时执行相应的方法&#xff0c;这些方法就是事件处理器。v-on 指令有简写形式 &#xff0c;例如 click"handleClick" 会监听点击事件并执行 handleClick 方法。 事件处理…

视频剪辑软件Premiere Pro 2022 mac(pr2022) v22.6.2中文版

Premiere Pro 2022 mac不仅可以帮助用户对各种视频进行剪辑、旋转、分割、合并、字幕添加、背景音乐等基础的处理&#xff0c;pr2022 mac还能帮助用户进行视频颜色校正、颜色分级、稳定镜头、调整层、更改片段的持续时间和速度、效果预设等操作&#xff0c;功能强大。 ​Premie…

服务注册发现_什么是服务治理

为什么需要服务治理 在没有进行服务治理前,服务之间的通信是通过服务间直接相互调用来实现的。 过程&#xff1a; 武当派直接调用峨眉派和华山派&#xff0c;同样&#xff0c;华山派直接调用武当派和峨眉派如果系统不复杂&#xff0c;这样调用没什么问题。但在复杂的微服务系统…

七、高斯朴素贝叶斯算法(Gaussian NB,Gaussian Naive Bayes)(有监督学习)

高斯朴素贝叶斯Gaussian Naive Bayes (GaussianNB). 可通过 partial_fit 对模型参数进行在线更新 一、算法思路 所谓高斯贝叶斯指的便是假定样本每个特征维度的条件概率均服从高斯分布&#xff0c;进而再根据贝叶斯公式来计算得到新样本在某个特征分布下其属于各个类别的后验…

计算机组成原理之硬件的基本组成,深入介绍两大计算机结构体系,从底层出发认识计算机。

大家好&#xff0c;欢迎阅读《计算机组成原理》的系列文章&#xff0c;本系列文章主要的内容是从零学习计算机组成原理&#xff0c;内容通俗易懂&#xff0c;大家好好学习吧&#xff01;&#xff01;&#xff01; 更多的优质内容&#xff0c;请点击以下链接查看哦~~ ↓ ↓ ↓ …

【Log】为类中的所有日志打印添加前缀

文章目录 前言验证探索后记 前言 有没有一种办法&#xff0c;在一个类中(业务逻辑)。logger.info 的时候自动加上日志前缀&#xff0c;这样子查日志更方便。stackoverflow 上面有对该问题的讨论&#xff0c;实测可用&#xff0c;这里记录一下。 来自stackoverflow 简洁可用的…

离线部署 python 3.x 版本

文章目录 离线部署 python 3.x 版本1. 下载版本2. 上传到服务器3. 解压并安装4. 新建软连信息5. 注意事项 离线部署 python 3.x 版本 1. 下载版本 python 各版本下载地址 本次使用版本 Python-3.7.0a2.tgz # linux 可使用 wget 下载之后上传到所需服务器 wget https://www.py…

使用Go开源的一款性能监控软件,开箱即用,自动化图表生成

使用Go开源的一款性能监控软件&#xff0c;开箱即用&#xff0c;自动化图表生成。 uptrace介绍 uptrace是一体化工具&#xff0c;优化性能并监视错误和日志的开源监控系统。Uptrace是一个经济高效的跟踪解决方案&#xff0c;可帮助您监控、了解和优化复杂的分布式系统。对您的…

运行springBoot项目

本文背景&#xff1a;接手后端Maven管理的springBoot项目&#xff0c;但是不太清楚具体怎么运行项目 写此文章作为纪念 参考链接&#xff1a;IDEA运行SpringBoot项目&#xff08;图文详细讲解&#xff09;_idea项目运行_叫我小楠的博客-CSDN博客 步骤如下&#xff1a; 1.设…

3D打印预处理软件——CHITUBOX Pro 1.4.1

CHITUBOX PRO登场 革命性的3D打印数据处理软件&#xff0c;让你发挥3D打印的无限潜力 支持多种主流CAD文件格式 除了传统的stl和obj文件&#xff0c;CHITUBOX Pro还支持导入各种主流的CAD文件格式&#xff0c;包括3ds、3mf、3dm、stp、step、wrl、x3d、sat、sab、dae、dxf、f…

uniapp合法域名配置

首先打开微信开发者平台 找到开发管理 打开开发设置 找到服务器域名>修改 request 写入域名前缀即可 > 完成 重启小程序即可 感谢观看

React redux更新数据的诡异特征==》彻底掌握redux更新state机制的精髓

此文章是跟随我上一篇文章《Redux Toolkit中action派发但state值不更新的原因》写的。 本来一切都搞定了&#xff0c;此时我突发奇想&#xff1a; 如果让api服务端不发送包含x-pagination的header信息&#xff0c;web端会不会报错。因为按照web端 redux原有的逻辑&#xff1a;…