【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡

这篇具有很好参考价值的文章主要介绍了【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍁博主简介
        🏅云计算领域优质创作者
        🏅2022年CSDN新星计划python赛道第一名

        🏅2022年CSDN原力计划优质作者
        🏅阿里云ACE认证高级工程师
        🏅阿里云开发者社区专家博主

💊交流社区:CSDN云计算交流社区欢迎您的加入!

目录

1.web子目录 

1.1 index.py 

1.2 index.html 

1.3 Dockerfile 

2.haproxy子目录 

3.docker-compose.yml文件 

4.运行compose项目 

👑👑👑结束语👑👑👑

负载均衡器+Web应用是十分经典的应用结构。下面,博主将创建一个该结构的Web项目:将Haproxy作为负载均衡器,后端挂载三个Web容器。
首先创建一个haproxy_web目录,作为项目工作目录,并在其中分别创建两个子目录:web和haproxy。

1.web子目录 

在web子目录下将放置所需Web应用代码和Dockerfile,下面将生成需要的Web镜像。
这里用Python程序来实现一个简单的Web应用,该应用能响应HTTP请求,返回的页面将打印出访问者的IP和响应请求的后端容器的IP。

1.1 index.py 

编写一个index.py作为服务器文件,代码为:

#!/usr/bin/python
#authors: yeasy.github.com
#date: 2013-07-05
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import socket
import fcntl
import struct
import pickle
from datetime import datetime
from collections import OrderedDict
class HandlerClass(SimpleHTTPRequestHandler):
    def get_ip_address(self,ifname):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(
            s.fileno(),
            0x8915, # SIOCGIFADDR
            struct.pack('256s', ifname[:15])
        )[20:24])
    def log_message(self, format, *args):
        if len(args) < 3 or "200" not in args[1]:
            return
        try:
            request = pickle.load(open("pickle_data.txt","r"))
        except:
            request=OrderedDict()
        time_now = datetime.now()
        ts = time_now.strftime('%Y-%m-%d %H:%M:%S')
        server = self.get_ip_address('eth0')
        host=self.address_string()
        addr_pair = (host,server)
        if addr_pair not in request:
            request[addr_pair]=[1,ts]
        else:
            num = request[addr_pair][0]+1
            del request[addr_pair]
            request[addr_pair]=[num,ts]
        file=open("index.html", "w")
        file.write("<!DOCTYPE html> <html> <body><center><h1><font color=\"blue\"
            face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit
            Results</h1></center>");
        for pair in request:
            if pair[0] == host:
                guest = "LOCAL: "+pair[0]
            else:
                guest = pair[0]
            if (time_now-datetime.strptime(request[pair][1],'%Y-%m-%d %H:%M:%S'))
                .seconds < 3:
                file.write("<p style=\"font-size:150%\" >#"+ str(request[pair]
                    [1]) +": <font color=\"red\">"+str(request[pair][0])+ "</
                    font> requests " + "from &lt<font color=\"blue\">"+guest+"
                    </font>&gt to WebServer &lt<font color=\"blue\">"+pair[1]+"
                    </font>&gt</p>")
            else:
                file.write("<p style=\"font-size:150%\" >#"+ str(request[pair]
                    [1]) +": <font color=\"maroon\">"+str(request[pair][0])+
                    "</font> requests " + "from &lt<font color=\"navy\">"+guest+
                    "</font>&gt to WebServer &lt<font color=\"navy\">"+pair[1]+
                    "</font>&gt</p>")
        file.write("</body> </html>");
        file.close()
        pickle.dump(request,open("pickle_data.txt","w"))
if __name__ == '__main__':
    try:
        ServerClass = BaseHTTPServer.HTTPServer
        Protocol = "HTTP/1.0"
        addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1]
        port = len(sys.argv) < 3 and 80 or int(sys.argv[2])
        HandlerClass.protocol_version = Protocol
        httpd = ServerClass((addr, port), HandlerClass)
        sa = httpd.socket.getsockname()
        print "Serving HTTP on", sa[0], "port", sa[1], "..."
        httpd.serve_forever()
    except:
        exit()

1.2 index.html 

生成一个临时的index.html文件,其内容会由index.py来更新:模板文件

$ touch index.html

1.3 Dockerfile 

生成一个Dockerfile,部署该Web应用,内容为:

FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py

2.haproxy子目录 

该目录将配置haproxy镜像。
在其中生成一个haproxy.cfg文件,内容为:
global
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    maxconn 4096
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
listen stats
    bind 0.0.0.0:70
    mode http
    stats enable
    stats hide-version
    stats scope .
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth user:pass
frontend balancer
    bind 0.0.0.0:80
    mode http
    default_backend web_backends
backend web_backends
    mode http
    option forwardfor
    balance roundrobin
    server weba weba:80 check
    server webb webb:80 check
    server webc webc:80 check
    option httpchk GET /
    http-check expect status 200

3.docker-compose.yml文件 

在haproxy_web目录下编写一个docker-compose.yml文件,该文件是Compose使用的主模板文件。其中,指定启动3个Web容器(weba、webb、webc),以及1个Haproxy容器:
# This will start a haproxy and three web services. haproxy will act as a
loadbalancer.
# Authors: yeasy.github.com
# Date: 2015-11-15
weba:
    build: ./web
    expose:
        - 80
webb:
    build: ./web
    expose:
        - 80
webc:
    build: ./web
    expose:
        - 80
haproxy:
    image: haproxy:1.6
    volumes:
        - ./haproxy:/haproxy-override
        - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    links:
        - weba
        - webb
        - webc
    ports:
        - "80:80"
        - "70:70"

4.运行compose项目 

现在haproxy_web目录应该长成下面的样子:

haproxy_web├── docker-compose.yml├── haproxy│ └── haproxy.cfg└── web
    ├── Dockerfile
    ├── index.html
    └── index.py
在该目录下执行sudo docker-compose up命令,控制台会整合显示出所有容器的输出信息:
$ sudo docker-compose up
Recreating haproxyweb_webb_1...
Recreating haproxyweb_webc_1...
Recreating composehaproxyweb_weba_1...
Recreating composehaproxyweb_haproxy_1...
Attaching to composehaproxyweb_webb_1, composehaproxyweb_webc_1, composehaproxyweb_weba_1, composehaproxyweb_haproxy_1

此时通过浏览器访问本地的80端口,会获取到页面信息,如图所示。

【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡

经过Haproxy自动转发到后端的某个Web容器上,刷新页面,可以观察到访问的容器地址的变化。
访问本地70端口,可以查看到Haproxy的统计信息,如下图所示。 查看本地的镜像,会发现Compose自动创建的haproxyweb_weba、 haproxyweb_webb、haproxyweb_webc镜像:

【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡

$ docker images
REPOSITORY          TAG         IMAGE ID         CREATED           VIRTUAL SIZE
haproxyweb_webb     latest      33d5e6f5e20b     44 minutes ago    675.2 MB
haproxyweb_weba     latest      33d5e6f5e20b     44 minutes ago    675.2 MB
haproxyweb_webc     latest      33d5e6f5e20b     44 minutes ago    675.2 MB
当然,还可以进一步使用Consul等方案来实现服务自动发现,这样就可以不用手动指定后端的web容器了,更为灵活。

👑👑👑结束语👑👑👑

【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡文章来源地址https://www.toymoban.com/news/detail-483227.html

到了这里,关于【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux的三剑客

    1、grep命令 grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。它是Linux系统中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 shell脚本中也经常使用grep,因为grep通过返回一个状态值来说明搜索的结果

    2024年02月07日
    浏览(54)
  • Linux 三剑客

            grep主打的就是查找功能 ,它能够在一个或者多个文件中搜索某一特定的字符模式。         grep [选项] 模式 文件名 先说选项: 1.选项         要么是正则要么是字符串 -c       列出共出现多少次 -i        忽略大小写 -n       在前面列出行号 -v       列出没

    2024年02月11日
    浏览(42)
  • linux文本三剑客

    过滤/查找 参数 用法 作用 -i grep -i STRING xxx.txt 从xxx.txt文件查找不区分大小写STRING -w grep -w STRING xxx.txt 精确匹配STRING -e grep -e STRING1 -e STRING2 xxx.txt 查找多个STRING行 -n grep -n STRING xxx.txt 查看STRING 在第几行 -v grep -v STRING xxx.txt 输出不包含STRING的行 -r grep -r STRING DIR/ 查找DIR目录下哪

    2024年02月11日
    浏览(41)
  • linux文本三剑客详解

    awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。 特点: grep——单纯的查找或匹配文本。 sed——编辑匹配到的文本。 awk——格式化文本,对文本进行较复杂格式处理。 首先了解一下正则表达式: 匹配字符  配置次数  位置锚定:定位出现的位置   实例介绍:

    2024年04月16日
    浏览(43)
  • 文本三剑客之 awk

    Linux/UNIX 系统中,awk 是一个功能强大的编辑工具。逐行读取输入文本 以空格作为分割符,多个空格他会自动压缩成一个空格 AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理. 1按照命令找指定的行  2.找到的行 打印,操作 awk

    2024年02月08日
    浏览(40)
  • 网页三剑客之 HTML

    本章开始我们来介绍一下网页前端部分,我们只是简单的介绍一些常用的各种标签,其目的在于为我们后面的项目做准备。 我们并不要求能完全掌握前端的语法,但是在见到以后能够认识这些代码就可以了。 想走后端开发的,前端不需要多么熟悉,毕竟在各个企业中前后端

    2024年02月02日
    浏览(36)
  • 『 前端三剑客 』:CSS常用属性

    一 . CSS常用元素属性 1.1 字体家族和 字体大小 设置的字体需要是 windows 上自带的字体 , 要求是系统中已经安装了的字体 使用 css 设置字体为微软雅黑 和 宋体 , 字体大小为 30 px 和 40 px font - size 设置的是字体的字符框的高度的大小 . 设置效果如下所示 1.2 设置字体粗细 font-we

    2024年02月15日
    浏览(46)
  • 前端三剑客 —— CSS (第三节)

    目录 上节回顾: 1.CSS使用有以下几种样式; 2.选择器         1.基本选择器         2.包含选择器         3.属性选择器 []         4.伪类选择器 :         5.伪元素选择器 ::before :after 3.常见样式的使用 常见样式参考表 一些特殊样式 媒体查询 自定义字体 变

    2024年04月08日
    浏览(49)
  • 『 前端三剑客 』:HTML常用标签

    在HTML中标签是以成对的结构出现的,在HTML当中代码是通过标签来组织的 , 下面通过见得的Hello World的展现来显示歘HTML 标签的结构 如上述代码块所示,形如 用尖括号进行组织的,成对出现的这个东西就叫做标签 (tag) , 也可以叫做元素(element); 通常情况下一个标签是成对出现的, 开

    2024年02月09日
    浏览(46)
  • 文本三剑客之~~~sed命令

    sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 包括读取,执行和显示三个过程 读取:sed从输入流(文件,管道

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包