很多人第一次把项目搬上云服务器,遇到的头号麻烦往往是环境不一致:本地跑得好好的,到了服务器就报错。Docker 把应用和它依赖的运行环境打包进镜像,正好能解决这个问题。阿里云的容器镜像服务(ACR)负责存放镜像,云服务器(ECS)负责运行容器,两者配合起来,就是“本地构建、云端拉取、直接启动”这套流程。下面用一个小团队的例子,把阿里云docker的基本用法走一遍。

先想清楚要解决什么问题
假设团队有一个用 Node.js 写的内部管理后台。开发同学的笔记本上是 Node 18,服务器上装的是 Node 16,上线后接口莫名其妙报错,排查半天才发现是版本差异。用 Docker 之后,镜像里已经带好了运行环境,服务器只要装好 Docker,拉下镜像就能启动,不用再逐台比对版本。
在阿里云上做这件事,主要用到三样东西:
- 容器镜像服务 ACR:存放和分发镜像,可以理解为私有的镜像仓库。
- 云服务器 ECS:真正运行容器的机器。
- Docker 客户端:在本地或服务器上执行构建、推送、拉取的命令行工具。
开通镜像仓库并创建命名空间
登录阿里云控制台,搜索“容器镜像服务”,然后选择地域。地域要特别留意,建议和 ECS 放在同一个地域,比如都选华东1(杭州)。个人版一般可以免费使用,适合学习和小项目;如果是团队协作,需要权限管理和镜像安全扫描,再考虑企业版。具体套餐和价格以控制台展示为准。
进入后先设置一次 Registry 登录密码,然后创建命名空间,比如 team-admin。接着创建仓库,仓库名填 admin-web。这样,完整的镜像地址就是:
registry.cn-hangzhou.aliyuncs.com/team-admin/admin-web:1.0.0
其中 1.0.0 是版本号。版本号一定要写清楚,不要所有镜像都用 latest。否则出了问题要回滚时,你会分不清哪个是哪个。
本地构建并推送镜像
在项目根目录写一个 Dockerfile。基础镜像可以选 node:18-alpine,先复制依赖文件并安装,再复制源码,最后指定启动命令。写好后执行构建,用 docker tag 把本地镜像名改成上面那个完整的阿里云地址,再登录仓库并推送。
具体顺序如下:
- 构建镜像,给它起一个本地名字。
- 用 docker tag 改成完整的阿里云地址。地址写错的话,镜像会被推到别的仓库,所以打完标签后用 docker images 确认一下名字。
- 用 docker login 登录仓库,用户名和密码使用控制台里设置的访问凭证。
- 用 docker push 推送,然后到控制台里确认新版本已经出现。
密码不要直接写进脚本或代码仓库。可以在终端里交互输入,或者放进 CI 系统的加密变量。团队使用时,最好为部署单独建一个 RAM 子账号,只给推送和拉取镜像的权限,不给控制台的管理权限。
在 ECS 上拉取并运行
登录一台和 ACR 同地域的 ECS,先确认 Docker 已经装好。然后执行登录,拉取镜像,启动容器,并把服务端口映射出去。
这里有个细节值得注意:同地域的 ECS 访问 ACR 时,建议使用 VPC 内网地址,也就是把域名中的 registry 换成 registry-vpc。走内网不占用公网带宽,拉取通常更快,镜像体积越大,差别越明显。
容器启动后,记得去 ECS 安全组里放行对应端口。很多人容器明明已经跑起来了,访问却超时,多半是安全组没开。
加速与日常维护
如果服务器经常从 Docker Hub 拉取基础镜像,网络慢是常见问题。阿里云控制台提供了镜像加速器,把地址写进 Docker 的配置文件并重启 Docker 服务即可生效。配置之后,拉取 node、nginx 这类常用基础镜像会快很多。
日常维护有三点需要注意:
- 版本号写清楚:每次发布打一个新标签,保留最近几个版本,回滚时直接切回旧标签。
- 定期清理:服务器上的悬空镜像和已停止的容器会慢慢占满磁盘。可以用 docker system prune 清理,但执行前先确认没有需要保留的数据,它会删掉所有未被使用的资源。
- 日志单独管理:容器日志默认会一直增长,最好配置日志轮转,或者输出到阿里云日志服务里统一查看。
小结
阿里云docker的流程并不复杂:在 ACR 建好命名空间和仓库,本地构建并推送镜像,ECS 用同地域的内网地址拉取后启动容器。真正容易出问题的,通常是地域不一致、凭证随手乱放、安全组没放行,以及版本号混乱。把这几处留意到,部署就能稳定下来,之后接入 CI 自动构建也会顺畅很多。