1 创建测试目录和文件

[root@docker-a ~]# mkdir lee
[root@docker-a ~]# cd lee/
[root@docker-a lee]# touch docker-compose.yml # 容器编排工具Docker Compose 默认识别docker-compose.yml文件

2 编写docker-compose.yml文件和haproxy.cfg文件

2.1 核心配置说明

2.1.1 服务结构

  • 共定义 3 个服务:web1web2(Nginx 网页服务)和 haproxy(负载均衡服务)
  • 形成 "负载均衡器 + 两个后端服务" 的经典架构,通过 Haproxy 分发请求到 web1 和 web2

2.1.2 网络通信

  • mynet1 是核心通信网络,三个服务都加入此网络,确保 Haproxy 能访问后端 Nginx
  • 容器间可通过容器名(如web1web2)直接通信(Docker 内置 DNS 解析)
  • mynet2 为预留网络,可用于后续扩展其他服务(如添加数据库时使用)

2.1.3 数据持久化

  • Nginx 的网页内容通过volumes挂载到宿主机,实现:
    • 宿主机直接修改网页内容(无需进入容器)
    • 容器重建后数据不丢失(内容保存在宿主机)

2.1.4 端口策略

  • Nginx 容器使用expose: 80:仅在内部网络暴露端口,外部无法直接访问(增强安全性)
  • Haproxy 使用ports: 80:80:将宿主机 80 端口开放,作为外部访问的唯一入口

2.1.5 重启策略

  • restart: always 确保服务在意外退出或服务器重启后自动恢复,提高可用性

2.2 工作流程

  1. 外部用户访问宿主机的 80 端口(如http://192.168.36.101
  2. 请求通过端口映射进入 Haproxy 容器的 80 端口
  3. Haproxy 根据haproxy.cfg中的配置(如轮询策略),将请求转发到web1:80web2:80
  4. Nginx 容器处理请求,返回/usr/share/nginx/html目录下的index.html内容(来自宿主机挂载的目录)

2.3 编写docker-compose.yml文件

[root@docker-a lee]# vim docker-compose.yml
services:# 第一个Nginx服务容器(web1)web1:# 使用的基础镜像:最新版Nginximage: nginx:latest# 容器的自定义名称(便于识别和操作)container_name: web1# 重启策略:总是重启(容器退出时自动重启,包括系统启动时)restart: always# 加入的网络(与Haproxy共享mynet1网络实现通信)networks:- mynet1# 暴露容器内部端口(仅在容器所在网络内可见,外部无法直接访问)expose:- 80  # Nginx默认监听的端口# 数据卷挂载(将宿主机目录与容器内目录关联,实现文件共享和持久化)volumes:# 宿主机目录:/docker/web/html1 映射到容器内Nginx的默认网页目录# 这样修改宿主机的/html1目录内容,容器内会实时同步- /docker/web/html1:/usr/share/nginx/html# 第二个Nginx服务容器(web2),与web1配置类似,用于提供不同内容实现负载均衡效果web2:image: nginx:latestcontainer_name: web2restart: alwaysnetworks:- mynet1  # 同样加入mynet1网络,确保Haproxy能访问expose:- 80volumes:# 与web1使用不同的宿主机目录,以便存放不同的网页内容- /docker/web/html2:/usr/share/nginx/html# Haproxy负载均衡服务,用于分发请求到web1和web2haproxy:# 使用2.3版本的Haproxy镜像(需与配置文件兼容)image: haproxy:2.3container_name: haproxyrestart: always# 加入两个网络:# - mynet1:用于与web1、web2通信,获取后端服务# - mynet2:可用于连接其他服务(当前配置中未使用,预留扩展)networks:- mynet1- mynet2# 挂载Haproxy配置文件:宿主机的haproxy.cfg映射到容器内的默认配置路径# 注意:不同版本Haproxy的默认配置路径可能不同,2.3版本路径为/usr/local/etc/haproxy/volumes:- /docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg# 端口映射:将宿主机的80端口映射到容器内的80端口# 外部访问宿主机80端口时,请求会转发到Haproxy容器的80端口ports:- 80:80# 定义网络配置
networks:# 第一个网络:供web1、web2和haproxy内部通信mynet1:# 使用bridge驱动(Docker默认的网络驱动,创建独立的网络命名空间)driver: bridge# 第二个网络:预留网络,可用于扩展其他服务(如数据库、缓存等)mynet2:driver: bridge

2.3.1 启动配置文件

[root@docker-a lee]# docker compose up -d

2.4 编写haproxy.cfg文件

[root@docker-a lee]# vim /docker/conf/haproxy/haproxy.cfg
[root@docker-a lee]# cat /docker/conf/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global# to have these messages end up in /var/log/haproxy.log you will# need to:## 1) configure syslog to accept network log events.  This is done#    by adding the '-r' option to the SYSLOGD_OPTIONS in#    /etc/sysconfig/syslog## 2) configure local2 events to go to the /var/log/haproxy.log#   file. A line like the following can be added to#   /etc/sysconfig/syslog##    local2.*                       /var/log/haproxy.log#log         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/stats# utilize system-wide crypto-policiesssl-default-bind-ciphers PROFILE=SYSTEMssl-default-server-ciphers PROFILE=SYSTEM#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-closeoption forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000listen webcluster  # 定义一个名为webcluster的监听集群bind *:80      # 监听所有网络接口的80端口(接收外部HTTP请求)mode http      # 工作模式为HTTP(专门处理HTTP协议)balance roundrobin  # 负载均衡算法:轮询(依次分发请求到后端服务器)# 定义后端服务器1:web1容器的80端口server server1 web1:80 check inter 2 rise 3# 定义后端服务器2:web2容器的80端口server server2 web2:80 check inter 2 rise 3
[root@docker-a lee]#

2.4.1 写入测试内容

[root@docker-a lee]# echo web1 > /docker/web/html1/index.html
[root@docker-a lee]# echo web2 > /docker/web/html2/index.html
[root@docker-a lee]# cat /docker/web/html1/index.html
web1
[root@docker-a lee]# cat /docker/web/html2/index.html
web2
[root@docker-a lee]#

2.4.2 重启所有容器

[root@docker-a lee]# docker compose down
[root@docker-a lee]# docker compose up -d
[root@docker-a lee]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS                                 NAMES
e201c44d759b   haproxy:2.3    "docker-entrypoint.s…"   10 seconds ago   Up 9 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp   haproxy
c16240d3589d   nginx:latest   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   80/tcp                                web2
7c474eee1643   nginx:latest   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   80/tcp                                web1

3 测试效果

[root@docker-a lee]# curl 192.168.36.101
web1
[root@docker-a lee]# curl 192.168.36.101
web2
[root@docker-a lee]# curl 192.168.36.101
web1
[root@docker-a lee]# curl 192.168.36.101
web2

通过此配置,可以实现简单的负载均衡和高可用架构,适合作为 Web 服务的基础部署方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92933.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92933.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92933.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinRAR v7.13 烈火汉化稳定版,解压缩全格式专家

[软件名称]: WinRAR v7.13 烈火汉化稳定版 [软件大小]: 3.8 MB [下载通道]: 夸克盘 | 迅雷盘 软件介绍 WinRAR 压缩文件管理器,知名解压缩软件,电脑装机必备软件,国内最流行最好用的压缩文件管理器、解压缩必备软件。它提供 RAR 和 ZIP 文…

强化学习常用数据集

强化学习常用数据集数学推理数据集数值标签GSM8K(2021 OpenAI)问答数据集在LLM场景下进行强化学习训练的时候,时常会涉及到各种各样的数据集,容易记不住,因此开个帖子记录一下。可采取的分类方法有很多,这里直接按照领…

ROS2学习(1)—基础概念及环境搭建

文章目录核心框架环境搭建小乌龟机器人控制小乌龟启动键盘控制启动rqt查看ros节点关系核心框架 这里有几个比较重要的概念: 四大通信机制:话题(Topic)、服务(Service)、动作(Action&#xff09…

基于STM32单片机超声波测速测距防撞报警设计

1 系统功能介绍 本设计是一套基于 STM32F103C8T6 单片机 的超声波测速测距防撞报警系统,能够实现对目标物体的实时测距与测速,并通过 TFT 彩屏进行动态显示,同时根据用户设定的距离与速度阈值进行报警提示。该系统不仅可以用于固定场景的安全…

麒麟系统播放 pptx

目录 python 操作 LibreOffice 控制pptx 一页一页播放 1. 安装 LibreOffice(麒麟系统基于 Debian/Ubuntu) 2. 如果只想安装 PPT 播放/转换(Impress) 1. 启动 LibreOffice UNO 服务 2. Python 控制播放uno安装方法&#xff1a…

嵌入式Linnux学习 -- 软件编程2

四、IO1. 概念1. IO 指 input / output2. Linux系统中一切皆是文件3. IO操作的对象是文件2. 文件1. 概念一段数据的集合2. 特点文件通常存放在外存中,掉点后数据不会丢3. 分类b(block,块设备文件)-- 按块扫描信息的文件&#x…

Spark02 - SparkContext介绍

一、应用入口:SparkContextSpark Application 程序入口为:SparkContext,任何一个应用首先需要构建 SparkContext 对象,如下两步构建:第一步、创建 SparkConf 对象设置 Spark Application 基本信息,比如应用…

Selenium动态元素定位

动态元素定位方法一:使用CSS选择器通过部分匹配操作符定位动态属性中的固定部分。*(包含),^(开头),$(结尾)。/* 匹配id前缀为user_的元素 */ cssdiv[id^"user_"…

OBOO鸥柏丨115寸商用屏/工业液晶显示器招标投标核心标底参数要求

整机参数要求:商用液晶显示器/工业LCD一体机/商业智能终端机/工业防爆显示器/招标投标核心标底参数要求1、整机屏幕采用≥采用115英寸超高清原厂原包原装工业LCD液晶屏面板;具有高色域,显示动态视频、web及3D动画时,保障运动画面流…

麻溜启动Oracle实例demo

注意:镜像非常大并且外网网络过慢,可能得pull一天(n次超时)。。md后台静默pull命令: nohup docker pull container-registry.oracle.com/database/express:latest > pull.log 2>&1 & 启动实例&#xff1…

应用监控工具Skywalking

目录 Skywalking介绍 Skywalking架构 Skywalking安装 Skywalking使用 Skywalking配置 Skywalking数据持久化 Skywalking告警 Skywalking介绍 Apache Skywalking是一个开源的应用性能监控(Application Performance Monitoring,APM)工具…

TCP服务建立的全流程详解

TCP的服务监听步骤(等待客户端连接前)TCP 服务器通过以下步骤完成从初始化到等待客户端连接,为后续的数据传输(send()/recv())奠定了基础一、创建套接字(Socket)作用:套接字是网络通…

数据结构 双链表与LinkedList

本节目标: 认识并且能够实现一个双链表认识LinkedList类并且知道如何去使用 1.双链表 概念 在数据结构中,双链表(Doubly Linked List) 是一种常见的线性数据结构,它由一系列节点组成,每个节点不仅包含数据…

如何解决 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本区域选择问题:key is invalid

如何解决 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本区域选择问题:key is invalid 在 JetBrains 发布的 IntelliJ IDEA、PyCharm 2024.2 和 2025.2 新版本中,增加了一个新的功能——区域选择。在设置菜单中,你可以找到这一选项&#…

GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略

目录 前言 一、百度天气JSON 1、请求参数 2、返回参数 3、属性映射 二、GSON属性映射实战 1、类对象映射 2、属性字段映射 3、日期数据映射 三、天气接口对象展示 1、接口调用 2、Java属性打印输出 四、总结 前言 在当今数字化时代,数据的高效处理与转换…

NAS技术在县级融媒体中心的架构设计与安全运维浅析

NAS技术在县级融媒体中心的架构设计与安全运维浅析 ——原理剖析、应用实践与防御体系建设作者:高级网络安全工程师 吉林•镇赉融媒 刘晓伟 最后更新:2025年8月 适用对象:媒体行业网络安全从业者一、NAS技术核心原理剖析 1. 基础架构 NAS&am…

CobaltStrike的搭建和使用

下载CobaltStrike环境建议使用jdk17,其他java版本有些功能可能无法使用通过网盘分享的文件:CS4.7key-mht.zip 链接: https://pan.baidu.com/s/1CRd1x4r6EIk14BD3UCLgxw?pwdevf4 提取码: evf4将下载的文件分别放在服务器和 本地/kali 上 也就是服务器为…

【Altium designer】一键给多个器件添加参数

目的: 一键给N个元器件/Part添加参数和修改参数值,比如一键给多个电阻添加“备注”并赋予备注的内容为“不焊接”,或者更改“备注”的内容为“不焊接”或空。 背景: 刚入门用AD画原理图,因为原理图的电阻、电容和芯片等等的冗余/兼容设计太多,增加备注不焊的元器件位号…

熟练掌握switch语句:技巧与运用

目录 一、switch语句基础 基本语法结构: 在C/C中: 注意事项: 二、if与switch语句对比 示例:计算整数除以3的余数 使用if语句实现: 使用switch语句实现: 三、break语句的作用 示例(无br…

【03】厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析

厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析 1.下面的程序的输出是()。2.在头文件中#ifndef/#define/#endif的作用是4.执行下面程序中的输出语句后,输出的结果是()6.在32位处理器上,运行如下程序后p的值为()。10.设有两字符串“…