
后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载导读本文完整讲述如何从零搭建一套基于 Gitlab代码托管 CI/CD、阿里云容器镜像服务镜像仓库与 Docker Swarm集群编排的 Hyperf 应用集群从单机 Docker 安装、Gitlab 与 gitlab-runner 部署到 Swarm 集群初始化、Overlay 网络规划、Portainer 可视化管理、镜像构建与 Stack 滚动发布再到 KONG 网关接入、容器内定时任务与内核参数优化。读完本文你将掌握一套可实际落地的小团队也能维护的 Swarm 部署方案并能在集群任意节点通过9501端口直接验证 Hyperf 服务该端口正是 Hyperf HTTP Server 的默认监听端口见 server.php 默认配置。本文以仓库 docs/id/tutorial/docker-swarm.md 为主体融合 docs/en/tutorial/docker-swarm.md 的补充内容并辅以本仓库源码佐证。一、方案总览为什么是 Gitlab Aliyun 镜像 Docker Swarm当前容器技术已相当成熟即使是中小型团队也可以基于 Gitlab、云厂商镜像仓库如阿里云和 Docker Swarm 轻松搭建属于自己的 Docker 集群服务。整条链路的核心流程是Gitlab承载代码仓库与 CI/CD通过 gitlab-runner 执行构建。镜像仓库Registry存放 CI 构建出的应用镜像供集群各节点拉取。Docker Swarm作为编排层负责 Service 的副本管理、滚动更新、重启策略与 Overlay 网络。Portainer提供可视化的集群与 Service 管理界面降低运维门槛。KONG作为集群上层的 API 网关统一入口原因详见九。下文将按基础设施 → 集群初始化 → 应用发布 → 网关与运维 → 附录的顺序逐步展开。二、安装 Docker 并完成基础配置2.1 一键安装 Docker在三台或多台集群机器上分别执行curl -sSL https://get.docker.com/ | sh2.2 开启 Docker 的 TCP 远程连接默认情况下 Docker 仅监听本地 socket无法被远程管理。修改 systemd 服务文件/lib/systemd/system/docker.service在ExecStart末尾追加-H tcp://0.0.0.0:2375允许通过TCP连接 DockerExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2375注意2375是明文 TCP 端口仅建议在可信内网使用公网环境应配合防火墙限制来源 IP或改用 TLS 加密连接。2.3 免 sudo 使用 docker可选如果当前不是root账户可执行以下命令将用户加入docker用户组之后运行docker命令无需再添加sudousermod -aG docker $USER2.4 配置镜像加速地址可选由于跨境路由导致拉取镜像速度慢可申请容器镜像加速器例如阿里云 Docker 镜像加速器后在/etc/docker/daemon.json中配置{registry-mirrors: [https://xxxxx.mirror.aliyuncs.com]}将xxxxx替换为你申请到的加速地址然后重启 Docker 生效。三、搭建自建 Gitlab 服务3.1 修改服务器默认 SSH 端口Gitlab 容器需要占用22端口用于 SSH 连接因此先把宿主机的sshd服务端口从默认的22改为2222或任意未占用端口$ vim /etc/ssh/sshd_config # 将默认 Port 改为 2222 Port 2222 # 重启服务 $ systemctl restart sshd.service之后重新登录机器时需指定端口ssh -p 2222 roothost3.2 用 Docker 启动 Gitlab通过 Docker 运行 Gitlab CE 容器sudo docker run -d --hostname gitlab.xxx.cn \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest--hostname必须指定如果没有域名可以直接填写公网 IP。三个数据卷分别挂载配置、日志与数据目录保证容器重建不丢数据。默认用户名为root初始密码可通过容器内文件获取较新版本的 Gitlab 会生成随机初始密码docker exec gitlab cat /etc/gitlab/initial_root_password3.3 配置 Gitlab 邮件服务可选如果需要 Gitlab 主动发送邮件例如创建用户通知可修改挂载的配置文件/srv/gitlab/config/gitlab.rb以腾讯企业邮为例gitlab_rails[smtp_enable] true gitlab_rails[smtp_address] smtp.exmail.qq.com gitlab_rails[smtp_port] 465 gitlab_rails[smtp_user_name] gitxxxx.com gitlab_rails[smtp_password] xxxx gitlab_rails[smtp_authentication] login gitlab_rails[smtp_enable_starttls_auto] true gitlab_rails[smtp_tls] true gitlab_rails[gitlab_email_from] gitxxxx.com gitlab_rails[smtp_domain] exmail.qq.com修改后需执行docker exec gitlab gitlab-ctl reconfigure使配置生效本文档未给出该命令实际操作时按 Gitlab 官方惯例执行即可。四、部署 gitlab-runner 构建节点建议将 gitlab-runner 与 Gitlab 分机部署使用独立的 Runner 专用服务器。4.1 安装 gitlab-runnerCentOS 示例使用官方仓库脚本安装curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash yum install gitlab-runner当然也可以先更新到最新的git源再用yum直接安装git与gitlab-runner$ curl https://setup.ius.io | sh $ yum -y install git2u $ git version $ yum install gitlab-runner4.2 注册 gitlab-runner使用gitlab-runner register --clone-url http://your-ip/将 Runner 注册到 Gitlab。注意your-ip要替换为 Gitlab 的内网 IP保证 Runner 通过内网克隆代码$ sudo gitlab-runner register --clone-url http://your-ip/ Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): http://gitlab.xxx.cc/ Please enter the gitlab-ci token for this runner: xxxxx Please enter the gitlab-ci description for this runner: xxx Please enter the gitlab-ci tags for this runner (comma separated): builder Please enter the executor: docker-ssh, shell, dockermachine, docker-sshmachine, docker, parallels, ssh, virtualbox, kubernetes: shell交互过程中依次填写CI 协调器地址、Runner Token、描述、标签Tag例如builder执行器选择shell本文方案中 Runner 直接在本机执行构建命令。4.3 调整 gitlab-runner 并发数编辑 Runner 配置文件/etc/gitlab-runner/config.toml将并发数调高以便并行构建$ vim /etc/gitlab-runner/config.toml concurrent 54.4 为 gitlab-runner 授权免 sudo 执行 docker后续构建与推送镜像需要sudo usermod -aG docker gitlab-runner镜像仓库登录授权让 Runner 能以指定账号推送镜像su gitlab-runner docker login -u username your-docker-repository五、初始化 Swarm 集群5.1 初始化集群登录其中一台机器作为管理节点执行$ docker swarm init5.2 创建自定义 Overlay 网络集群服务间需要跨主机通信应使用自定义 Overlay 网络。下面给出三种创建方式按需执行其中一种即可方式一直接创建自定义 Overlay 网络docker network create \ --driver overlay \ --subnet 10.0.0.1/8 \ --opt encrypted \ --attachable \ default-network方式二调整网段解决冲突有时由于网段冲突会导致 Stack 部署失败可以尝试修改--subnet注意此网段仅支持 65535 个 IPdocker network create \ --driver overlay \ --subnet 10.1.0.1/16 \ --opt encrypted \ --attachable \ default-network方式三重建 ingress 网络后再创建自定义网络由于默认ingress网络的网段经常与新建网络冲突可先删除ingress并重建docker network rm ingress docker network create --ingress --subnet 192.168.0.1/16 --driver overlay ingress然后再创建--subnet为10.0.0.1/8的自定义网络docker network create \ --driver overlay \ --subnet 10.0.0.1/8 \ --opt encrypted \ --attachable \ default-network参数说明--driver overlay指定跨主机网络驱动--opt encrypted开启网络层加密--attachable允许普通容器非 Service也挂载该网络后续 MySQL、KONG 等docker run容器均依赖此参数接入。5.3 让其他节点加入集群在管理节点上获取加入命令再在待加入节点上执行# 查看 manager 节点的 TOKEN $ docker swarm join-token manager # 将 manager 节点加入集群 $ docker swarm join --token token ip:2377 # 查看 worker 节点的 TOKEN $ docker swarm join-token worker # 将 worker 节点加入集群 $ docker swarm join --token token ip:23775.4 配置用于发布的 gitlab-runner再注册一个用于线上发布任务的 Runner配置方法与构建 Runner 完全相同但Tag 不能相同。建议将线上环境设为tags测试环境设为test以便 CI 流水线按分支/Tag 区分构建与发布。六、安装集群常用基础设施6.1 以容器方式运行 MySQL下面的例子用docker run直接运行 MySQL并挂载到前面创建的default-network网络支持跨容器通过服务名互相访问docker run --name mysql -v /srv/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORDxxxx -p 3306:3306 --rm --network default-network -d mysql:5.7挂载--network default-network后集群内其他容器即可通过服务名mysql访问数据库--rm表示容器停止即删除数据因挂载卷而保留请按实际需求取舍。6.2 安装 Portainer 可视化管理面板Portainer 是 Docker 官方社区流行的可视化容器管理工具。将其以 Swarm Service 方式部署在管理节点上docker service create \ --name portainer \ --publish 9000:9000 \ --replicas1 \ --constraint node.role manager \ --mount typevolume,srcportainer_data,dst/data \ --mount typebind,src//var/run/docker.sock,dst/var/run/docker.sock \ portainer/portainer关键参数--constraint node.role manager约束其只运行在管理节点通过挂载宿主机/var/run/docker.sock实现对集群的管理。部署完成后通过http://节点IP:9000访问面板。备份 Portainer 数据portainer_container为对应容器名按实际情况填写docker run -it --volumes-from portainer_container -v $(pwd):/backup --name backup --rm nginx tar -cf /backup/data.tar /data/恢复 Portainer 数据先用创建命令重建 Portainer 服务再把备份导入容器docker run -it --volumes-from portainer_container -v $(pwd):/backup --name importer --rm nginx bash cd /backup tar xf data.tar -C /最后只需重启容器即可。七、创建 Demo 项目并打通 CI 发布链路7.1 导入骨架项目登录 Gitlab 创建 Demo 项目导入 Hyperf 官方骨架项目hyperf-skeleton骨架项目对应的核心框架源码即本仓库src/目录下的各组件如 src/server、src/crontab 等可直接参考其composer.json了解依赖关系。7.2 配置阿里云镜像仓库以阿里云容器镜像服务为例选用上海节点先创建命名空间test_namespace再创建镜像仓库demo选择本地仓库类型。然后到用于打包的服务器上登录usermod -aG docker gitlab-runner su gitlab-runner docker login --usernameyour_name registry.cn-shanghai.aliyuncs.com7.3 修改 .gitlab-ci.yml在项目中配置镜像仓库相关变量variables: PROJECT_NAME: demo REGISTRY_URL: registry.cn-shanghai.aliyuncs.com/test_namespace7.4 编写 Stack 编排文件 deploy.test.ymldeploy.test.yml用于在测试环境部署服务需仔细与下面的文件比对version: 3.7 services: demo: image: $REGISTRY_URL/$PROJECT_NAME:test environment: - APP_PROJECTdemo - APP_ENVtest ports: - 9501:9501 deploy: replicas: 1 restart_policy: condition: on-failure delay: 5s max_attempts: 5 update_config: parallelism: 2 delay: 5s order: start-first networks: - default-network configs: - source: demo_v1.0 target: /opt/www/.env configs: demo_v1.0: external: true networks: default-network: external: true要点说明ports: 9501:9501对应 Hyperf HTTP Server 的默认监听端口源码默认值见 src/server/src/Port.php以及发布配置 server.php 中host为0.0.0.0、port为9501。deploy.update_config.order: start-first采用先启动新副本、再停止旧副本的滚动更新策略配合parallelism: 2实现分批发布。通过 Docker Config 将配置注入为容器内的/opt/www/.env实现配置与镜像解耦。APP_ENV为 Hyperf 标准环境变量框架源码中多处依据APP_ENV决定行为例如 WhoopsExceptionHandler 中APP_ENV ! prod时才启用 Whoops 调试页APP_NAME则常作为指标命名空间等标识如 metric 发布配置 中env(APP_NAME, skeleton)。7.5 在 Portainer 中创建 Config在 Portainer 中创建与上文对应的 Configdemo_v1.0内容即 Hyperf 的.env环境变量。Demo 项目无 I/O 操作可直接使用默认值实际项目需按真实环境调整APP_NAMEdemo DB_DRIVERmysql DB_HOSTlocalhost DB_PORT3306 DB_DATABASEhyperf DB_USERNAMEroot DB_PASSWORD DB_CHARSETutf8mb4 DB_COLLATIONutf8mb4_unicode_ci DB_PREFIX REDIS_HOSTlocalhost REDIS_AUTH REDIS_PORT6379 REDIS_DB0注意在集群多机部署中DB_HOST、REDIS_HOST不应填localhost应填写集群 Overlay 网络中的服务名见附录中的相关提醒。7.6 触发构建并验证由于配置的gitlab-ci.yml会检测test分支与 Tag将修改后的内容合并到test分支并推送至 Gitlab 即可触发 CI。发布完成后在集群中任意一台机器上访问9501端口验证curl http://127.0.0.1:9501/若返回 Hyperf 的正常响应说明服务已在集群中成功运行。八、用 Linux Crontab 执行容器内的 Hyperf 命令Hyperf 虽然提供了crontab定时任务组件对应本仓库 src/crontab其进程/命令实现可参考 RunCommand.php但在集群/容器场景下未必满足所有需求。以下脚本可在 Linux 宿主机上定时拉取最新镜像并在容器内执行 Hyperf 命令#!/usr/bin/env bash basepath$(cd dirname $0; pwd) docker pull registry-vpc.cn-shanghai.aliyuncs.com/namespace/project:latest docker run --rm -i -v $basepath/.env:/opt/www/.env \ --entrypoint php registry-vpc.cn-shanghai.aliyuncs.com/namespace/project:latest \ /opt/www/bin/hyperf.php your_command用法示例将脚本放入宿主机的crontab中把your_command替换为具体的 Hyperf 命令如crontab:run即可周期性在容器内执行且通过-v $basepath/.env:/opt/www/.env复用宿主机上的环境配置任务结束后容器自动清理--rm。九、部署 KONG 网关统一入口9.1 为什么要加一层网关通常 Docker Swarm 集群不会直接暴露给外部访问而是在上层搭建网关服务这里推荐KONG。另一个原因是 Docker Swarm 的Ingress network存在设计缺陷在连接不复用的场景下会出现并发瓶颈详见 moby 仓库 Issue #35082 的讨论。KONG 作为网关默认复用后端连接能大幅缓解上述问题。9.2 安装数据库KONG 使用 PostgreSQL 存储配置先将其部署到default-network网络docker run -d --name kong-database \ --networkdefault-network \ -p 5432:5432 \ -e POSTGRES_USERkong \ -e POSTGRES_DBkong \ -e POSTGRES_PASSWORDkong \ postgres:9.69.3 安装网关先初始化数据库迁移docker run --rm \ --networkdefault-network \ -e KONG_DATABASEpostgres \ -e KONG_PG_HOSTkong-database \ -e KONG_PG_PASSWORDkong \ -e KONG_CASSANDRA_CONTACT_POINTSkong-database \ kong:latest kong migrations bootstrap再启动 KONG 容器docker run -d --name kong \ --networkdefault-network \ -e KONG_DATABASEpostgres \ -e KONG_PG_HOSTkong-database \ -e KONG_PG_PASSWORDkong \ -e KONG_CASSANDRA_CONTACT_POINTSkong-database \ -e KONG_PROXY_ACCESS_LOG/dev/stdout \ -e KONG_ADMIN_ACCESS_LOG/dev/stdout \ -e KONG_PROXY_ERROR_LOG/dev/stderr \ -e KONG_ADMIN_ERROR_LOG/dev/stderr \ -e KONG_ADMIN_LISTEN0.0.0.0:8001, 0.0.0.0:8444 ssl \ -p 8000:8000 \ -p 8443:8443 \ -p 8001:8001 \ -p 8444:8444 \ kong:latest端口约定8000/8443为代理端口8001/8444为管理端口。9.4 安装 KONG DashboardKONG Dashboard 提供 Web 管理界面注意当时 Docker 中最新 KONG 版本与 Dashboard 可能存在兼容问题必要时可改用 KONG 0.14.1 版本docker run --rm --networkdefault-network -p 8080:8080 -d --name kong-dashboard pgbi/kong-dashboard start \ --kong-url http://kong:8001 \ --basic-auth user1password1 user2password2--kong-url指向 KONG 管理端口--basic-auth配置访问 Dashboard 的账号密码。9.5 配置 Service 对外访问只需暴露部署了 KONG 网关的那台机器的 IP 供外部访问再在 KONG 中配置对应的 Service 即可若机器直接对外暴露建议只开放80与443端口将 KONG 容器的8000、8443端口映射到宿主机的80、443若前端已有 SLB 等负载均衡则通过负载均衡将80、443直接映射到 KONG 所在机器的8000、8443端口。十、内核优化需谨慎验证本部分内容来自原文档标注需要验证后再使用请谨慎操作。前文提到Ingress network的设计缺陷可通过内核优化缓解。以下步骤以 CentOS/TencentOS 系为例添加 TLinux 内核源tee /etc/yum.repos.d/CentOS-TLinux.repo -EOF [Tlinux] nameTlinux for redhat/centos $releasever - $basearch failovermethodpriority gpgcheck0 gpgkeyhttp://mirrors.tencentyun.com/epel/RPM-GPG-KEY-EPEL-7 enabled1 baseurlhttps://mirrors.tencent.com/tlinux/2.4/tlinux/x86_64/ EOF安装指定内核版本yum -y install kernel-devel-4.14.105-19.0012.tl2.x86_64 kernel-4.14.105-19.0013.tl2.x86_64 kernel-headers-4.14.105-19.0013.tl2.x86_64启用新内核并重建引导sudo awk -F\ $1menuentry {print i : $2} /etc/grub2.cfg grub2-set-default 0 grub2-mkconfig -o /boot/grub2/grub.cfg重启机器reboot优化容器网络参数sysctls需要 Docker 19.09.0 及以上版本支持在镜像同级配置中为容器设置sysctlssysctls: # 连接复用模式选择 - net.ipv4.vs.conn_reuse_mode0 # LVS 转发数据时若发现目标 RS 无效已删除丢弃数据包但不立即删除对应连接置为 1 时立即释放连接 - net.ipv4.vs.expire_nodest_conn1十一、常见问题排查问题 1fatal: git fetch-pack: expected shallow list原因是 gitlab-runner 使用的git版本过低升级git即可$ curl https://setup.ius.io | sh $ yum remove -y git $ yum -y install git2u $ git version # 重新安装并重新注册 gitlab-runner $ yum install gitlab-runner问题 2Service 重启后内网偶发容器不可达提示 Connection refused通常是因为网段 IP 数量不足。解决方法扩大网段重建网络再为 Service 更换网络。创建新网络docker network create \ --driver overlay \ --subnet 10.0.0.0/8 \ --opt encrypted \ --attachable \ default-network为 Service 添加新网络docker service update --network-add default-network service_name移除旧网络docker service update --network-rm old-network service_name问题 3向 Service 添加节点时卡在create阶段原因与解决方案同上网段 IP 不足导致任务无法在新增节点上调度。问题 4在 Portainer 中修改仓库密码后 Service 更新失败Portainer 中的修改不会同步到已创建的 Service需要手动执行更新并携带新的仓库认证信息docker service update --with-registry-auth service_name附录最小化 Docker Swarm 部署仅 Swarm不含 Gitlab如果只需要 Docker Swarm 本身的安装与使用可跳过 Gitlab/CI按以下精简流程操作。假设有三台机器 A、B、C默认以 A 作为 Leader。步骤 1三台机器安装 Dockercurl -sSL https://get.docker.com/ | sh同样修改/lib/systemd/system/docker.service开启 TCP 连接ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2375非 root 用户可执行usermod -aG docker $USER免 sudo。步骤 2初始化 Docker Swarm登录机器 A 执行初始化$ docker swarm init先处理ingress网段冲突删除并重建docker network rm ingress docker network create --ingress --subnet 192.168.0.1/16 --driver overlay ingress再创建--subnet为10.0.0.1/8的自定义网络docker network create \ --driver overlay \ --subnet 10.0.0.1/8 \ --opt encrypted \ --attachable \ default-network查看加入集群的命令三台机器规模下建议都作为 manager$ docker swarm join-token manager若后续需要加入 worker 节点$ docker swarm join-token worker步骤 3将 B、C 加入集群在 B、C 两台机器上执行生成的加入命令docker swarm join --token xxxx ip:2377回到机器 A 验证节点是否加入成功docker node ls能看到 B、C 即表示加入成功。步骤 4使用云镜像仓库前往对应云厂商开通镜像仓库服务原文档以阿里云上海节点为例三台机器均需执行登录docker login --usernamexxxx registry.cn-shanghai.aliyuncs.com步骤 5打包并推送镜像可在任意一台机器或开发环境非集群机器需先docker login执行docker build . -t registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest docker push registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest步骤 6编写 Stack 部署文件回到机器 A进入/opt/www/your_project目录编辑deploy.ymlversion: 3.7 services: your_project: image: registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest ports: - 9501:9501 deploy: replicas: 3 restart_policy: condition: on-failure delay: 5s max_attempts: 5 update_config: parallelism: 2 delay: 5s order: start-first networks: - default-network configs: - source: your_project_v1.1 target: /opt/www/.env configs: your_project_v1.1: file: /opt/www/your_project/.env networks: default-network: external: true编辑同目录下的.env文件完成配置。注意不要用127.0.0.1连接 MySQL 等集群内服务应使用 Overlay 网络中的服务名。步骤 7启动 Servicedocker pull registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest docker stack deploy -c /opt/www/your_project/deploy.yml --with-registry-auth your_project--with-registry-auth会随部署向各节点分发仓库认证信息。检查运行状态docker stack ls docker service ls docker ps步骤 8验证服务可用在三台机器上分别执行curl测试均能返回正常数据即表示服务启动成功curl http://127.0.0.1:9501/步骤 9更新 Service开发机完成打包并推送docker build . -t registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest docker push registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest回到机器 A 拉取新镜像并重新部署由于update_config.order: start-first更新期间服务不会中断docker pull registry.cn-shanghai.aliyuncs.com/your_namespace/your_project:latest docker stack deploy -c /opt/www/your_project/deploy.yml --with-registry-auth your_project结语至此一套以 Gitlab 驱动构建、阿里云镜像仓库分发、Docker Swarm 编排运行、Portainer 可视化管理、KONG 统一网关入口的 Hyperf 集群方案即可完整落地。该方案的每一步都可在本仓库中找到对应的源码印证Hyperf 默认监听9501Port.php、server.php、环境变量APP_ENV/APP_NAME贯穿配置体系exception-handler、metric、定时任务组件位于 src/crontab。实际生产环境请务必结合安全加固TLS、防火墙、镜像扫描与监控告警逐步灰度验证。赞分享后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载相关推荐Hyperf 基于 Docker Swarm 的集群部署实战从 Gitlab CI 到镜像发布的完整流水线Hyperf 基于 Docker Swarm 的集群部署实战从 Gitlab CI 到镜像发布的完整流水线 本教程围绕 Hyperf 项目的生产级容器化部署场后端微服务Hyperf 项目 Docker Swarm 集群搭建实战指南从 GitLab CI 到镜像化部署Hyperf 项目 Docker Swarm 集群搭建实战指南从 GitLab CI 到镜像化部署 本文是一份面向 Hyperf 项目的 Docker Swa后端微服务Hyperf项目基于Docker Swarm的集群部署实战指南Hyperf项目基于Docker Swarm的集群部署实战指南 前言 在现代PHP开发中Hyperf作为高性能的协程框架越来越受到开发者青睐。而Docker后端微服务上一篇从零开始掌握S32K144车规级MCU5步快速上手指南下一篇Mind Elixir终极导出指南5种格式一键转换思维导图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考