发布于 2026-01-06 0 阅读
0

使用 Docker、NGINX 和 PHP 实现基础负载均衡 欢迎来到炼金术士的世界!🧙‍♂️

使用 Docker、NGINX 和 PHP 实现基本负载均衡

欢迎,炼金术士!🧙‍♂️

本文介绍了如何使用 Docker 和 PHP 作为其服务来创建负载均衡器的基本知识。

在实际应用中,情况比我们想象的要复杂得多,我建议您选择一个云服务提供商,然后在云平台上设置负载均衡器。

但在你离开之前,阅读本文将有助于你理解负载均衡的思维模型及其目的。

让我们开始吧😼

负载均衡器简介

在计算机领域,负载均衡是指将一组任务分配到一组资源(计算单元)上,以提高整体处理效率的过程。负载均衡可以优化响应时间,避免某些计算节点过载而其他计算节点闲置。

维基百科 - 负载均衡(计算机)

我知道那些华丽的辞藻容易让人困惑,所以我们来简化一下这个定义。

负载均衡是计算机领域的一种技术,它使用两个或多个服务器来处理用户请求。

为了更具体地说明这一点,我们假设你经营一家快递公司。你的公司一天可以收到 100 个包裹需要派送,但你只有一个快递员,他一天最多只能处理 10 个包裹。

您意识到需要10天才能送达这些包裹。如果一家快递公司一天可以完成10次配送,那么增加9家快递公司,您的企业一天就可以完成100次配送。

在现实世界中,快递员充当服务器,同时处理附近高流量的网站,如市场、电影流媒体等。

这项技术旨在将高流量工作负载分配到两台或多台服务器上,以便所有用户都能得到服务器的处理。

我们目标的总体规划

读完本文,我们应该能够创建并运行一个 nginx 服务和两个 php 服务。

我们将创建并配置:

  • 自定义 nginx Docker 镜像
  • 自定义 PHP Docker 镜像
  • 自定义 Docker 网络

请看下图以便更好地理解。

Docker负载均衡器

任务 1:创建自定义 NGINX 镜像

让我们开始创建一个自定义的nginx镜像,并以nginx:1.23.1-alpine该镜像为基础镜像。

首先,创建一个名为 `<directory>` 的目录,docker-basic-lb其中包含一个子目录proxy

mkdir docker-basic-lb; mkdir docker-basic-lb/proxy;
Enter fullscreen mode Exit fullscreen mode

创建一个Dockerfile

cd docker-basic-lb/proxy; touch Dockerfile;
Enter fullscreen mode Exit fullscreen mode

打开文件Dockerfile并输入以下代码……

FROM nginx:1.23.1-alpine

RUN rm /etc/nginx/conf.d/default.conf

COPY ./default.conf /etc/nginx/conf.d/default.conf
Enter fullscreen mode Exit fullscreen mode

创建nginx配置文件。

touch default.conf;
Enter fullscreen mode Exit fullscreen mode
# docker-basic-lb/proxy/default.conf

upstream gateway {
  server service-1:8000;
  server service-2:8001;
}

server {
  location / {
    proxy_pass http://gateway;
  }
}
Enter fullscreen mode Exit fullscreen mode

这里我们创建一个自定义的 nginx 镜像及其配置文件。配置文件中有两个服务器:一个是主服务器,service-1另一个service-2是备用服务器,它们各自拥有独立的端口。别担心,我们稍后会创建这些服务……

重要提示:
在生产环境中,我们应该将一个目录绑定到我们自定义的 nginx 镜像,用于存储配置文件。

这很重要,因为当配置文件更改时,我们不需要一遍又一遍地构建镜像。

但是,为了简化这篇文章,我们把它放在图片里面。

任务 2:创建自定义 PHP Docker 镜像

我们移步至docker-basic-lb

cd ../;
Enter fullscreen mode Exit fullscreen mode

在内部创建一个docker-basic-lb名为 . 的目录service

mkdir service; cd service;
Enter fullscreen mode Exit fullscreen mode

在该service目录下创建一个 Dockerfile 文件,并放入以下代码。我们将使用php:8.1-cli该镜像作为基础镜像。

touch Dockerfile;
Enter fullscreen mode Exit fullscreen mode
FROM php:8.1-cli

COPY . /usr/src/app

WORKDIR /usr/src/app

RUN chmod +x ./start.sh

CMD ["sh", "./start.sh"]
Enter fullscreen mode Exit fullscreen mode

创建start.sh脚本。

#!/bin/bash

set -e;

php -S 0.0.0.0:$PORT ./server.php;
Enter fullscreen mode Exit fullscreen mode

最后,创建一个名为 `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'));
Enter fullscreen mode Exit fullscreen mode

重要提示:
在生产环境中,您应该使用类似这样的工具php-fpm。但是,为了简化本文,我们仅使用 PHP 内置的 Web 服务器。

任务 3:创建自定义 Docker 网络

为了将我们的组件连接起来,我们需要一个 Docker 网络。Docker 自带一些内置网络,但我们将创建另一个网络来隔离我们的服务。

创建一个名为“.”的网络docker-basic-lb-network

docker network create docker-basic-lb-network;
Enter fullscreen mode Exit fullscreen mode

确保网络连接可用。

docker network ls;
Enter fullscreen mode Exit fullscreen mode

docker network ls 命令的结果

将万物连接起来

构建所有镜像

迁移docker-basic-lb/proxy并构建代理镜像。

docker build -t proxy:0.1.0 .;
Enter fullscreen mode Exit fullscreen mode

现在转到docker-basic-lb/service并构建服务镜像。

docker build -t service:0.1.0 .;
Enter fullscreen mode Exit fullscreen mode

请确保图片可用。

docker image ls;
Enter fullscreen mode Exit fullscreen mode

运行容器

我们需要先运行服务容器,因为我们的代理依赖于这些服务才能正常运行。

docker run --name service-1 -e SERVICE_ID=1 -e PORT=8000 --network docker-basic-lb-network -d service:0.1.0;
Enter fullscreen mode Exit fullscreen mode
docker run --name service-2 -e SERVICE_ID=2 -e PORT=8001 --network docker-basic-lb-network -d service:0.1.0;
Enter fullscreen mode Exit fullscreen mode

这里我们运行两个 php 服务,每个服务的名称分别是service-1service-2

现在我们来运行代理容器。

docker run --name proxy-1 -p 80:80 --network docker-basic-lb-network -d proxy:0.1.0;
Enter fullscreen mode Exit fullscreen mode

测试

打开 Postman,如果没有安装,请先安装。点击http://localhost后,你应该会看到类似这样的界面……

服务 1 响应

服务 2 响应

恭喜!我们已经为我们的服务创建了一个负载均衡器。

希望这篇文章对您有所帮助,也希望您喜欢。再见!

附赠:源代码

点击这里查看

请关注我的最新实验!

GitHub 标志 thexdev / devlabs

🧙‍​​♂️ 点击这里查看我的最新实验!🪄

欢迎,炼金术士!🧙‍♂️

笔记

🧙‍​​♂️长老

呵呵呵,儿子,你迷路了吗?这里充满了无穷无尽的好奇心。别走得太快,儿子!好好看看,随便挑挑拣拣,呵呵呵~






文章来源:https://dev.to/thexdev/basic-load-balancing-with-docker-nginx-php-2p08