欢迎,炼金术士!🧙♂️
笔记
🧙♂️长老
呵呵呵,儿子,你迷路了吗?这里充满了无穷无尽的好奇心。别走得太快,儿子!好好看看,随便挑挑拣拣,呵呵呵~
本文介绍了如何使用 Docker 和 PHP 作为其服务来创建负载均衡器的基本知识。
在实际应用中,情况比我们想象的要复杂得多,我建议您选择一个云服务提供商,然后在云平台上设置负载均衡器。
但在你离开之前,阅读本文将有助于你理解负载均衡的思维模型及其目的。
让我们开始吧😼
在计算机领域,负载均衡是指将一组任务分配到一组资源(计算单元)上,以提高整体处理效率的过程。负载均衡可以优化响应时间,避免某些计算节点过载而其他计算节点闲置。
我知道那些华丽的辞藻容易让人困惑,所以我们来简化一下这个定义。
负载均衡是计算机领域的一种技术,它使用两个或多个服务器来处理用户请求。
为了更具体地说明这一点,我们假设你经营一家快递公司。你的公司一天可以收到 100 个包裹需要派送,但你只有一个快递员,他一天最多只能处理 10 个包裹。
您意识到需要10天才能送达这些包裹。如果一家快递公司一天可以完成10次配送,那么增加9家快递公司,您的企业一天就可以完成100次配送。
在现实世界中,快递员充当服务器,同时处理附近高流量的网站,如市场、电影流媒体等。
这项技术旨在将高流量工作负载分配到两台或多台服务器上,以便所有用户都能得到服务器的处理。
读完本文,我们应该能够创建并运行一个 nginx 服务和两个 php 服务。
我们将创建并配置:
请看下图以便更好地理解。
让我们开始创建一个自定义的nginx镜像,并以nginx:1.23.1-alpine该镜像为基础镜像。
首先,创建一个名为 `<directory>` 的目录,docker-basic-lb其中包含一个子目录proxy。
mkdir docker-basic-lb; mkdir docker-basic-lb/proxy;
创建一个Dockerfile。
cd docker-basic-lb/proxy; touch Dockerfile;
打开文件Dockerfile并输入以下代码……
FROM nginx:1.23.1-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
创建nginx配置文件。
touch default.conf;
# docker-basic-lb/proxy/default.conf
upstream gateway {
server service-1:8000;
server service-2:8001;
}
server {
location / {
proxy_pass http://gateway;
}
}
这里我们创建一个自定义的 nginx 镜像及其配置文件。配置文件中有两个服务器:一个是主服务器,service-1另一个service-2是备用服务器,它们各自拥有独立的端口。别担心,我们稍后会创建这些服务……
重要提示:
在生产环境中,我们应该将一个目录绑定到我们自定义的 nginx 镜像,用于存储配置文件。
这很重要,因为当配置文件更改时,我们不需要一遍又一遍地构建镜像。
但是,为了简化这篇文章,我们把它放在图片里面。
我们移步至docker-basic-lb。
cd ../;
在内部创建一个docker-basic-lb名为 . 的目录service。
mkdir service; cd service;
在该service目录下创建一个 Dockerfile 文件,并放入以下代码。我们将使用php:8.1-cli该镜像作为基础镜像。
touch Dockerfile;
FROM php:8.1-cli
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN chmod +x ./start.sh
CMD ["sh", "./start.sh"]
创建start.sh脚本。
#!/bin/bash
set -e;
php -S 0.0.0.0:$PORT ./server.php;
最后,创建一个名为 `returns JSON data` 的文件,server.php当用户访问我们的服务时,该文件会返回 JSON 数据。
<?php
header('Content-Type: application/json');
$message = sprintf(
'Hello from service %s',
getenv('SERVICE_ID')
);
echo json_encode(compact('message'));
重要提示:
在生产环境中,您应该使用类似这样的工具php-fpm。但是,为了简化本文,我们仅使用 PHP 内置的 Web 服务器。
为了将我们的组件连接起来,我们需要一个 Docker 网络。Docker 自带一些内置网络,但我们将创建另一个网络来隔离我们的服务。
创建一个名为“.”的网络docker-basic-lb-network。
docker network create docker-basic-lb-network;
确保网络连接可用。
docker network ls;
迁移docker-basic-lb/proxy并构建代理镜像。
docker build -t proxy:0.1.0 .;
现在转到docker-basic-lb/service并构建服务镜像。
docker build -t service:0.1.0 .;
请确保图片可用。
docker image ls;
我们需要先运行服务容器,因为我们的代理依赖于这些服务才能正常运行。
docker run --name service-1 -e SERVICE_ID=1 -e PORT=8000 --network docker-basic-lb-network -d service:0.1.0;
docker run --name service-2 -e SERVICE_ID=2 -e PORT=8001 --network docker-basic-lb-network -d service:0.1.0;
这里我们运行两个 php 服务,每个服务的名称分别是service-1和service-2。
现在我们来运行代理容器。
docker run --name proxy-1 -p 80:80 --network docker-basic-lb-network -d proxy:0.1.0;
打开 Postman,如果没有安装,请先安装。点击http://localhost后,你应该会看到类似这样的界面……
恭喜!我们已经为我们的服务创建了一个负载均衡器。
希望这篇文章对您有所帮助,也希望您喜欢。再见!
点击这里查看。
请关注我的最新实验!
笔记
🧙♂️长老
呵呵呵,儿子,你迷路了吗?这里充满了无穷无尽的好奇心。别走得太快,儿子!好好看看,随便挑挑拣拣,呵呵呵~