使用Docker Compose 实现nginx负载均衡的方法步骤
以Docker的网络管理,容器的IP设置为基础知识实现Nginx负载均衡
查看所有docker网络
dockernetworkls /* NETWORKIDNAMEDRIVERSCOPE b832b168ca9abridgebridgelocal 373be82d3a6acomposetest_defaultbridgelocal a360425082c4hosthostlocal 154f600f0e90nonenulllocal */ //composetest_default是上一篇介绍Compose时,docker-compose.yml文件所在的目录名, //所以,用docker-compose创建的容器会默认创建一个以目录名为网络名的网络,并且是dridge(桥接)类型
指定容器IP地址
官网文档地址:https://docs.docker.com/compose/compose-file/#ipv4_address-ipv6_address
继续编写上一篇《12.使用DockerCompose容器编排工具》文章中的docker-compose.yml
version:"3" services: web1: container_name:web1 image:"centos:httpd" ports: -"8080:80" privileged:true volumes: -"/app/www/web1/:/var/www/html/" command:['/usr/sbin/init'] networks: nginx-lsb: ipv4_address:192.169.0.3 web2: container_name:web2 image:"centos:httpd" ports: -"8081:80" privileged:true volumes: -"/app/www/web2/:/var/www/html/" command:['/usr/sbin/init'] networks: nginx-lsb: ipv4_address:192.169.0.2 networks: nginx-lsb: driver:bridge ipam: config: -subnet:192.169.0.0/16
使用docker-compose启动容器
docker-composeup-d
查看容器是否启动,并确认是否创建了网络nginx-lsb
//可以查看当前docker-compose.yml配置的容器组里的容器状态 docker-composeps dockernetworkls /* NETWORKIDNAMEDRIVERSCOPE b832b168ca9abridgebridgelocal 373be82d3a6acomposetest_defaultbridgelocal de6f5b8df1c8composetest_nginx-lsbbridgelocal a360425082c4hosthostlocal 154f600f0e90nonenulllocal */ //创建了nginx-lsb网络,命名是容器组项目的文件名开头_网络名
查看网络nginx-lsb的详情
dockernetworkinspectcomposetest_nginx-lsb //详情里面可以看到使用这个网络的每个容器的ip 如: /* ... "Containers":{ "039aa860ef04f20a7566fdc943fb4398a61d2ad6dd3e373b17c86ac778af89e3":{ "Name":"web2", "EndpointID":"1bc206661179e65999015f132c2889d3d4365b8d42b8a89cf9c260016fedd5ee", "MacAddress":"02:42:c0:a9:00:02", "IPv4Address":"192.169.0.2/16", "IPv6Address":"" }, "437ad7a07da8e46c0abaf845c4b08425338009fbe972bde69478cf47c75c315b":{ "Name":"web1", "EndpointID":"5a36e602a5364ee9ad06e9816d09e3966d56ebf06b9394ebc25b8bcee9546607", "MacAddress":"02:42:c0:a9:00:03", "IPv4Address":"192.169.0.3/16", "IPv6Address":"" } }, ... */
使用env_file环境文件:
简单可以理解为:在docker-compose.yml中定义变量,引用在外部.env文件中进行变量定义
官方文档地址:https://docs.docker.com/compose/compose-file/#env_file
//还是在composetest目录中定义个.env文件,用来存放变量 web1_addr=192.169.0.2 web2_addr=192.169.0.3 //修改docker-compose.yml文件,加入变量定义 version:"3" services: web1: container_name:web1 image:"centos:httpd" ports: -"8080:80" privileged:true volumes: -"/app/www/web1/:/var/www/html/" command:['/usr/sbin/init'] networks: nginx-lsb: ipv4_address:${web1_addr} web2: container_name:web2 image:"centos:httpd" ports: -"8081:80" privileged:true volumes: -"/app/www/web2/:/var/www/html/" command:['/usr/sbin/init'] networks: nginx-lsb: ipv4_address:${web2_addr} networks: nginx-lsb: driver:bridge ipam: config: -subnet:192.169.0.0/16
重新启动composetest项目,并查看网络详情,确认容器ip是否设置成功
//重新启动composetest项目 docker-composeup-d //查看网络详情 dockernetworkinspectcomposetest_nginx-lsb
在composetest项目中添加一台nginx服务器作为负载均衡服务器
//在.env文件里添加一个变量nginx_lsb web1_addr=192.169.0.2 web2_addr=192.169.0.3 nginx_lsb=192.169.0.100 //修改docker-compose.yml文件,加入变量定义 version:"3" services: nginx-lsb: container_name:nginx-lsb image:"centos:nginx" ports: -"8000:80" privileged:true volumes: -"/app/nginx/nginx.conf:/etc/nginx/nginx.conf" networks: nginx-lsb: ipv4_address:${nginx_lsb} web1: container_name:web1 image:"centos:httpd" ports: -"8080:80" privileged:true volumes: -"/app/www/web1/:/var/www/html/" command:['/usr/sbin/init'] networks: nginx-lsb: ipv4_address:${web1_addr} web2: container_name:web2 image:"centos:httpd" ports: -"8081:80" privileged:true volumes: -"/app/www/web2/:/var/www/html/" command:['/usr/sbin/init'] networks: nginx-lsb: ipv4_address:${web2_addr} networks: nginx-lsb: driver:bridge ipam: config: -subnet:192.169.0.0/16 //重新启动composetest项目 docker-composeup-d
修改nginx.conf配置文件,配置负载均衡
upstreammydocker{ server192.169.0.2; server192.169.0.3; } server{ listen80; server_namemydocker; location/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_bufferingoff; proxy_passhttp://mydocker; } }
重新启动nginx-lsb,加载配置文件
docker-composerrestartnginx-lsb
访问http://服务器IP地址:8000,测试服务器负载均衡!
注意:上一篇已经在两台httpd服务器上放置了不同的web文件
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。