构建、标记和发布镜像
构建、标记和发布镜像
目录
- 构建镜像
- 标记镜像
- 发布镜像
- 实践
- 设置
- 构建镜像
- 推送镜像
在本指南中,您将学习以下内容:
- 构建镜像:基于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的递补进托盘库。(也需要判断递补的是否在其他总成零件中为箱库,是的话继续递补判断) 解决思路 为了…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...