构建、标记和发布镜像
构建、标记和发布镜像
目录
- 构建镜像
- 标记镜像
- 发布镜像
- 实践
- 设置
- 构建镜像
- 推送镜像
在本指南中,您将学习以下内容:
- 构建镜像:基于Dockerfile构建镜像的过程。
- 标记镜像:为镜像命名的过程,这也决定了镜像的分发位置。
- 发布镜像:使用容器注册表分发或共享新创建的镜像的过程。
构建镜像
通常情况下,镜像是使用Dockerfile构建的。最基本的构建命令如下:
docker build .
命令中的.提供了构建上下文的路径或URL。在这个位置,构建器会找到Dockerfile和其他引用的文件。
当您运行构建时,构建器会拉取基础镜像(如果需要),然后运行Dockerfile中指定的指令。
使用上述命令,镜像将没有名称,但输出会提供镜像的ID。例如,前面的命令可能产生如下输出:
docker build .
[+] Building 3.5s (11/11) FINISHED=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 308B 0.0s=> [internal] load metadata for docker.io/library/python:3.12 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [1/6] FROM docker.io/library/python:3.12 0.0s=> [internal] load build context 0.0s=> => transferring context: 123B 0.0s=> [2/6] WORKDIR /usr/local/app 0.0s=> [3/6] RUN useradd app 0.1s=> [4/6] COPY ./requirements.txt ./requirements.txt 0.0s=> [5/6] RUN pip install --no-cache-dir --upgrade -r requirements.txt 3.2s=> [6/6] COPY ./app ./app 0.0s=> exporting to image 0.1s=> => exporting layers 0.1s=> => writing image sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00 0.0s
根据上述输出,您可以使用引用的镜像启动一个容器:
docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00
这种名称肯定不好记,这时候标记镜像就变得很有用。
标记镜像
标记镜像是给镜像一个易记名称的方法。不过,镜像的名称有一定的结构。一个完整的镜像名称有以下结构:
[HOST[:PORT_NUMBER]/]PATH[:TAG]
- HOST:镜像所在的可选注册表主机名。如果没有指定主机名,默认为Docker的公共注册表docker.io。
- PORT_NUMBER:如果提供了主机名,则为注册表端口号。
- PATH:镜像的路径,由斜杠分隔的组件组成。对于Docker Hub,格式为[NAMESPACE/]REPOSITORY,其中namespace是用户或组织的名称。如果未指定namespace,则使用library,这是Docker官方镜像的命名空间。
- TAG:自定义的、易于阅读的标识符,通常用于标识镜像的不同版本或变体。如果未指定标签,默认使用latest。
一些镜像名称的例子包括:
nginx,相当于docker.io/library/nginx:latest:从docker.io注册表、library命名空间、nginx镜像仓库中拉取latest标签的镜像。docker/welcome-to-docker,相当于docker.io/docker/welcome-to-docker:latest:从docker.io注册表、docker命名空间、welcome-to-docker镜像仓库中拉取latest标签的镜像。ghcr.io/dockersamples/example-voting-app-vote:pr-311:从GitHub Container Registry、dockersamples命名空间、example-voting-app-vote镜像仓库中拉取pr-311标签的镜像。
在构建期间标记镜像,可以添加-t或--tag标志:
docker build -t my-username/my-image .
如果您已经构建了镜像,可以使用docker image tag命令添加另一个标签:
docker image tag my-username/my-image another-username/another-image:v1
发布镜像
构建并标记好镜像后,您就可以将其推送到注册表。使用docker push命令:
docker push my-username/my-image
在几秒钟内,镜像的所有层都将被推送到注册表。
需要认证
在推送镜像到仓库之前,您需要进行认证。只需使用docker login命令即可。
实践
在本指南中,您将使用提供的Dockerfile构建一个简单的镜像,并将其推送到Docker Hub。
设置
获取示例应用程序。
如果您有Git,可以克隆示例应用程序的仓库。否则,您可以下载示例应用程序。选择以下选项之一:
使用Git克隆
在终端中使用以下命令克隆示例应用程序仓库:
git clone https://github.com/docker/getting-started-todo-app
下载并安装Docker Desktop。
如果您还没有Docker账户,请现在创建一个。完成后,使用该账户登录Docker Desktop。
构建镜像
现在,您已经在Docker Hub上有了一个仓库,是时候构建一个镜像并将其推送到仓库了。
在示例应用程序仓库的根目录中,使用终端运行以下命令。将YOUR_DOCKER_USERNAME替换为您的Docker Hub用户名:
docker build -t YOUR_DOCKER_USERNAME/concepts-build-image-demo .
例如,如果您的用户名是mobywhale,则运行以下命令:
docker build -t mobywhale/concepts-build-image-demo .
构建完成后,您可以使用以下命令查看镜像:
docker image ls
该命令将产生类似以下的输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
mobywhale/concepts-build-image-demo latest 746c7e06537f 24 seconds ago 354MB
您实际上可以使用docker image history命令查看镜像的历史记录(或如何创建镜像):
docker image history mobywhale/concepts-build-image-demo
您将看到类似以下的输出:
IMAGE CREATED CREATED BY SIZE COMMENT
f279389d5f01 8 seconds ago CMD ["node" "./src/index.js"] 0B buildkit.dockerfile.v0
<missing> 8 seconds ago EXPOSE map[3000/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 8 seconds ago WORKDIR /app 8.19kB buildkit.dockerfile.v0
<missing> 4 days ago /bin/sh -c #(nop) CMD ["node"] 0B
<missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 4 days ago /bin/sh -c #(nop) COPY file:4d192565a7220e13… 20.5kB
<missing> 4 days ago /bin/sh -c apk add --no-cache --virtual .bui… 7.92MB
<missing> 4 days ago /bin/sh -c #(nop) ENV YARN_VERSION=1.22.19 0B
<missing> 4 days ago /bin/sh -c addgroup -g 1000 node && addu… 126MB
<missing> 4 days ago /bin/sh -c #(nop) ENV NODE_VERSION=20.12.0 0B
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:d0764a717d1e9d0af… 8.42MB
此输出显示了镜像的各层,突出了您添加的层以及从基础镜像继承的层。
推送镜像
现在,您已经构建了镜像,是时候将镜像推送到注册表了。
使用docker push命令推送镜像:
docker push YOUR_DOCKER_USERNAME/concepts-build-image-demo
如果收到"requested access to the resource is denied"的错误,请确保您已经登录并且您的Docker用户名在镜像标签中是正确的。
稍等片刻,您的镜像应当被推送到Docker Hub。
相关文章:
构建、标记和发布镜像
构建、标记和发布镜像 目录 构建镜像标记镜像发布镜像实践 设置构建镜像推送镜像 在本指南中,您将学习以下内容: 构建镜像:基于Dockerfile构建镜像的过程。标记镜像:为镜像命名的过程,这也决定了镜像的分发位置。发…...
[Go Web] Kratos 使用的简单总结
文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施,不限定于某种注册中心,或数据库ORM等,所以您可以十分轻松地将任意库集成进项目里,与Kratos共同运作。 API -&…...
首个实时 AI 视频生成技术发布;科大讯飞发布星火大模型 4.0 丨 RTE 开发者日报
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…...
什么是容器镜像
什么是容器镜像? 1. 容器镜像的两个重要原则 容器镜像是容器化应用程序的基础,它包含了运行应用程序所需的一切——代码、运行时、库和依赖项。理解容器镜像的两个重要原则非常重要: 不可变性:容器镜像一旦构建,就不…...
ElasticSearch-Windows系统ElasticSearch(ES)的下载及安装
前言 下载ElasticSearch 可以进入ElasticSearch官方下载地址,选择与电脑系统相对应的版本;博主已经上传资源,或者点此直接免费下载,本次演示版本为8.14.1。 注意: Elasticsearch 5 需要 Java 8 以上版本;…...
【应用开发二】GPIO操控(输出、输入、中断)
1 操控GPIO方式 控制目录:/sys/class/gpio /sys/class/gpio目录下文件如下图所示: 1.1 gpiochipX目录 功能:当前SoC所包含的所有GPIO控制器 i.mx6ull一共包含5个GPIO控制器,分别为GPIO1~5分别对应gpiochip0、gpiochip32、gpi…...
单点登录方法
一、父域cookie:两个有相同父域名的二级域名之间可以跨域传递cookie //注意该接口的地址也是baidu.com下属的二级域名:a.baidu.com //全部接口地址为:a.baidu.com/dev-api/system/ecdWeb/login。如果不是a.baidu.com那么根本带不过去 //其实可以理解为通过该方法将cookie传给…...
springboot集成JPA并配置hikariCP连接池问题解决
一、引入需要的依赖 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/></parent> jpa依赖 <!--…...
vue2的双向绑定
vue是一个mvvm框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。 Vue.js 2 中的双向绑定是通过 v-model 指令实现的。v-model 指令可以在表单输入元素上创建…...
Vue3 国际化i18n
国际化i18n方案 1. 什么是i18n2. i18n安装、配置及使用2.1 安装2.2 配置2.3 挂载到实例2.4 组件中使用2.5 语言切换 1. 什么是i18n i18n 是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无…...
算法金 | 使用随机森林获取特征重要性
大侠幸会幸会,我是日更万日 算法金;0 基础跨行转算法,国内外多个算法比赛 Top;放弃 BAT Offer,成功上岸 AI 研究院 Leader; <随机森林及其应用领域> 随机森林是一种强大的机器学习算法,其…...
网络安全的重要性
网络安全的重要性 网络安全是指保护网络系统免受未授权的访问、攻击、破坏或未经授权的数据泄露的能力。随着互联网的普及和数字化进程的加速,网络安全问题日益凸显,成为个人、企业和国家必须面对的重要挑战。 网络安全的威胁 网络安全威胁包括黑客攻…...
Leetcode40 无重复组合之和
题目描述: 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 思路分析 这个题是…...
详解MATLAB中处理日期和时间的函数
在MATLAB中处理日期和时间时,可以使用多种函数来进行计时和时间差计算。以下是对一些常用函数的详细解释: 1. tic 和 toc 用途:用来测量一段代码执行的时间。用法:tic; % 启动秒表 % 你的代码 elapsedTime toc; % 停止秒表&…...
Java养老护理助浴陪诊小程序APP源码
💖护理助浴陪诊小程序💖 一、引言:养老新趋势🌱 在快节奏的现代生活中,养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务,让他们晚年生活更加安心、舒适,是我们每个人都需…...
go的singleFlight学习
Package singleflight provides a duplicate function call suppression mechanism “golang.org/x/sync/singleflight” 原来底层是 waitGroup,我还以为等待的协程主动让出 cpu 了,没想到 waitGroup.Wait() 阻塞了 doCall 不但返回值是 func 的 val 和…...
高电压技术-冲击高压发生器MATLAB仿真
微❤关注“电气仔推送”获得资料(专享优惠) 冲击电压发生器是产生冲击电压波的装置,用于检验电力设备耐受大气过电压和操作过电压的绝缘性能,冲击电压发生器能产生标准雷电冲击电压波形,雷电冲击电压截波,标准操作冲击…...
【STM32】SysTick系统滴答定时器
1.SysTick简介 CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时 ,将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除…...
编码遵循五大设计原则创建出更加健壮、可维护和可扩展的软件系统
一、单一职责原则(SRP) * 定义:一个类应该只有一个引起它变化的原因。 * 解释:意味着一个类应该专注于做一件事情,当需求发生变化时,只影响到一个类。这有助于降低类间的耦合,使得代码更易于理…...
记录一个问题
问题描述 如果一个物料既在A总成零件号下计算为托盘库,在B总成零件号下计算为箱库,则放于箱库。 A中选择排名第21的递补进托盘库。(也需要判断递补的是否在其他总成零件中为箱库,是的话继续递补判断) 解决思路 为了…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
