上一篇文章介绍了如何创建 Azure 存储账户(Storage Account)以及如何授权用户、组和服务主体(Service Principal)进行访问或 API 调用。本篇将聚焦于存储账户的日常管理与操作。
1、创建容器(Container)
首先,进入已创建的存储账户,在左侧导航栏选择“Data storage”下的“Containers”选项。

点击“+ Add container”按钮,在弹出的配置面板中输入容器名称(例如 startech),并根据需求设置匿名访问级别(通常设为私有)。配置完成后,点击“Create”。

容器创建成功后,会在列表中看到新建的条目。

进入这个容器后,你可以进行文件夹的创建和文件的上传操作。

为了演示,我们上传一个名为 github-recovery-codes.txt 的文件。

文件上传成功后的界面如下所示。

2、访问容器内的文件
为了通过程序化方式访问容器内的文件,我们需要生成一个共享访问签名(SAS)令牌。
为容器生成 SAS 令牌
在容器页面,选择左侧“Settings”下的“Shared access tokens”。

在配置界面中,你可以设置签名方法、密钥、权限、令牌有效时间等。其中,“Permissions”定义了可以对容器内文件执行的操作(如读、写、删除、列表等)。为了演示,我们生成一个权限较全的令牌。

配置完成后,点击“Generate SAS token and URL”,系统会生成对应的 SAS Token 和 SAS URL。

生成的令牌具有有效期(例如到次日凌晨)。利用这个令牌,我们就可以通过工具或程序来操作容器内的文件。这里我们使用微软官方提供的命令行工具 azcopy 进行演示。
安装与使用 azcopy
首先,在 CentOS 系统上安装 azcopy:
[root@k8sworker ~]# curl -sSL -O https://packages.microsoft.com/config/centos/9/packages-microsoft-prod.rpm
[root@k8sworker ~]# rpm -i packages-microsoft-prod.rpm
[root@k8sworker ~]# dnf install azcopy
下载文件到本地:
使用生成的 SAS URL,将容器内的文件下载到本地 /tmp 目录。
[root@k8sworker ~]# azcopy copy "https://starttech.blob.core.windows.net/starttech/github-recovery-codes.txt?sp=racwdl&st=2026-03-27T13:02:11Z&se=2026-03-27T21:17:11Z&spr=https&sv=2024-11-04&sr=c&sig=kzzQ2J4Efi8cZJCYfynmXeuBfyZ4wZx4OhT0nJYR6cA%3D" /tmp
INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support
INFO: Scanning...
Job 26511d00-37b9-5b4c-6be3-d0fc1a010c55 has started
Log file is located at: /root/.azcopy/26511d00-37b9-5b4c-6be3-d0fc1a010c55.log
100.0 %, 1 Done, 0 Failed, 0 Pending, 0 Skipped, 1 Total, 2-sec Throughput (Mb/s): 0.0008
Job 26511d00-37b9-5b4c-6be3-d0fc1a010c55 summary
Elapsed Time (Minutes): 0.0334
Number of File Transfers: 1
Number of Folder Property Transfers: 0
Number of Symlink Transfers: 0
Total Number of Transfers: 1
Number of File Transfers Completed: 1
Number of Folder Transfers Completed: 0
Number of File Transfers Failed: 0
Number of Folder Transfers Failed: 0
Number of File Transfers Skipped: 0
Number of Folder Transfers Skipped: 0
Number of Symbolic Links Skipped: 0
Number of Hardlinks Converted: 0
Number of Hardlinks Skipped: 0
Number of Special Files Skipped: 0
Total Number of Bytes Transferred: 206
Final Job Status: Completed
验证文件是否下载成功:
[root@k8sworker ~]# ls -l /tmp/
total 4
-rw-r--r--. 1 root root 206 Mar 27 21:25 github-recovery-codes.txt
上传文件到容器根目录:
[root@k8sworker ~]# azcopy copy ./anaconda-ks.cfg "https://starttech.blob.core.windows.net/starttech/?sp=racwdl&st=2026-03-27T13:02:11Z&se=2026-03-27T21:17:11Z&spr=https&sv=2024-11-04&sr=c&sig=kzzQ2J4Efi8cZJCYfynmXeuBfyZ4wZx4OhT0nJYR6cA%3D"
INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support
INFO: Scanning...
Job 034a8a1a-ec2c-294b-44af-ff7c1642eef3 has started
Log file is located at: /root/.azcopy/034a8a1a-ec2c-294b-44af-ff7c1642eef3.log
100.0 %, 1 Done, 0 Failed, 0 Pending, 0 Skipped, 1 Total, 2-sec Throughput (Mb/s): 0.0028
Job 034a8a1a-ec2c-294b-44af-ff7c1642eef3 summary
Elapsed Time (Minutes): 0.0333
Number of File Transfers: 1
Number of Folder Property Transfers: 0
Number of Symlink Transfers: 0
Total Number of Transfers: 1
Number of File Transfers Completed: 1
Number of Folder Transfers Completed: 0
Number of File Transfers Failed: 0
Number of Folder Transfers Failed: 0
Number of File Transfers Skipped: 0
Number of Folder Transfers Skipped: 0
Number of Symbolic Links Skipped: 0
Number of Hardlinks Converted: 0
Number of Hardlinks Skipped: 0
Number of Special Files Skipped: 0
Total Number of Bytes Transferred: 701
Final Job Status: Completed
上传后,可以在门户看到容器内现在有两个文件。

上传文件到子目录(自动创建):
即使容器内没有 test 文件夹,你也可以直接指定路径上传,azcopy 会自动创建。
[root@k8sworker ~]# azcopy copy ./anaconda-ks.cfg "https://starttech.blob.core.windows.net/starttech/test/?sp=racwdl&st=2026-03-27T13:02:11Z&se=2026-03-27T21:17:11Z&spr=https&sv=2024-11-04&sr=c&sig=kzzQ2J4Efi8cZJCYfynmXeuBfyZ4wZx4OhT0nJYR6cA%3D"
INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support
INFO: Scanning...
Job 51b95b6e-b555-1048-75f0-9d44699ba2d9 has started
Log file is located at: /root/.azcopy/51b95b6e-b555-1048-75f0-9d44699ba2d9.log
100.0 %, 1 Done, 0 Failed, 0 Pending, 0 Skipped, 1 Total,
Job 51b95b6e-b555-1048-75f0-9d44699ba2d9 summary
Elapsed Time (Minutes): 0.1001
Number of File Transfers: 1
Number of Folder Property Transfers: 0
Number of Symlink Transfers: 0
Total Number of Transfers: 1
Number of File Transfers Completed: 1
Number of Folder Transfers Completed: 0
Number of File Transfers Failed: 0
Number of Folder Transfers Failed: 0
Number of File Transfers Skipped: 0
Number of Folder Property Transfers Skipped: 0
Number of Symbolic Links Skipped: 0
Number of Hardlinks Converted: 0
Number of Hardlinks Skipped: 0
Number of Special Files Skipped: 0
Total Number of Bytes Transferred: 701
Final Job Status: Completed
上传后,在门户中可以看到 test 文件夹及其下的文件。

3、通过网络(Network)配置访问控制
除了使用SAS令牌,你还可以在存储账户级别配置网络规则,以控制哪些IP地址或虚拟网络可以访问存储账户及其容器,这对于构建安全的云原生应用环境至关重要。
进入存储账户的“Security + networking” -> “Networking”设置。

默认情况下,新创建的存储账户允许从所有网络访问。

为了测试,我们配置一个非本地的IP地址(例如 120.164.81.3)为允许访问的地址,这意味着我们自己的公网IP将无法访问。配置保存后测试:
[root@k8sworker ~]# azcopy ls "https://starttech.blob.core.windows.net/starttech/test/?sp=racwdl&st=2026-03-27T13:02:11Z&se=2026-03-27T21:17:11Z&spr=https&sv=2024-11-04&sr=c&sig=kzzQ2J4Efi8cZJCYfynmXeuBfyZ4wZx4OhT0nJYR6cA%3D"
failed to traverse container: cannot list files due to reason HEAD https://starttech.blob.core.windows.net/starttech/test
--------------------------------------------------------------------------------
RESPONSE 403: 403 This request is not authorized to perform this operation.
ERROR CODE: AuthorizationFailure
--------------------------------------------------------------------------------
Response contained no body
--------------------------------------------------------------------------------
再将允许的IP地址修改回我们自己的公网IP(例如 180.164.81.3),再次测试(在Windows环境下使用azcopy):
C:\Users\admin>C:\Users\admin\Downloads\azcopy_windows_amd64_10.32.2\azcopy_windows_amd64_10.32.2\azcopy.exe ls "https://starttech.blob.core.windows.net/starttech/test/?sp=racwdl&st=2026-03-27T13:02:11Z&se=2026-03-27T21:17:11Z&spr=https&sv=2024-11-04&sr=c&sig=kzzQ2J4Efi8cZJCYfynmXeuBfyZ4wZx4OhT0nJYR6cA%3D"
anaconda-ks.cfg; Content Length: 701.00 B
此时,网络访问状态已变为“Enabled from selected networks”。

在企业真实环境中,更推荐使用内网调用,通过配置专用终结点(Private Endpoint)实现网络隔离,避免数据暴露在公网。这不仅是基础的安全实践,也是高效运维/DevOps/SRE流程的一部分。

关于覆盖文件的补充:
在上传文件时,可以使用 --overwrite=false 参数来跳过目标位置已存在的同名文件。
[root@k8sworker ~]# azcopy copy ./anaconda-ks.cfg "https://starttech.blob.core.windows.net/starttech/test/?sp=racwdl&st=2026-03-27T13:02:11Z&se=2026-03-27T21:17:11Z&spr=https&sv=2024-11-04&sr=c&sig=kzzQ2J4Efi8cZJCYfynmXeuBfyZ4wZx4OhT0nJYR6cA%3D" --overwrite=false
INFO: Any empty folders will not be processed, because source and/or destination doesn’t have full folder support
INFO: Scanning...
Job 41d22cc9-75ed-f944-6297-8365f2d45cb1 has started
Log file is located at: /root/.azcopy/41d22cc9-75ed-f944-6297-8365f2d45cb1.log
0.0 %, 0 Done, 0 Failed, 0 Pending, 1 Skipped, 1 Total,
Job 41d22cc9-75ed-f944-6297-8365f2d45cb1 summary
Elapsed Time (Minutes): 0.0667
Number of File Transfers: 1
Number of Folder Property Transfers: 0
Number of Symlink Transfers: 0
Total Number of Transfers: 1
Number of File Transfers Completed: 0
Number of Folder Property Transfers Completed: 0
Number of File Transfers Failed: 0
Number of Folder Property Transfers Failed: 0
Number of File Transfers Skipped: 1
Number of Folder Property Transfers Skipped: 0
Number of Symbolic Links Skipped: 0
Number of Hardlinks Converted: 0
Number of Hardlinks Skipped: 0
Number of Special Files Skipped: 0
Total Number of Bytes Transferred: 0
Final Job Status: CompletedWithSkipped
从门户查看,该文件的上传时间戳没有变化,说明文件被跳过,未覆盖。

4、创建文件共享(File Share)
Azure 存储账户除了 Blob 容器,还支持创建文件共享(类似网络文件共享)。在“Data storage”下选择“File shares”。

点击“+ File share”创建,完成后可以查看其概览。

上图创建的是支持 SMB 协议的文件共享。注意,文件共享的协议支持取决于存储账户的类型。之前的文章我们创建了测试用户并授予了存储账户权限,该用户在门户中可以看到存储账户下的容器和文件共享。

在文件共享的管理界面,可以对其属性进行操作,例如查看连接信息。

对于 SMB 文件共享,Azure 门户提供了从 Windows、Linux、macOS 系统连接的详细命令。下图展示了 Linux 系统的连接脚本。

5、创建支持 NFS 协议的文件共享
如果想要创建支持 NFS 协议的文件共享,存储账户的性能层必须是 Premium。我们之前创建的“Standard”性能层存储账户只支持 SMB。

因此,我们需要新建一个性能层为“Premium”、账户类型为“FileStorage”的存储账户。

等待部署完成。

查看新账户详情,确认“Performance”为“Premium”,“Account kind”为“FileStorage”。

基于这个新存储账户创建文件共享时,就可以选择 NFS 协议了。

创建成功后,可以在列表中看到协议为 NFS 的文件共享。

在 NFS 文件共享的“Connect”页面,可以看到连接说明。但请注意关键提示:NFS 协议只能从虚拟网络(VNet)内部的机器访问。

这是因为当前存储账户的网络配置允许从所有网络访问,但 NFS 协议本身要求必须配置虚拟网络规则。

因此,要使用 NFS 文件共享,必须先配置虚拟网络规则,将存储账户的访问限制在指定的虚拟网络内。这样既实现了网络隔离,又满足了 NFS 协议的访问要求。配置好后,该 NFS 共享可以作为 Azure AKS(Kubernetes 服务)的持久存储卷使用。
总结
以上就是 Azure 存储账户从创建容器、生成访问令牌、进行文件操作,到配置网络访问控制,以及创建 SMB/NFS 文件共享的常规操作流程。理解并掌握这些配置,对于在 Azure 上构建安全、可靠的数据存储方案至关重要。希望这篇指南能对你的实际工作有所帮助。欢迎在云栈社区交流更多云技术实践经验。