【网络代理】(三)Docker+Haproxy 搭建四层代理

news/2024/7/7 18:37:09

目录

1.1  创建 web 服务器镜像

1.2  启动 web 服务器容器

2.1  编写 haproxy 配置文件

2.2  拉取 haproxy 镜像

2.3  启动 haproxy 容器

3.1  访问 8000 端口

3.2  查看 web 服务器容器日志

附录:haproxy 仪表板


 

1.1  创建 web 服务器镜像

编写一个 Dockerfile,安装 python3 以及可能需要使用到的工具,作为 web 服务器镜像。Dockerfile 内容如下:

FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y iperf3 iproute2 iptables vim python3

创建名为 ready 的镜像:

docker build -f ./Dockerfile -t ready .

1.2  启动 web 服务器容器

使用以下命令启动三个 web 服务器容器,分别为 web01、web02、web03:

docker run -d --name=web01 ready python3 -m http.server 8000
docker run -d --name=web02 ready python3 -m http.server 8000
docker run -d --name=web02 ready python3 -m http.server 8000

使用以下命令查看 web 服务器容器的 ip 地址,为了之后填写配置文件:

docker inspect web01
docker inspect web02
docker inspect web03

如下图所示: 

从而分别得到 ip 地址为:172.17.0.2、172.17.0.3、172.17.0.4 。

2.1  编写 haproxy 配置文件

由于 haproxy 容器里面并没有自动编写配置文件,因此我们需要自己创建一个配置文件,启动容器时再将我们的配置文件挂载到 haproxy 容器上。

首先创建目录和配置文件:

mkdir /home/envoutante/haproxy
vim haproxy.cfg

配置文件内容如下:

#----------------
# Global settings
#----------------
global
log 127.0.0.1 local2
maxconn 4000
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 500
#-------------
#Stats monitor
#-------------
frontend stats_monitor
bind *:8404
stats enable
stats uri /stats
stats refresh 5s
#--------------------
#Application frontend
#--------------------
frontend myfrontend
bind :8000
default_backend webservers
#--------------------
backend webservers
#负载均衡算法#
balance roundrobin
mode http
server web01 172.17.0.2:8080 check weight 1
server web02 172.17.0.3:8080 check weight 2
server web03 172.17.0.4:8080 check weight 3
#map_end#

说明:

  • 第一个前端 stats_monitor 监听端口 8404,并启用 HAProxy Stats 仪表板。该仪表板显示负载均衡器的实时统计信息。
  • 第二个前端 myfrontend 监听端口 8000,并将请求分派到 web 服务器后端中列出的三个 web 应用程序之一。
  • 后端 webservers 采用负载均衡算法,需要根据刚才创建的三个 web 服务器容器的信息来填写服务器名称和服务器的 ip 地址。

2.2  拉取 haproxy 镜像

使用命令:

docker image pull haproxy

2.3  启动 haproxy 容器

sudo docker run -d --name haproxy \
   -v /home/envoutante/haproxy:/usr/local/etc/haproxy \
   -p 8000:8000 -p 8404:8404 haproxy

说明:使用 -v 参数将包含配置文件的目录挂载到容器的 /usr/local/etc/haproxy 目录下;使用 -p 参数将容器端口 8000 映射到主机上的相同端口,同时也为 HAProxy Stats 页面映射到了端口 8404 。

3.1  访问 8000 端口

在浏览器中输入以下网址:

http://localhost:8000

如下图所示:

3.2  查看 web 服务器容器日志

使用以下命令查看 web 服务器容器日志:

docker logs -f web01
docker logs -f web02
docker logs -f web03

结果如下图所示:

可见 web01 到 web03 所承担的访问量呈递增趋势,符合我们设置的权重 1、2、3,实验结果与预期相符。

附录:haproxy 仪表板


参考博客:如何优雅的在 Docker 中运行高性能负载均衡器 HAProxy - 知乎


http://lihuaxi.xjx100.cn/news/1367782.html

相关文章

深入理解 PostgreSQL 的架构和内部工作原理

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Centos Certbot 使用

安装 可选配置:启动EPEL存储库 非必要项 yum install -y epel-release yum clean all yum makecache #启用可选通道 可以不配置 yum -y install yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional必要配置…

进程间的通信之管道(匿名管道)

文章目录 进程间通信(IPC)管道管道特点为什么可以使用管道进行进程间通信管道数据结构匿名管道的使用 管道实例管道读写特点管道设置非阻塞 进程间通信(IPC) inter process conmmunication 👇👇&#x1f…

Istio Pilot源码学习(一):Pilot-Discovery启动流程、ConfigController配置规则发现

本文基于Istio 1.18.0版本进行源码学习 1、Pilot-Discovery工作原理 Pilot-Discovery是Istio控制面的核心,负责服务网格中的流量管理以及控制面和数据面之间的配置下发 Pilot-Discovery从注册中心(如Kubernetes)获取服务信息并汇集&#xff…

Java使用Jsoup实现一个网页爬虫

更多文章:技数未来 (techdatafuture.com) Jsoup是一个开源的Java HTML解析库,用于从网页中提取和操作数据。它提供了一种简单和方便的方式来处理HTML,并且可以在Java中实现网页爬虫。 Jsoup的优点包括: 1. 简单易用:J…

【微信小程序】使用button组件来实现一个带有点击效果的按钮,按钮中间添加一个大的+号图标

在微信小程序中&#xff0c;你可以使用button组件来实现一个带有点击效果的按钮&#xff0c;并在按钮中间添加一个大的号图标。以下是一个示例代码&#xff1a; <button class"button"><text class"plus"></text> </button>.butt…

Two Days wpf 分享 分页组件

迟来的wpf分享。 目录 一、序言 二、前期准备 三、前端界面 四、后台代码部分 1、先定义些变量后面使用 2、先是按钮事件代码。 首页按钮 上一页按钮 下一页按钮 末尾按钮 画每页显示等数据 每页显示多少条 判断是否为数字的事件 分页数字的点击触发事件 跳转到…

sqlserver触发器

sqlserver 和 oracle 触发器还是有区别的&#xff0c;sqlserver 没有for each row 的概念&#xff0c;执行一条语句&#xff0c;无论多少条数据&#xff0c;触发一次&#xff0c;所以要用游标循环&#xff0c;做逻辑判断。当然&#xff0c;也可以考虑同临时表&#xff0c;再遍历…