Docker Compose部署全流程:从私有仓库拉取镜像,一键启动整套应用
本文介绍使用Docker Compose部署私有仓库应用镜像及MongoDB服务的完整流程。关键步骤包括:1)服务器登录私有仓库;2)编写包含应用、MongoDB和Mongo-Express的compose文件;3)修改应用代码将数据库连接地址从localhost改为服务名;4)重新构建推送镜像;5)在服务器执行docker-compose up启动服务。重点注意事项:私有镜像需完整地址,容器间通

镜像已经构建好,推到了私有仓库。接下来怎么把它部署到开发服务器上?
用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的镜像地址用的是完整私有仓库地址 -
mongodb和mongo-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流程回顾
这套流程串起来就是:
-
本地开发应用,用Docker跑依赖服务
-
代码提交到Git,触发CI
-
CI服务器构建Docker镜像
-
镜像推送到私有仓库
-
部署服务器登录私有仓库,拉取镜像
-
用Docker Compose一键启动整套应用
写在最后
Docker Compose让多容器部署变得极其简单。你只需要写一个YAML文件,告诉它“我要跑哪些服务、从哪里拉镜像、开哪些端口”,剩下的它全帮你搞定。
记住两个关键点:
-
私有仓库要先登录
-
容器间通信用服务名,不是localhost
更多推荐
所有评论(0)