当前位置: 首页 > news >正文

Docker操作之启动多个相同容器实例并nginx负载均衡

文章目录

前言

一、一些概念

1.Docker

2.nginx

二、操作步骤

1.构建compose.yaml

2.nginx配置

3.Docker compose命令

4.问题与解决

总结


前言

Docker对于开发、运维人员来说都很熟悉,但是对于开发人员来说,多数时候只需一个容器实例运行即可。但是在生产环境或需要需要多并发请求的情况下,则需要部署多个相同的容器,而且还要进行负载均衡。

本篇即对如上问题进行了一个实践并记录之,希望可以给初学者起到抛砖引玉的作用。


一、一些概念

1.Docker

简言之就是类虚机的东西,但是比虚机要轻量,它的底层都是基于Linux系统环境,但是在应用层面实现了环境与资源的隔离。一个个容器部署一个个应用,相互之间互不影响,而且可以通过Docker、Docker compose、k8s等工具进行运维管理。

2.nginx

是一个很出名的web服务器,类Tomcat、Windows下的IIS等。它除了可以做web服务器,还可以做代理、反向代理、负载均衡等。

nginx也可以部署到Docker环境下,然后实现对Docker其他容器的代理与负载均衡。

二、操作步骤

1.构建compose.yaml

services:freegpt35:image: missuo/freegpt35:latestrestart: noexpose:- 3040# ports:#   - "1301:3040"nginx:image: nginx:latestvolumes:- ./nginx/nginx.conf:/etc/nginx/nginx.conf:roports:- "1301:80"

相关解释:

freegpt35:即我要部署多个一样的容器

expose: -3040,对外不暴露端口,直接给其他容器(nginx)暴漏3040端口

nginx:

volumes:设置磁盘映射,用于进行nginx的配置(端口、负载均衡)

ports:对外暴漏1301端口映射到内部80端口,到时候我们就可以通过外部1301端口访问freegpt35服务了

2.nginx配置

user  nginx;events {worker_connections   1000;
}http {server {listen 80;location / {proxy_pass http://freegpt35:3040;}}
}

相关解释:

listen 80:监听80端口

proxy_pass http://freegpt35:3040,即将80端口的请求转发到这个地址,多个freegpt35的这个名称是一样的

3.Docker compose命令

docker compose up -d --scale freegpt35=3

相关解释:

--scale 即要设置多个实例

freegpt35=3 即设置对应容器实例个数(这个freegpt35是在compose.yaml文件设置的,需要对应上) 

4.问题与解决

这个时候4个Docker容器都起来了,nginx * 1 +  freegpt35 * 3

访问nginx外部地址,但是发现始终请求到某个容器上,没有实现负载均衡!

观察Docker的容器日志,发现nginx容器最早启动,然后才是freegpt35,猜测可能nginx先启动但freegpt35还没启动的时候,监测负载均衡服务是有问题的。

尝试停掉nginx,再启动,这个时候负载均衡生效了,基本验证了我的猜想。

然后决定问下AI,基本是这样,给我解决方案可以设置nginx的depends_on属性,即nginx需要依赖freegpt35服务。

services:freegpt35:image: missuo/freegpt35:latestrestart: noexpose:- 3040# ports:#   - "1301:3040"nginx:image: nginx:latestvolumes:- ./nginx/nginx.conf:/etc/nginx/nginx.conf:roports:- "1301:80"depends_on:- freegpt35

这里增加了最后面两句

depends_on:
      - freegpt35

再次测试,重启Docker,依旧可以实现负载均衡。 


总结

本文针对Docker实现启动多个相同容器实例并通过nginx进行负载均衡的过程进行了说明,并把过程中遇到的问题与解决也进行了说明。

希望可以帮到有需要的小伙伴,让我们一同进步。

http://www.lryc.cn/news/349613.html

相关文章:

  • 本地的git仓库和远程仓库
  • Google I/O 2024 干货全解读:Gemini AI 横空出世,智能未来触手可及!
  • 深入理解JVM:介绍JVM的工作原理,包括类加载机制,内存模型,垃圾回收机制等
  • Springboot+Vue项目-基于Java+MySQL的民族婚纱预定系统(附源码+演示视频+LW)
  • Java面经学习2
  • Java bin目录中的文件如何执行?
  • Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)
  • 5.9网络协议
  • QT客户端开发的注意事项
  • k8s源码编译失败:Makefile:1: *** 缺失分隔符。 停止。
  • 服务器数据恢复—拯救raid5阵列数据行动,raid5数据恢复案例分享
  • 旅游集市数仓建设
  • vue实现点击高亮效果
  • uniapp 配置请求代理+请求封装
  • 代码随想录算法训练营第二十八天|​216.组合总和III​、17.电话号码的字母组合
  • 大模型prompt实例:知识库信息质量校验模块
  • 正则表达式和lambda表达式
  • pyenv 之 python 多版本管理(win11)
  • nodemon运行ts文件
  • 内网渗透瑞士军刀-impacket工具解析(二)
  • huggingface 笔记:pipeline
  • 玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅
  • 电脑录屏软件有哪些?这3款神器必须要知道
  • 如何在华企盾DSC防泄密系统中设置文件自动加密?
  • 【DevOps】Dockerfile详解,做自己的docker镜像
  • CSRF 攻击实验:Token 不存在绕过验证
  • c#教程——索引器
  • 麒麟服务器上执行可执行脚本报错:bash: ./xx: Permission denied(完整版)
  • 触觉美学:移动端UI设计的视觉盛宴
  • 前端起dev从110秒减少到7秒, 开发体验大幅提升