很多团队的第一步云端交付,是把本地构建好的镜像放到阿里云 ECS 上运行。这篇按实际顺序走一遍:在 ECS 上装 Docker,配置加速器,用一个 Node.js 小服务做示例,构建后推送到 ACR,最后整理几个常见卡点。

一、为什么放在阿里云上跑
Docker 能让应用在哪台机器上都是同一套运行环境,但真要放到线上,还得处理镜像存放、网络隔离和流量分发。阿里云的分工比较清楚:ECS 提供计算资源,ACR(容器镜像服务)负责存放和分发镜像,VPC 管网络隔离,SLB 做负载分发。
对小团队来说,好处是不用自己搭镜像仓库,也不必在宿主机网络上花太多时间,精力可以放在业务代码上。
二、开始前检查什么
下面几项确认好,后面的步骤才不会卡住:
- 一台已开通的 ECS 实例。示例使用 Ubuntu 22.04,其他仍在维护的 Linux 发行版也可以。CentOS 8 已停止维护,不建议新装。
- 安全组放行 22 端口,用于 SSH 登录。服务需要对外访问时,再放行对应的业务端口。
- 在容器镜像服务控制台开通 ACR,并创建命名空间。
- 本地装好 Docker,用来构建和验证镜像。
安全组是最容易被忽略的一项。容器启动成功却访问超时,多数时候是端口没放行,而不是 Docker 出了问题。
三、在 ECS 上安装 Docker
Ubuntu 上安装 Docker 建议走阿里云镜像站的 docker-ce 源,国内速度比官方源快很多。先更新软件包索引:
sudo apt-get update
导入 GPG 密钥、添加软件源的命令,直接从阿里云镜像站的 docker-ce 页面复制。系统版本和密钥格式会变,手抄很容易出错。安装完成后,设置开机自启并立即启动,再用 docker version 确认客户端和服务端版本都能正常显示。
3.1 配置镜像加速器
国内直接拉取 Docker Hub 上的镜像,经常慢到超时。阿里云给每个账号分配了专属加速地址,可以在容器镜像服务控制台找到。把它写进 /etc/docker/daemon.json 的 registry-mirrors 字段,然后重启 Docker。
加速器主要缓存热门基础镜像,比如 nginx、redis、mysql。如果你的构建每次都要拉这些镜像,效果会比较明显。
四、案例:打包 Node.js 服务并推送到 ACR
下面用一个简单的 Node.js 接口服务,走完从写 Dockerfile 到推送的整个流程。
4.1 编写 Dockerfile
在项目根目录新建 Dockerfile,内容如下:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci –omit=dev
COPY . .
EXPOSE 3000
CMD [“node”, “server.js”]
这份文件有几处要注意。先单独复制 package*.json 再安装依赖,Docker 会缓存这一层,之后只改源码时不用重新装依赖。npm ci 要求项目里有 package-lock.json,没有的话先在本地执行一次 npm install 生成。基础镜像用 alpine 版本,体积小很多,本例构建出的镜像大约 150MB 左右,实际大小取决于依赖多少。
另外一定要加一个 .dockerignore,至少写上 node_modules 和 .git。否则本机的 node_modules 会被 COPY . . 整个打进镜像,既撑大体积,还可能覆盖掉容器里刚装好的依赖。
4.2 构建与本地验证
执行 docker build -t my-api:v1.0 . 完成构建,再用 docker run -d -p 3000:3000 my-api:v1.0 启动容器,通过 curl 访问接口确认服务正常。本地跑通再推送,可以避免把有问题的镜像传到云端,也省去之后回滚的麻烦。
4.3 推送到 ACR
先在 ACR 控制台的访问凭证里设置仓库登录密码。这个密码是 ACR 单独设置的,不是阿里云账号密码。建议用专门的凭证,不要直接用主账号的密码。
登录命令如下,把账号换成自己的:
docker login –username=你的账号 registry.cn-hangzhou.aliyuncs.com
登录成功后,给镜像打上带仓库地址的标签,再推送:
docker tag my-api:v1.0 registry.cn-hangzhou.aliyuncs.com/你的命名空间/my-api:v1.0
docker push registry.cn-hangzhou.aliyuncs.com/你的命名空间/my-api:v1.0
地址里的 cn-hangzhou 要和你开通 ACR 的地域一致,换地域就得换地址。推送完成后,在 ECS 上执行 docker pull 同一地址即可拉取。如果 ECS 和 ACR 在同一地域,可以在 ACR 控制台找到 VPC 内网地址改用它拉取,速度和流量成本都更合适。
五、常见问题怎么查
- 拉取镜像超时:先检查 daemon.json 里的加速器地址是否写对,再确认改完之后已经重启 Docker。
- 容器启动了但访问不了:按顺序看三处。安全组有没有放行端口,docker ps 里的端口映射是否生效,服务是否监听在 0.0.0.0。容器里的服务如果只监听 127.0.0.1,外部同样访问不到。
- 磁盘空间不足:用 docker system prune 清理停止的容器和无用镜像。这个命令会删除数据,执行前先用 docker ps -a 和 docker images 确认没有需要保留的内容。
- 登录 ACR 失败:确认输入的是 ACR 单独设置的登录密码,同时检查镜像地址的地域是否和命名空间所在地域一致。
六、小结
整个流程是:ECS 装好 Docker 并配置加速器,构建镜像并在本地验证,推送到 ACR,再从 ECS 拉取运行。每一步都有可以检查的地方,出问题时按网络、安全组、配置的顺序排查,定位会快很多。服务稳定后,可以再接入容器服务 ACK 做编排,或者用 CI 流水线自动完成构建和推送。