第十节:使用docker compose 快速多节点部署船员项目实操
一. 说明
(和上一节中部署多个节点,负载均衡相同,这一节主要是基于docker compose来部署)
1 需求说明
使用docker部署3个API,然后使用nginx负载均衡轮询策略,将请求转发到前面的3个Api端口,然后再部署2个前端项目
A. Api部署3个docker容器,服务器的对外端口分别为:8203、8204、8205,至于容器内部的运行端口统一为8203 (意味一个镜像即可,然后基于该镜像启动3个容器)
镜像名称:crewship3
3个容器名称:crewship3_container1 、crewship3_container2、crewship3_container3
B. 新建1个nginx的docker容器,部署两个前端项目,船员系统端口8201、后台管理端口8202
容器名称:crewship3_nginx1
C. 新建1个nginx的docker容器,用来负载均衡,监听8208端口,转发请求到8203、8204、8205上,前端项目调用的都是8208端口
容器名称:crewship3_nginx2
2 分析
(1) 先构建出来crewship3镜像,可以单独构建,也可以统一放到docker-compose文件中 【这里统一放到docker-compose文件中】
(2) nginx容器构建前,创建挂载的目录的步骤还是需要进行的,这个无法集成到docker-compose文件中
3 镜像准备
nginx:最新版
dotnet:
mcr.microsoft.com/dotnet/aspnet:9.0
mcr.microsoft.com/dotnet/sdk:9.0
二. 实操
1 前置步骤
(1) Api 项目创建目录 和挂载目录、文件,修改Dockerfile文件 和 api的appsetting.json 【同上一节】
(2) Nginx创建目录、挂载目录、文件 【同上一节】
(3) Nginx的配置文件nginx.conf,【同上一节】
(4) api、前端 发布包的存放路径 【同上一节】
PS: 上述步骤都是事先准备好的。
2 构建docker-compose文件
(1) 将docker-compose.yml文件copy到 /root/crewship3 目录下,和其他发布包同级

(2) docker-compose.yml文件如下,但是我用的是json格式,个人习惯
剖析:
"context": "./api", # 指定Dockerfile文件的路径
"dockerfile": "Dockerfile" # 指定Dockerfile文件的名称,默认就是Dockerfile
查看代码
{
"services": {
"crewship3_container1": {
"build": {
"context": "./api",
"dockerfile": "Dockerfile"
},
"image": "crewship3",
"container_name": "crewship3_container1",
"ports": [
"8203:8203"
],
"volumes": [
"/root/crewship3/conf/8203/appsettings.json:/crewApi/appsettings.json"
]
},
"crewship3_container2": {
"image": "crewship3",
"container_name": "crewship3_container2",
"ports": [
"8204:8203"
],
"volumes": [
"/root/crewship3/conf/8204/appsettings.json:/crewApi/appsettings.json"
]
},
"crewship3_container3": {
"image": "crewship3",
"container_name": "crewship3_container3",
"ports": [
"8205:8203"
],
"volumes": [
"/root/crewship3/conf/8205/appsettings.json:/crewApi/appsettings.json"
]
},
"crewship3_nginx1": {
"image": "nginx",
"container_name": "crewship3_nginx1",
"ports": [
"8208:8208"
],
"volumes": [
"/root/crewship3/nginx_balance/conf/nginx.conf:/etc/nginx/nginx.conf",
"/root/crewship3/nginx_balance/html:/usr/share/nginx/html",
"/root/crewship3/nginx_balance/logs:/var/log/nginx"
]
},
"crewship1_nginx2": {
"image": "nginx",
"container_name": "crewship1_nginx2",
"ports": [
"8201:80",
"8202:8202"
],
"volumes": [
"/root/crewship3/nginx/conf/nginx.conf:/etc/nginx/nginx.conf",
"/root/crewship3/nginx/html:/usr/share/nginx/html",
"/root/crewship3/nginx/logs:/var/log/nginx"
]
}
}
}
3 进入/root/crewship3目录,运行指令
【docker compose up -d】 生成镜像,并构建容器且自动以后台的方式运行运行
查看镜像:【docker compose images】
查看容器:【docker compose ps】【docker compose ps -a】
停止容器:【docker compose stop】
重启容器:【docker compose restart】
开启容器:【docker compose start】
(1) 生成了crewship3镜像

(2) 开启了5个容器

4 扩展
(1) 上述运行指令 【docker compose up -d】 的时候,会发现显示去拉取镜像,并没有直接构建crewship3镜像,但最终还是构建了,最终结果是正确的。

原因剖析:
crewship3_container1 服务既有 image 字段指定了镜像名称 crewship3,又有 build 字段指定了构建配置。当你运行 docker-compose up -d 时,Docker Compose 会先尝试从镜像仓库中拉取 crewship3 镜像,而不是立即使用 build 配置来构建该镜像。这是因为 Docker Compose 默认认为你可能已经将 crewship3 镜像推送到了镜像仓库,优先尝试从仓库中获取该镜像。
crewship3_container2crewship3_container3容器也是先尝试拉取,拉取失败再从本地读取。
解决方案1:
crewship3镜像的构建,单独事先进行,docker-compose文件中都依赖crewship3镜像,然后运行【docker compose up -d】,如下图

解决方案2:
确保镜像中没有 crewship3镜像,然后运行指令 【docker compose up -d --build】,但只解决crewship3_container1 ,crewship3_container2 crewship3_container3 依旧要先拉取

总结:
个人倾向解决方案1,但是即使不解决,先拉取,拉取失败然后走本地构建,读取,也没有什么问题,依旧是可以成功的。
5 测试
访问8201端口 、8202端口,均能正常访问两个前端项目。
http://60.205.120.80:8201/
http://60.205.120.80:8202/
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

浙公网安备 33010602011771号