镜像已经构建好,推到了私有仓库。接下来怎么把它部署到开发服务器上?

用Docker Compose。

今天这篇文章,我们把之前做的应用镜像,和MongoDB、Mongo Express一起,用Docker Compose在服务器上一键跑起来。

一、部署前的准备工作

我们需要部署三个组件:

  • 自定义应用:从AWS ECR私有仓库拉取

  • MongoDB:从Docker Hub公共仓库拉取

  • Mongo Express:从Docker Hub公共仓库拉取

重要:Docker Hub的镜像可以简写(比如mongo),但私有仓库的镜像必须写完整地址。否则Docker会默认去Docker Hub找,当然找不到。

二、部署服务器要先登录私有仓库

私有仓库不是谁都能拉的。在部署服务器上执行:

docker login <你的私有仓库地址>

输入账号密码,登录成功后,才有权限拉取自定义镜像。

公共镜像不需要登录,只有私有镜像需要。

三、编写Docker Compose配置文件

version: '3'

services:
  my-app:
    image: 454342277166.dkr.ecr.eu-central-1.amazonaws.com/my-app:1.0
    ports:
      - 3000:3000

  mongodb:
    image: mongo
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password

  mongo-express:
    image: mongo-express
    ports:
      - 8081:8081
    restart: always
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=password
      - ME_CONFIG_MONGODB_SERVER=mongodb

几点说明:

  • my-app的镜像地址用的是完整私有仓库地址

  • mongodbmongo-express直接用镜像名,Docker会自动从Hub拉取

  • 环境变量可以写在Compose文件里,和写在Dockerfile里效果一样

四、修改应用代码:不能用localhost了

之前本地开发时,Node.js连接MongoDB用的是:

let mongoUrl = "mongodb://admin:password@localhost:27017";

但在Docker Compose里,应用和MongoDB跑在不同的容器中。localhost指向的是容器自己,不是MongoDB。

Docker Compose会自动创建一个内部网络,容器之间可以用服务名互相访问。

MongoDB的服务名是mongodb,所以要把连接地址改成:

let mongoUrl = "mongodb://admin:password@mongodb";

这是最容易踩的坑,千万别忘了改。

五、重新构建并推送镜像

改完代码,要重新构建镜像,打上版本标签,再推送到私有仓库:

docker build -t my-app:1.0 .
docker tag my-app:1.0 <私有仓库地址>/my-app:1.0
docker push <私有仓库地址>/my-app:1.0

六、在服务器上部署

docker-compose.yml文件上传到服务器,然后执行:

docker-compose -f docker-compose.yml up

看到三个容器都启动成功,访问服务器的3000端口,应用就出来了。

七、完整CI/CD流程回顾

这套流程串起来就是:

  1. 本地开发应用,用Docker跑依赖服务

  2. 代码提交到Git,触发CI

  3. CI服务器构建Docker镜像

  4. 镜像推送到私有仓库

  5. 部署服务器登录私有仓库,拉取镜像

  6. 用Docker Compose一键启动整套应用

写在最后

Docker Compose让多容器部署变得极其简单。你只需要写一个YAML文件,告诉它“我要跑哪些服务、从哪里拉镜像、开哪些端口”,剩下的它全帮你搞定。

记住两个关键点:

  • 私有仓库要先登录

  • 容器间通信用服务名,不是localhost

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐