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: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进行负载均衡的过程进行了说明,并把过程中遇到的问题与解决也进行了说明。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值