文章目录
前言
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:latest
restart: no
expose:
- 3040
# ports:
# - "1301:3040"
nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "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:latest
restart: no
expose:
- 3040
# ports:
# - "1301:3040"
nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "1301:80"
depends_on:
- freegpt35
这里增加了最后面两句
depends_on:
- freegpt35
再次测试,重启Docker,依旧可以实现负载均衡。
总结
本文针对Docker实现启动多个相同容器实例并通过nginx进行负载均衡的过程进行了说明,并把过程中遇到的问题与解决也进行了说明。
希望可以帮到有需要的小伙伴,让我们一同进步。