[Docker学习笔记]利用Dockerfile创建镜像

Dockerfile 指令

指令作用
from继承基础镜像
maintainer镜像制作者信息(可缺省)
run用来执行shell命令
expose暴露端口号
cmd启动容器默认执行的命令
entrypoint启动容器真正执行的命令
volume创建挂载点
env配置环境变量
add复制文件到容器
copy复制文件到容器
workdir设置容器的工作目录
user使用容器的用户

from:指定基础镜像

必须为第一个命令

  • 格式

    from <image[:tag]> #tag可以缺省,拉取最新版
    from <image>@<digest> #摘要唯一地标识了镜像的特定版本,不会改变,即使镜像的内容发生变化
    # 同样digest摘要也可以省略
    
  • 示例

    FROM mysql:5.6
    

run:构建镜像时执行的命令

RUN是Dockerfile中的一个重要指令,用于在镜像中执行命令,以便在构建过程中安装软件包、配置环境、生成文件等。RUN指令执行的命令会在新的镜像层中运行,并且在后续构建中,只有在该层之前的内容发生变化时才会重新运行,利用了Docker的缓存机制,提高了构建速度。

run指令执行方式
shell 格式(默认格式)
RUN apt-get update && apt-get install -y python3
exec 格式

数组格式,可以避免在Shell中发生意外的解释问题

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", ""]

cmd:定义容器启动时默认要执行的命令

一个Dockerfile中只能包含一个CMD指令,如果有多个,则只有最后一个CMD指令会生效

cmd指令执行方式
shell 格式
CMD python app.py
exec格式
CMD ["python", "app.py"]
【补充】如果在docker run命令中指定了其他命令,则会覆盖CMD指令中的默认命令。

例如,如果在启动容器时执行以下命令,就会覆盖CMD中定义的默认启动命令

docker run my_image python script.py
# 容器启动时会执行script.py脚本

entrypoint:配置容器启动时的默认执行命令

  1. ENTRYPOINT指令的命令会在容器启动时始终执行,无论在docker run命令中是否指定了其他命令。它不会被覆盖,而是作为容器的主要执行命令。
  2. 如果在docker run命令中指定了其他命令,这些命令将作为ENTRYPOINT指令的参数进行传递。也就是说,ENTRYPOINT指令中的命令将成为执行时的前缀
entrypoint例子
FROM centos:7
 
ENTRYPOINT ["echo", "Hello"]
如果我们构建该镜像并运行容器,不提供其他参数,那么容器启动后将输出 “Hello”
$ docker build -t my_image .
$ docker run my_image
Hello
如果我们在运行容器时提供了其他参数,那么这些参数将作为ENTRYPOINT指令中命令的参数
$ docker run my_image ls
Hello ls
# 此时的ls已经不是命令了,而是作为一个参数传递给entrypoint
# 类似于ENTRYPOINT ["echo", "Hello","ls"]

在实际应用中,可以使用ENTRYPOINT指令来定义一个可执行的程序或脚本,然后在容器启动时运行这个程序,并将Docker容器作为可执行应用来使用。这样可以确保容器在运行时的行为是可预期的,而且可以将容器配置和执行逻辑完全封装在镜像内部,使得容器的使用更加方便和易于管理。

这段话说简单点:无论用户以什么样的方式执行docker run,最后都会执行entrypoint指定的动作(前提是有entrypoint)

expose:用于暴露网络端口

它并不会实际上打开或映射端口,而是作为一个文档功能,用于告知用户该镜像内的服务或应用程序将使用指定的端口

FROM centos:7
 
# 声明容器将监听80端口
EXPOSE 80

在使用docker run命令启动容器时,如果需要通过主机访问容器的80端口,还需要使用-p选项来进行端口映射

$ docker built -t my_image . #先docker build创建镜像
$ docker run -p 8080:80 my_image # 映射宿主机8080端口提供容器服务

env:设置环境变量

格式

ENV [key]=[value]
# key是环境变量的名称,value是环境变量的值
# 在镜像构建过程中,这些环境变量会被设置为指定的值
FROM centos:7
 
# 设置环境变量
ENV MY_NAME yy
ENV APP_HOME /app
 
# 创建目录并设置工作目录
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
 
# 复制应用程序到镜像中
COPY . .
 
# 在运行时输出环境变量
CMD echo "Hello, i am $MY_NAME"
 docker build -t dockerfile:test .

在这里插入图片描述

docker images

在这里插入图片描述

docker run --name env_test1 dockerfile:test

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【补】在运行容器时,你可以通过docker run -e选项来覆盖环境变量的值
docker run --name env_test2 -e MY_NAME="Alice" dockerfile:test

在这里插入图片描述

add:将文件、目录或远程URL复制到镜像中

格式

add [源文件][目的地址]

除了复制文件和目录,ADD指令还支持自动解压缩。如果源文件是一个压缩文件(例如.tar、.tar.gz、.tgz、.zip等),那么ADD指令会自动解压缩该文件到指定的目录

例子

复制本地文件到镜像中

ADD app.py /app/

复制本地目录到镜像中

ADD src/ /app/

从远程URL下载文件并复制到镜像中

ADD https://example.com/file.tar.gz /tmp/

解压缩压缩文件并复制到镜像中

ADD app.tar.gz /app/

copy:将本地文件或目录复制到镜像

不支持自动解压缩

复制本地文件到镜像中:

COPY app.py /app/

复制本地目录到镜像中

COPY src/ /app/

【补】copy 和 add 的区别

在构建镜像时,Docker将会在镜像的文件系统层中添加复制的文件或目录。这使得镜像的构建过程更加明确,不会产生自动解压缩的不确定行为。相对于ADD指令,COPY指令更为推荐,特别是在只需要简单复制本地文件或目录的情况下。COPY指令功能简单,不容易引起不必要的意外行为。对于大多数复制文件的场景,建议使用COPY指令

volume:用于声明挂载点

挂载点(数据卷)是一个特殊的目录,它可以绕过联合文件系统(UnionFS),并在容器间共享数据

在一个Dockerfile中可以使用多个VOLUME指令来声明多个挂载点

FROM centos:7
 
# 声明两个挂载点/app/data和/app/logs,这样在运行容器时,可以将这两个挂载点映射到主机的文件系统中,以实现数据持久化和共享
VOLUME ["/app/data", "/app/logs"]

运行容器时,可以使用-v选项或–mount选项来将主机的目录或数据卷映射到容器的挂载点

docker run -v /host/data:/app/data -v /host/logs:/app/logs my_image
# 将主机的/host/data和/host/logs目录分别映射到容器中的/app/data和/app/logs挂载点,实现了主机和容器之间的数据共享

workdir:用于设置工作目录

在容器启动时,进程的当前工作目录将被设置为WORKDIR指令所指定的目录

FROM centos:7
 
# 设置工作目录
WORKDIR /app
 
# 容器启动时运行的命令
CMD ["python", "app.py"]

# 当容器启动时,进程的当前工作目录将自动设置为/app,这样在执行CMD指令时,不需要使用绝对路径来运行python app.py

user:用于指定在容器中运行镜像时要使用的非特权用户

默认情况下,Docker容器在启动时以root用户身份运行,这意味着容器内的进程具有最高权限。然而,为了加强安全性,避免潜在的安全风险,最好以非特权用户的身份运行容器中的应用程序

FROM centos:7
 
# 创建一个新用户并切换到该用户
RUN useradd -ms /bin/bash myuser
USER myuser
 
# 设置工作目录
WORKDIR /app
 
# 复制应用程序到工作目录
COPY . .
 
# 设置环境变量
ENV APP_ENV production
 
# 容器启动时运行的命令
CMD ["python", "app.py"]

#使用useradd命令创建了一个名为myuser的新用户,并使用-ms /bin/bash选项指定了创建用户时使用的shell。
#通过USER指令切换到了myuser用户
#在容器运行时,进程将以myuser用户的身份运行,而不是以root用户身份

用dockerfile制作镜像

命令

docker build -t <容器名[:标签名]> <dockerfile所在目录>
docker build -t dockerfile:test_new .

在这里插入图片描述

docker images

在这里插入图片描述

接下来就可以用docker run 命令来启动容器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APISIX 联动雷池 WAF 实现 Web 安全防护

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关&#xff0c;提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 雷池是由长亭科技开发的 WAF 系统&#xff0c;提供对 HTTP 请求的安全请求&#xff0c;提供完整的 API 管理和…

VUE 整合 ECharts

一、vue 引入 ECharts依赖 npm install echarts --save 二、创建盒子 <div ref"chars" style"height: 500px;width:800px;"></div> 解释说明 ref"chars" 是 Vue.js 中一个非常有用的特性&#xff0c;用于给 DOM 元素或组件实例…

二值图像的面积求取的两种方法及MATLAB实现

一、引言 面积在数字图像处理中经常用到&#xff0c;在MATLAB中&#xff0c;计算二值图像的面积通常可以通过两种主要方法实现&#xff1a;遍历法和直接利用bwarea函数。下面将分别介绍这两种方法的原理和相应的MATLAB代码示例。 二、遍历法计算二值图像面积的原理和MATLAB代码…

一条sql在MySQL中是怎么执行的

目录 一、MySQL总体架构二、各层的作用1、连接层2、应用层3、存储引擎层 一、MySQL总体架构 作为常问八股文&#xff0c;相信不少小伙伴当年都被问到过这个问题&#xff0c;回答这个问题我们首先得知道MySQL服务器基本架构&#xff0c;主要分为连接层&#xff0c;应用层和存储…

YOLOv7改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

微软 Win11 RP 226x1.4247(KB5043145)预览版发布!

系统之家于9月25日发出最新报道&#xff0c;微软面向Release Preview频道的用户发布了Win11的KB5043145更新。系统更新后版本号提升为22621.4247和22631.4247。此次更新新增多项功能&#xff0c;例如用户播放媒体时&#xff0c;媒体控件会显示在锁屏中央的下部。以下跟随小编看…

easyExcel使用模版填充excel,合并单元格

一、最终效果 二、制作模版 1、制作填充模版 模版在代码中保存的位置 2、Controller /*** 下载模板*/ RequestMapping(value "exportData") public void exportData(KqKqb kqKqb,HttpServletResponse response, HttpServletRequest request) throws IOExceptio…

美团2024年秋招第一场笔试算法题题解【技术】

写一下2024年美团秋招第一场笔试算法题解&#xff0c;先贴个测评和题目链接美团2024秋招第一场笔试&#xff0c;还是比较简单的&#xff0c;前两题都是模拟&#xff0c;其中第二题涉及点思维&#xff0c;第三题笔者看到有牛友用持久化线段树和dp做的&#xff0c;但是我还不咋会…

目前最好用的爬虫软件是那个?

作为一名数据工程师&#xff0c;三天两头要采集数据&#xff0c;用过十几种爬虫软件&#xff0c;也用过Python爬虫库&#xff0c;还是建议新手使用现成的软件比较方便。 这里推荐3款不错的自动化爬虫工具&#xff0c;八爪鱼、亮数据、Web Scraper 1. 八爪鱼爬虫 八爪鱼爬虫是一…

R语言非参数回归预测摩托车事故、收入数据:局部回归、核回归、LOESS可视化...

全文链接&#xff1a;https://tecdat.cn/?p37784 非参数回归为经典&#xff08;参数&#xff09;回归方法提供了一种灵活的替代方法。与假定回归关系具有依赖于有限数量的未知参数的已知形式的传统&#xff08;参数&#xff09;方法不同&#xff0c;非参数回归模型尝试从数据样…

java后端项目技术记录

后端使用技术记录 一、软件1. apifox&#xff0c;API管理软件问题 2. nginx前端服务器(1) 反向代理(2) 负载均衡 二、问题1. 使用spring全局异常处理器处理特定的异常2. 扩展springmvc的消息转换器&#xff08;对象和json数据的转换&#xff09;3. 路径参数的接收4. 实体构建器…

YOLOv8改进,YOLOv8改进损失函数采用Powerful-IoU(2024年最新IOU),助力涨点

摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针对这个问题,提出了一种新的Powerfu…

ant design vue中带勾选表格报Tree missing follow keys: ‘undefined‘解决方法

1、这里一定要给columns和data-source设置key即可。 <div><a-table:row-selection"rowSelection":dataSource"tableList":columns"columns":scroll"{ x: 100% }":pagination"false":loading"loading"&g…

IDEA插件:Maven Helper插件强势优化【某个依赖包被哪些maven项目模块引用,快速定位】体验真好!

背景&#xff1a; 开发的项目是maven多模块&#xff0c;子模块数量多&#xff0c;已经超过10个。 而且经常会被扫描漏洞&#xff0c;并进行依赖包升级。 在使用过程中&#xff0c;发现MavenHelper插件和IDEA自带的Analyze Dependencies都有个缺点&#xff1a;只能是单个模块…

解决Ubuntu无法找到python3.7的包的问题 E: Couldn‘t find any package by glob ‘python3.7‘

该问题可能是由于默认的 Ubuntu 存储库中没有 Python 3.7 相关的包或系统配置的问题。可以尝试以下方法解决问题&#xff1a; 1. 使用 deadsnakes PPA 添加 Python 3.7 支持 deadsnakes PPA 是一个第三方存储库&#xff0c;提供多版本的 Python 支持&#xff0c;包括 Python …

第十四周学习周报

目录 摘要Abstract1. LSTM的代码实现2. 序列到序列模型3. 梯度与方向导数总结 摘要 在上周的学习基础之上&#xff0c;本周学习的内容有LSTM的代码实现&#xff0c;通过对代码的学习进一步加深了对LSTM的理解。为了切入到transformer的学习&#xff0c;本文通过对一些应用例子…

【Docker】如何让docker容器正常使用nvidia显卡

首先确保宿主机正常安装了显卡驱动 nvidia-smi打印显卡信息如下&#xff1a; 安装nvidia-container-toolkit工具 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker运行如下命令测试显卡是否在容器内可用 …

如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试?

本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则&#xff0c;进而引入如何去编写一个好的单元测试&#xff0c;通义灵码是如何快速生成单元测试的。 通义灵码插件下载安装&#xff1a;通义灵码_智能编码助手_AI编程-阿里云 目录 什么是单元测试&…

产品管理- 互联网产品(5):运营知识与技能

了解运营 1、运营的基础是产品认清受众&#xff0c;切实解决问题、用户需求 2、运营活动贯穿产品的整个生命周期 3、找准用户&#xff0c;建立MVP 4、明确产品的应用场景。用户在何场景下基于何种需求使用产品&#xff1f;务必短流程 5、AARRR模型 6、运营管理流程类似产品管理…

如何获取钉钉webhook

第一步打开钉钉并登录 第二步创建团队 并且 添加自定义 机器人 即可获取webhook