Docker 【通过Dockerfile构建镜像】【docker容器与镜像的关系】

文章目录

  • 前言
  • 一、前期的准备工作
  • 二、上手构建一个简单的镜像
  • 三、DcokerFile
    • 1 指令总览
    • 2 指令详情
  • 四、Dockerfile文件规范
  • 五、docker运行build时发生了什么?
  • 六、调试手段
    • 1. 修改镜像打包后,如何验证新内容已更新至镜像
  • 七、Dockerfile优化方案


前言

docker构建镜像有三种方式 Dockerfile文件名首字母约定要大写。大多数工具(包括Docker CLI和Docker Compose)都会默认查找名为"Dockerfile"的文件来构建镜像。

  • 使用命令行构建
    适合临时构建,一般就是在项目开发初期,环境没有搭建完善,这时候临时需要一个镜像包,可以直接通过命令打给他。
  • 使用Dockerfile文件
    官方推荐这种方式,配置好dockerfile文件之后,docker根据Dockerfile文件构建
  • 使用脚本调用docker 的 api构建
    一般在CI/CD的时候都会使用脚本,调用Docker api配合dockerfile文件实现一键部署,这种方式比较灵活可以配合脚本文件自由实现自己的定制操作,但前期准备工作比较大
  • 容器构建
    通过在容器中执行commit命令构建

一、前期的准备工作

  1. 一台contos操作机器
    cat /etc/os-release # 查看操作系统的版本信息# out system info
    NAME="OpenCloudOS" # 这个是腾讯的兼容contos8操作系统,可以看作contos8
    VERSION="8.8"
    ID="opencloudos"
    
  2. 安装好docker,这里我的docker版本为
    Docker version 25.0.4, build 1a576c5
    
    如果你还不了解如何安装docker,我的这篇文章可能会对你有帮助

二、上手构建一个简单的镜像

  1. 初始化一个docker项目

    mkdir /demo
    cd /demo
    npm init -y
    

    初始化项目结构

    demo
    |-src
    |  |-index.js
    |-Dockerfile
    |-package.json
    
  2. index.js 内容

    const { createServer } = require("http");
    const server = createServer();
    server.listen(8080, () => {console.log("启动成功!");
    });
    
  3. Dockerfile文件内容

    FROM node
    WORKDIR /src
    COPY . .
    RUN npm install --production
    CMD ["node", "src/index.js"]
    
  4. 执行命令打包

    # 进入目录 dockerfile同级目录
    cd /demo# 执行构建镜像
    docker build -t "cs:1.0.0" . # -t:为镜像打上标签 cs:为镜像名 .:为当前目录
    
  5. 查看打包结果

    docker images
    

    在这里插入图片描述


三、DcokerFile

Dockerfile是本质来讲是一个文本文件,内部包含了一条条指令,能够使docker根据上面的指令定制构建镜像(Image)

1 指令总览

命令列子
FROM指定镜像的依赖
可以有多条。但多个相连的FROM指令只会执行最后一个。详情在#指令详情中说明
RUN指定运行命令 RUN ls ./相当于在镜像构建目录下的shell窗口中执行ls ./ 命令
COPY将本地文件copy到镜像
支持正则表达式拷贝(COPY /local? .)所有匹配local?的文件目录都会拷贝
ADD同COPY一样,但是更强大(支持更多的文件类型的拷贝
如网络文件的下载后拷贝,ADD http://xxxx/test.tar.gz /test/
拷贝归档文件(.tar .gz等)文件会在复制到镜像的过程中自动解压
USER指定Dockerfile后续命令使用哪个用户身份执行,默认root。
WORKDIR目录切换指令,类似shell的cd
ENV指定运行容器时的环境变量
CMD用来指定由镜像创建的容器启动后执行的命令,比如你想让容器启动服务,就可以通过它设置
只能有一条出现多条则最后一条生效
ENTRYPOINT作用CMD类似,但与CMD同时使用时可能会将CMD的值最为参数

2 指令详情

  • FROM
    当遇到FROM指令时,docker会在本地库寻找对应的镜像库
    如果没有发现,则通过docker pull拉取,如果存在则使用本地下载的镜像库
    版本号不一致的镜像是不同的node:16.16.20node:18.18.1 是两个不同镜像

    FROM  node; # 当前镜像依赖node镜像
    

    FROM可以多条使用,但不能连续使用。多条使用一般用于Docker多阶段构建

    # 第一阶段
    FROM node:14 AS build # 使用node:14镜像 设置构建阶段别名提供给COPY --from 访问
    WORKDIR /app
    COPY . .
    RUN npm install
    RUN npm run build # 操作完成产生打包结果文件# 第二阶段
    FROM node:14-alpine # 使用node:14-alpine镜像此时将会替换掉之前node:14镜像
    WORKDIR /app
    COPY --from=build /app . # 复制 build构建阶段下的/app目录到镜像目录
    CMD ["node", "index.js"]
    

    连续使用,只有最后一条生效

    FROM node:16.16.1
    FROM node:18.18.1 # 此条生效
    

  • RUN
    设置镜像执行命令

    RUN npm i # 相当于在镜像目录的shell窗口中执行npm i
    

  • COPY
    将本地文件活目录拷贝至镜像目录

    • 只能将本地文件拷贝到镜像,不能将镜像文件拷贝到本地
    • 拷贝的源路径只能处在当前构建镜像的上下文的目录下,通过docker build命令的url参数指定构建上下文
    • 语法:COPY [--chown=<user>:<group>] <源路径>... <目标路径>
     COPY /local /app # 将本地/local 下的所有文件、目录拷贝到镜像/app目录下COPY /local1 /local2 /app # 可以由多个源路径,它会将本地/local1 和 /local2下的所有文件、目录拷贝到镜像/app下COPY /local* /app # 支持通配符,将本地/local1 /local2 /local3 /local...等符合匹配规则的路径复制到镜像/app下COPY --chown=user1:group1 /local /app # 本地文件复制到镜像后,将它归属设置为user1用户和group1组
    

  • ADD
    也是用于将本地文件拷贝到镜像中,但是它与COP有些不同

    • 可以COPY远程文件,类似于 自动下载远程文件-》移动至镜像
    • 在拷贝归档文件(.tar等压缩文件)时会在拷贝至镜像的过程中自动解压
    ADD http://www.test.com/test.tar . # 会自动自动解压到镜像文件
    

    请注意!即便ADD命令能够自动解压tar等压缩文件,官方的Dockerfile使用规范仍推荐使用COPY复制压缩文件,配合解压命令解压。这样在语法上更加明确

    // Dockerfile
    COPY test.tar .
    RUN tar -vxf ./test.tar # 执行tar -vxf解压
    

  • USER

    USER [用户名]:[用户组]
    

  • WORKDIR
    修改镜像当前上下文目录,类似linux cd命令。

    WORKDIR ./src # 之后的指令上下文都是./src
    RUN ls ./ 
    

  • CMDENTRYPOINT
    CMD和ENTRYPOINT指令都是用来指定镜像创建的容器启动时执行的指令,相当于在容器启动时开启了一个shell窗口,然后运行CMD和ENTRYPOINT的指令参数。

    它们有相同的语法:

    # CMD <shell 命令> 
    CMD echo 11;// 容器启动执行 echo 11
    ENTRYPOINT echo 11; // 同上# CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["node","-inspect","index.js"] # 相当于shell窗口执行 node -inspect index.js
    ENTRYPONT ["node","-inspect","index.js"] // 同上
    

    如果CMDENTRYPONT同时使用

    1. ENTRYPONT是数组
      CMD ["--inspect","index.js"]
      # or
      CMD echo 11ENTRYPONT ["node"]
      
      CMD会作为ENTRYPONT的参数,相当于容器启动时执行
      node --inspect index.js
      # or
      node echo 11
      
    2. ENTRYPONT不是数组,ENTRYPONT无法接受参数最终只执行ENTRYPONT
      CMD echo 或者 CMD ["hello"]
      ENTRYPONT echo 
      
      最终容器执行
      echo
      

  • ENV
    定义环境变量,定义之后就可以在后面的任何命令中使用。
    并且连续多次定义ENV的话,它将会叠加而不是覆盖,下面的例子可以访问3个环境变量

    ENV $var1 value1; # 定义单个
    ENV $var2=value2 $var3=$value3 # 定义多个RUN echo $var1
    COPY $var1 /app
    ADD ./src/$var1 /app
    CMD echo $var1
    WORKDIR $var1
    

    它会在容器内部存在,你可以在代码中访问环境变量

    console.log(process.env.$var1);
    

四、Dockerfile文件规范

  • Dockerfile文件名首字母最好约定大写,因为大多数工具(包括Docker CLI和Docker Compose)都会默认查找名为"Dockerfile"的文件来构建镜像。如果你想指定文件名
    docker build -f myDockerfile -t my-image .
    
  • Dockerfile指令不区分大小写,但是为方便和参数做区分,通常指令使用大写字母。
    from node # 这样也可以FROM node # 这样更清晰
    
  • Dockerfile中指令按顺序从上至下依次执行。
  • Dockerfile中第一个非注释行必须是FROM指令,用来指定制作当前镜像依据的是哪个基础镜像。
  • Dockerfile中需要调用的文件必须跟Dockerfile文件在同一目录下,或者在其子目录下,父目录或者其它路径无效

五、docker运行build时发生了什么?

当你运行docker build命令构建Docker镜像时,Docker会执行以下步骤:

  • 读取Dockerfile:Docker首先读取Dockerfile,解析其中的指令。

  • 加载构建上下文:Docker将Dockerfile所在的目录(或者你在docker build命令中指定的其他目录)作为构建上下文,将其所有文件和目录发送到Docker守护进程。

  • 执行Dockerfile中的指令:Docker按照Dockerfile中的顺序,一条一条地执行指令。每执行一条指令,Docker都会创建一个新的容器,运行指令,然后提交这个容器为一个新的镜像层。这个过程会重复,直到所有指令都被执行。

  • 对于FROM指令,Docker会加载指定的基础镜像。如果基础镜像不存在,Docker会尝试从Docker Hub或其他配置的镜像仓库下载它。

  • 对于RUN指令,Docker会在当前的镜像上启动一个新的容器,然后在这个容器中运行指令。完成后,Docker会提交这个容器为一个新的镜像层。

  • 对于COPY和ADD指令,Docker会从构建上下文中复制文件或目录到镜像中。完成后,Docker会创建一个新的镜像层。

  • 对于CMD和ENTRYPOINT指令,Docker会设置镜像的默认命令和/或入口点。这些指令不会创建新的镜像层。
    保存最终的镜像:当所有指令都被执行后,Docker会保存最终的镜像。如果你在docker build命令中指定了镜像的标签,Docker会将这个标签应用到最终的镜像。

以上就是docker build命令构建Docker镜像的基本过程。这个过程可能会根据你的Dockerfile和构建上下文的具体内容有所不同。


六、调试手段

1. 修改镜像打包后,如何验证新内容已更新至镜像

通过镜像创建容器

$ docker create --name containerName imageName

进入容器

docker exec -it containerName /bin/bash # 请注意是容器名不是容器id

在容器内部查看对应的目录结构是否存在

ls ./ # 检查更新的相应的目录结构是否存在

七、Dockerfile优化方案

  • Dockerfile中的指令没执行一条就会多构建一个镜像,所以尽量合并执行的执行(run、copy比较多)
    RUN npm i;
    RUN npm run dev;
    # MERGE
    RUN npm i && npm run dev
    

  • 多阶段构建,最后生成的镜像包会比较小
    # 阶段1:构建阶段
    FROM node:14 AS build
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    RUN npm run build# 阶段2:运行阶段
    FROM node:14-alpine
    WORKDIR /app
    COPY --from=build /app/dist ./dist
    COPY package*.json ./
    RUN npm install --only=production
    CMD ["node", "dist/index.js"]
    
    最后的镜像包中只包含node:14-alpone镜像

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

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

相关文章

JavaEE-文件操作和IO

我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c;往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概念&#xff0c;就类似办公桌上的⼀份份真…

stm32平衡车

目录 一.所需材料 二.PID算法&#xff08;简单说明&#xff09; 直立环 速度环 串级PID 三.使用到的外设 1.定时器输出比较-PWM 2.定时器编码器模式 3.编码器读取速度 4.电机驱动函数 5.外部中断 四、小车 调试 一.所需材料 1.陀螺仪MPU6050--读取三轴的加速度…

隐语笔记2 —— 隐私计算开源如何助力数据要素流通

数据生命周期 数据流转链路主要包括&#xff1a;采集、存储、加工、使用、提供、传输 数据要素外循环是构建数据要素市场的核心 数据外循环中的信任焦虑 三个代表性问题&#xff1a; 不可信内部人员不按约定使用用户隐私泄漏 数据权属问题 解决方案&#xff1a;从主体信任…

JDK下载配置

一、JDK的作用 Java开发环境&#xff1a;JDK提供了完整的Java开发环境&#xff0c;包含编译器&#xff08;javac&#xff09;、解释器&#xff08;java&#xff09;、打包工具&#xff08;jar&#xff09;、文档生成工具&#xff08;javadoc&#xff09;等一系列工具&#xff0…

SpringBoot健康监控

文章目录 1-SpringBoot2-监控-健康监控服务2-SpringBoot2-监控-Admin可视化 在Spring Boot中&#xff0c;可以通过Actuator模块实现应用程序的健康监控。Actuator是Spring Boot提供的一个用于监控和管理应用程序的模块&#xff0c;可以轻松地查看应用程序的运行状况、性能指标和…

有什么可以下载网页视频的浏览器插件 浏览器如何下载网页视频 网页视频怎么下载到本地 网页视频下载软件 IDM下载

在视频网站上看电影追剧&#xff0c;已经成为了大众生活中必不可少的一部分。为了保护自家视频的版权&#xff0c;很多平台都禁止用户下载会员视频。其实只要掌握了正确的方法&#xff0c;一样可以将会员视频下载到本地保存。那么有关有什么可以下载网页视频的浏览器&#xff0…

Websocket + Vue使用

这里有一篇文档可以参考一下> 闪现 POM文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.0</version> </dependency> WebSocketConf…

数据库之MongoDB应用与开发

MongoDB应用与开发 1. MongoDB安装 l 官网下载安装介质&#xff1a; Try MongoDB Atlas Products | MongoDB 选择对应版本 修改环境变量 vi /etc/profile export MONGODB_HOME/home/lijin/mongodb export PATH P A T H : PATH: PATH:MONGODB_HOME/bin source /etc/profile …

TnT-LLM: Text Mining at Scale with Large Language Models

TnT-LLM: Text Mining at Scale with Large Language Models 相关链接&#xff1a;arxiv 关键字&#xff1a;Large Language Models (LLMs)、Text Mining、Label Taxonomy、Text Classification、Prompt-based Interface 摘要 文本挖掘是将非结构化文本转换为结构化和有意义的…

矩阵计算-线性系统和 LU 分解

一、三角系统 …… 二、高斯消元法 …… 三、LU分解--直接三角分解法 求解线性方程Axb&#xff1a; 参考视频&#xff1a;【数值分析】矩阵LU三角分解| 速成讲解 考试宝典_哔哩哔哩_bilibili 令ALU&#xff0c;其中L是单位下三角矩阵&#xff08;对角线上元素都是1&#xff…

精神暴力的来源与解药

导致人生病的&#xff0c;不仅是病毒或细菌&#xff0c;也有精神暴力。与病毒破坏物理肌体、摧毁生命不同&#xff0c;精神暴力是让人们在过度的自我狂热中燃尽自我、而毁灭自身的。 21世纪以来&#xff0c;精神方面的疾病越来越多&#xff0c;为什么这样呢&#xff1f;大的背景…

git基础-查看提交历史

查看提交历史 在创建了多个提交之后&#xff0c;或者如果克隆了一个具有现有提交历史的存储库&#xff0c;可能会想要回顾一下发生了什么。最基本和强大的工具就是 git log 命令。 运行下git log查看下输出状态 默认情况下&#xff0c;不带任何参数运行 git log 命令会以逆时…

【工具】cassetteai — 制作音乐就像现在写提示一样简单

Cassette 是一种人工智能驱动的音乐创作工具,使各种技能水平的用户都可以根据自己的特定需求和偏好生成高质量、免版税的音乐曲目。它基于基于潜在扩散 (LDM) 的机器学习模型,可以使用用户提供的文本描述来想象节拍。它具有易于使用的界面,用户可以输入各种参数,例如所需的…

AGV|机器人导航识别二维码视觉传感器TDCS-0100与上位机PLC联机实例说明

目前二维码视觉导航的AGV出货量非常大&#xff0c;几乎都是仓储型AGV使用的导航方式。在地面或者天花板等位置标贴二维码作为标记点&#xff0c;通过扫描读取二维码信息和二维码相对相机的角度来确定当前位置。 本文重点介绍AGV|机器人导航识别二维码视觉传感器TDCS-0100与上位…

unity学习(68)——相机/模型的旋转/位置计算

这个比想象中要难&#xff0c;而且需要自己写。 1.相机可以转xy两个位置&#xff0c;可以点头和转圈。注意这里有一个if判断&#xff08;后面返回来发现了这些问题&#xff09; 2.角色不能点头&#xff0c;只能转圈。 难得是移动方向&#xff0c;因为移动方向(位置)和转向是相…

在Sequence中缓存Niagara粒子轨道

当Sequence中粒子特效较多时&#xff0c;播放检查起来较为麻烦&#xff0c;而使用Niagara缓存功能可将粒子特效方便的缓存起来&#xff0c;并且还可以更改播放速度与正反播放方向&#xff0c;便于修改。 1.使用Niagara缓存需要先在插件里打开NiagaraSimCaching 2.创建一个常…

web前端之行为验证码、不同设备和屏幕尺寸呈现不同大小、元素宽度根据视口宽度进行调整、元素或图片裁剪、图片验证码

MENU 前言版本一(htmlJScss)版本二(htmlJScsscanvas) 前言 1、版本一的样式比较齐全&#xff1b; 2、版本二的JS逻辑和功能效果比较完善&#xff0c;且是别人的代码&#xff0c;后续会对样式进行完善。[Gitee | 哔哩哔哩]&#xff1b; 3、两个版本各有千秋&#xff0c;主要学习…

CRC计算流程详解和FPGA实现

一、概念 CRC校验&#xff0c;中文翻译过来是&#xff1a;循环冗余校验&#xff0c;英文全称是&#xff1a;Cyclic Redundancy Check。是一种通过对数据产生固定位数的校验码&#xff0c;以检验数据是否存在错误的技术。 其主要特点是检错能力强、开销小&#xff0c;易于电路实…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 概述 深度神经网络&#xff08;Deep Neural Network…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…