docker容器镜像的制作、使用以及传递
目录
- 制作容器镜像
- 使用Dockerfile制作镜像
- 准备所需文件
- 构建镜像
- 怎么不使用基础镜像来构建容器镜像
- 使用容器镜像
- 传递容器镜像
这篇文章讨论一下怎么使用docker制作容器镜像,容器镜像的使用,以及怎么传递容器镜像。
制作容器镜像
docker制作容器镜像推荐的方法就是使用Dockerfile,因为Dockerfile不仅可以方便的重复使用,而且还直观的记录了制作镜像的规则和过程,也方便查问题。
使用Dockerfile制作镜像
准备所需文件
看个简单的示例,比如有这么一个目录结构:
.
├── bin
│ └── main
├── Dockerfile
└── src
│ └── main.cpp
首先main就是用main.cpp生成的可执行程序。
然后看下Dockerfile文件内容:
FROM debianCOPY bin /demo/bin
WORKDIR /demo/bin
RUN chmod 777 ./main
RUN mkdir /demo/dataCMD ./main
解释一下Dockerfile文件中指令的含义:
- FROM debian:指定基础镜像,之后的指令都是基于这个基础镜像。
- COPY bin /demo/bin:将上下文目录中的bin目录复制到镜像的/demo/bin目录中。
- WORKDIR /demo/bin:指定工作目录,之后的指令的当前目录就是这个目录,容器启动时默认当前目录也是这个目录。
- RUN chmod 777 ./main:在构建镜像时(即docker build时)执行命令。
- RUN mkdir /demo/data:在构建镜像时(即docker build时)执行命令。
- CMD ./main:启动容器时(即docker run时)的默认命令,可以在docker run时使用参数覆盖。
其中
RUN chmod 777 ./main
RUN mkdir /demo/data
可以改成一条指令
RUN chmod 777 ./main&& mkdir /demo/data
要不然镜像就会多一层。
构建镜像
文件准备好了,我们在这个目录中执行命令docker build -t demo:v1.0 -f ./Dockerfile .
就可以构建出包含前面编译出来的main程序的容器镜像,这个命令中的-t参数表示指定生成的镜像的名字和标签,-f参数表示指定要使用的Dockerfile,后面那个.表示上下文目录为当前目录,就是要打包的目录,Dockerfile中的一些指令比如COPY就会以这个目录为基础,注意上下文目录中尽量不要放镜像内不需要的文件,会影响效率。
构建完成之后使用docker images就可以查看到构建出来的镜像了。
怎么不使用基础镜像来构建容器镜像
前面介绍的Dockerfile中有一条FROM debian指令,是指明基础镜像,意思就是使用一个已经制作好的镜像作为基础镜像。那如果不想使用基础镜像,而是完全自定义,是不是不写这条指令就行了,不是的,因为FROM是Dockerfile的必备指令。
这里想说明一下,很多人说FROM必须是Dockerfile的第一条指令,其实不是,FROM是Dockerfile的必备指令,但FROM并不必须是第一条指令,比如第一条可以是ARG:
ARG base
FROM $base
既然必须指定基础镜像,那怎么不使用基础镜像来构建容器镜像呢,有办法的。虽然FROM指令是必须的,但是Docker中存在一个特殊的基础镜像叫scratch,这个镜像是空的,所以就可以FROM scratch,这个效果也就相当于不使用基础镜像来构建容器镜像了。
但是这样会比较难,首先容器镜像其实可以简单的理解为是一个rootfs文件系统,所以如果使用这种方法构建镜像,由于基础镜像是个空的,就需要我们自己制作一个rootfs文件系统,然后在Dockerfile中使用指令将自己制作的rootfs文件系统放进容器镜像,这种方式可以制作特别轻量级的容器镜像,但是会比较复杂,这篇文章里就不具体展开了。
使用容器镜像
容器镜像制作完成就可以使用了,那怎么使用呢,这个因为场景很多而且复杂,这篇文章不介绍那么多,这里就简单介绍一个比较常用的场景,那就是使用docker run
来使用容器镜像启动一个容器,比如使用命令docker run -it --rm --name demo demo:v1.0 /bin/bash
以交互的模式启动容器,然后在这个容器中执行所需操作。
传递容器镜像
容器的一大特点(也是特别受欢迎的一点)就是可以保证环境的一致性,这里就要涉及到容器镜像的传递了。
传递镜像主要使用两组命令完成。
方案一:
第一组命令是docker save和docker load,这组命令针对容器镜像,主要用在传递原始镜像的场景。
方案是使用docker save将镜像保存为归档文件,然后将归档文件传递到需要的机器上面,然后使用docker load从归档文件中导入镜像。
命令示例:
docker save -o demo.tar demo:v1.0:将镜像保存为归档文件,-o参数指定保存为的文件,这里就表示保存为当前目录下的demo.tar文件。
docker save -o demo.tar demo1:v1.0 demo2:v1.0 demo2:v2.0:将多个镜像保存为一个归档文件。
docker load -i ./demo.tar:从归档文件中导入镜像,归档文件就是使用docker save生成的文件,-i参数指定输入文件,即从哪个归档文件导入镜像。
方案二:
第二组命令是docker export和docker import,这组命令针对容器,主要用在需要传递容器执行过程中的一些状态的场景。
方案是使用docker export将容器保存为归档文件,然后将归档文件传递到需要的机器上面,然后使用docker import从归档文件中导入镜像。
命令示例:
docker export -o demo.tar CONTAINER:将容器保存为归档文件,CONTAINER可以使用容器id指定,-o参数指定保存为的文件,这里就表示保存为当前目录下的demo.tar文件。
docker import demo.tar demo:v1:使用归档文件创建镜像,归档文件是使用docker export生成的。
区别:
使用docker save和docker load保存的数据会比较完整,会包括镜像历史,使用docker export和docker import不会保存镜像历史,因为是从容器导出为的容器镜像。
相关文章:
docker容器镜像的制作、使用以及传递
目录 制作容器镜像使用Dockerfile制作镜像准备所需文件构建镜像怎么不使用基础镜像来构建容器镜像 使用容器镜像传递容器镜像 这篇文章讨论一下怎么使用docker制作容器镜像,容器镜像的使用,以及怎么传递容器镜像。 制作容器镜像 docker制作容器镜像推荐…...

一种由于吸入硅酸盐粉尘而引起的肺部疾病:pneumonoultramicroscopicsilicovolcanoconiosis
有人说,pneumonoultramicroscopicsilicovolcanoconiosis是英语中最长的单词,这是一个医学词汇,意思是指:一种由于吸入硅酸盐粉尘而引起的肺部疾病。 pneumonoultramicroscopicsilicovolcanoconiosis [ˈnju:mənəuˌʌltrəˌmai…...

百度AI人脸检测与对比
1.注册账号 打开网站 https://ai.baidu.com/ ,注册百度账号并登录 2.创建应用 3.技术文档 https://ai.baidu.com/ai-doc/FACE/yk37c1u4t 4.Spring Boot简单集成测试 pom.xml 配置: <!--百度AI--> <dependency> <groupId>com.baidu.…...

贴代码框架PasteForm特性介绍之outer,outers,object,objects,outerdisplay
简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…...

sql数据库-权限控制-DCL
目录 常用权限类别 查询用户权限 举例 授予用户权限 删除权限 常用权限类别 权限说明ALL,ALL PRIVILEGES所有权限SELECT查询数据INSERT插入数据UPDATE修改数据DELETE删除数据ALTER修改表DROP删除数据库/表/视图CREATE创建数据库/表 查询用户权限 show grants for 用户名…...

【计组笔记】目录
【计组笔记】机器数表示及运算https://blog.csdn.net/Resurgence03/article/details/142673325?sharetypeblog&shareId142673325&sharereferAPP&sharesourceresurgence03&sharefromlink 【计组笔记】指令系统https://blog.csdn.net/Resurgence03/article/det…...

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器
在深度学习的计算机视觉任务中,提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作,能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理,…...

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台
AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大,也被企业广泛采用,然后也存着在诸如学习曲线陡峭,上手难度大&#x…...
golang操作mysql基础驱动github.com/go-sql-driver/mysql使用
golang中类似java操作mysql的jdbc一样,github.com/go-sql-driver/mysql也为go提供了基础接口,在开发中往往需要写更多的代码来满足自己的定制需求,java在驱动基础上有了扩展,orm框架诞生,mybatis、jpa等都是好用的扩展…...

正则表达式完全指南,总结全面通俗易懂
目录 元字符 连接符 限定符 定位符 修饰符(标记) 运算符优先级 普通字符集及其替换 零宽断言 正向先行断言 负向先行断言 正向后发断言 负向后发断言 捕获组 普通捕获组 命名捕获组 PS:非捕获组 正则表达式在线测试: 正则在线测试工具 …...
运维面试题.云计算面试题之三ELK
1.ELK是什么? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 Elasticsearch:负责日志检索和储存 Logstash:负责日志的收集和分析、处理 Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,…...
C# DataTable使用Linq查询详解
前奏- C# 对DataTable进行查询 C# 可以对 DataTable 进行查询。在 .NET 框架中,DataTable 类提供了几种方法来查询数据,包括 Select 方法和 AsEnumerable 扩展方法(在 System.Data.DataSetExtensions 命名空间中)。 使用 Select…...
【企业级分布式系统】ELK优化
文章目录 Elasticsearch作为日志存储时的优化优化ES索引设置优化线程池配置锁定内存,不让JVM使用Swap减少分片数、副本数 Elasticsearch作为日志存储时的优化 linux内核优化、JVM优化、ES配置优化、架构优化(filebeat/fluentd代替logstash、加入kafka做…...
51单片机基础05 定时器
目录 一、为什么要定时器 二、定时器中断 1、定时器中断参数 2、定时器中断程序 3、定时器计数 一、为什么要定时器 前文提到,比如进行流水灯等操作,都是直接写了delay_ms这类操作。 但是在51单片机中,其一般就是靠双for进行的循环时延&…...
tdengine学习笔记实战-jdbc连接tdengine数据库
先上代码,里面有两种获取连接的方式,一个单例,一个连接池 package com.tdengine.utils;import com.alibaba.druid.pool.DruidDataSource;import java.sql.*; import java.util.Properties;public class TDConnectUtils {// 单例对象private …...
vue3项目执行npm install下载依赖报错问题排查方法
1、检查当前node与npm的版本 nodejs 和 npm 的版本是有适配的,具体可以看官网:nodejs 和 npm 的版本是有适配的 若是版本不兼容,修改node或者npm的版本即可,建议使用nvm版本管理工具,切换方便; 2、清除缓…...
【vue】项目迭代部署后 自动清除浏览器缓存
前言: vue项目打包部署上线后,因浏览器缓存问题,导致用户访问的依旧是上个迭代批次的旧资源,需要用户手动清除缓存才能更新至最新版本,影响用户体验。 解决方法: html根文件添加以下标签 <meta http-eq…...
Leetcode(滑动窗口习题思路总结,持续更新。。。)
讲解题目:长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target ,找出该数组中满足其和 ≥ target 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例: 输入: target 7, nums [2,3,1,2,4,3] 输出: 2 解…...
【UNIAPP】uniapp版图片压缩工具
二次封装的uniapp版本图片压缩、上传工具,支持全端(H5、小程序、APP) 新建文件:file-util.js class FileUtil {/*** [文件上传]* param {[object]} fileObj [图片地址]* param {[object]} formData [参数]* param {[str…...

PaddlePaddle 开源产业级文档印章识别PaddleX-Pipeline “seal_recognition”模型 开箱即用篇(一)
AI时代到来,各行各业都在追求细分领域垂直类深度学习模型,今天给大家介绍一个PaddlePaddle旗下,基于PaddleX Pipeline 来完成印章识别的模型“seal_recognition”。 官方地址:https://github.com/PaddlePaddle/PaddleX/blob/relea…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...