Azure 容器服务初探 —— 私有容器注册表、云容器与自动部署
进了大学很快就拿到了教育邮箱,所以 azure 和 github 的学生认证前几个月就过了,但是只开了台虚拟 linux 机器玩,大量免费资源都闲着。
本着物尽其用的原则,正好有最近在用 C# 写的纸飞机机器人不打算开源,决定部署到私有的 Azure 容器注册表,试错了一下午,决定把踩的坑和完整详细的过程写成博客记下来。
所以本篇就以 .net 命令行程序作为例子,让我们开始吧!
起点 —— Visual Studio 的编译打包
提到 .NET 大家第一时间想到的必然是我们的宇宙第一编辑器 Visual Studio 啦。最近正好出了 2026,我们顺便来尝尝鲜。(以下内容均适用 2022,只要是 .net 都行,2026 只是视觉不同)
右键你的项目,选择“发布”,然后 VS 就会提示你选一个发布位置:

排在第一位的就是 Azure……
不愧是微软家的
我们接下来直接选择注册表,下一步:

既然是新的项目,我们直接创建新的注册表,并且创建一个对应资源组:

什么是资源组?
资源组是一组资源的集合,你可以把它当成一个项目。你可以在一个项目中创建非常多的资源,分项目管理是非常高效的!
然后 Visual Studio 帮你完成了一切……
不要启用 Native AOT
.net 新版有个神奇的编译选项,可以编译为原生代码。然而,这会导致无法跨平台编译,所以请双击你的项目,然后把配置文件改成这样(否则会报错):
1 | |
用起来 —— 部署到自己的机器
由于是私有的容器注册表,所以你必须得有个凭据才能访问。很幸运的是,我很快就在仪表盘上面找到了创建凭据的地方:

创建好令牌就创建下密码,你会得到一个 Docker 命令,把它贴到要拉取的机器上面,回车执行登陆,就能访问了。
神奇的登录命令
没错,是 docker login。它支持自定义的注册表登录。
现在我们来试试拉取镜像,写个小小的 compose 示例:
1 | |
如何获取镜像名称
首先,在 Visual Studio 里面,你在发布界面可以看到 https://***.azurecr.io 的存储库。把前面的协议头去掉就能得到斜杠前面的存储库名称了。如果你设定了映像标志,也会在这里显示。
其次,你可以尝试把你的项目名称全部转换为小写来取得斜杠后面的镜像名称。
如果还是不清楚的话,可以在网页控制台里面找到:
尝试一下,docker compose up -d,你会发现已经成功下载并运行了。
白嫖云服务 —— 容器服务
azure 不仅提供注册表(镜像托管),还提供直接云端跑容器的功能。
关于开放端口
由于本服务不对外开放端口,故本篇初探不涉及容器公网网络访问
服务眼花缭乱,我们直接搜索容器应用,点创建之后就有傻瓜式 Web 面板:

一路走下来,不出意外的话,就能直接起飞,部署成功了。
出事了咋办?
日志在这里哦:
自动更新?
在完成之后,还有个大问题——当代码更新,构建新的镜像推送之后,怎么更新容器呢?难不成还得手动再删了重装?
实际上,Azure 有个 shell,允许你直接通过命令行更新你的镜像,但是这玩意似乎不大好用,一堆命令有点记不住,每次都要执行才可以部署也太烦。
绝对不是我懒得去学 az 命令
为了省事,我们直接把代码推送到 Github,然后用 Github Action CD 来部署。
好消息是,你不用手动写 workflow,也不用手动配置 Azure 账号,Azure 会帮你搞定这些。
坏消息是,Azure 只支持 Dockerfile,不支持 Visual Studio 那一套发布构建的模式。
看来有时候把太多事情都交给 IDE 也并非好事,我们接下来就来摸摸清楚背后到底发生了些什么。
编写 Dockerfile
请带上脑子
这一部分仅适用于 .NET 的命令行项目。请不要无脑复制黏贴 Dockerfile,必须按照你对应项目的命令行打包方式,来更改 Dockerfile
其实下面的文件是我让 GPT 写的。为什么不问问神奇的 AI 呢
1 | |
这段代码的含义是,先用 SDK 打包生成 .NET 项目,然后把生成结果复制输出,最后用运行时运行。
很好,现在我们有了这个文件,就可以本地先跑一下试试:
1 | |
Great! 生成成功了。现在只要 Push 到你的 Github 上面即可。
请注意路径
docker build 默认以当前目录为基础。对于 .net 来说,应该放在项目文件夹,而并非解决方案文件夹中
配置自动更新
好了我们现在已经有了 Dockerfile,现在可以直接把我们的 Azure 连接到存储库,让 CD 能够自动执行。转到设置-部署,先连接 Github 账号,然后填入你要把生成的保存到的位置(也就是我们的容器注册表),以及 Dockerfile 和根目录的相对位置。
为什么这一段没有图片!?
创建完之后就必须删掉才能展示修改设置的界面。每次添加和删除都会产生一个提交。我不想再给存储库增加垃圾提交了……
当你按捺住激动的心情等待它运行时,你会得到一个神秘的错误——No subscriptions found for ***
鬼知道神秘的 Azure 又干了什么,反正它就是无法识别我的订阅(即使我确实有学生认证的订阅),然后就报个假错……
或许我的学生认证不算订阅
所以手动去 Workflow 里面关掉这项检查:
1 | |
再改改代码推一下,显示修订成功,已经更新的新的镜像了!
小结
Azure 云服务的东西还真的很多,容器服务只是其中一部分。如果你是大学生的话,赶紧薅羊毛,别把大好青春浪费了(笑)。








