容器化部署Hyperf框架

1. Hyperf概述

尽管现在基于PHP语言开发的框架处于一个百家争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为PHP微服务铺路的框架,此为Hyperf及其团队成员的初衷。

Hyperf是一个高性能、高灵活性的渐进式PHP协程框架,内置协程服务器及大量常用的组件,性能较传统基于PHP-FPM的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于PSR标准实现和强大的依赖注入设计,保证了绝大部分组件或类都是可替换与可复用的。

Hyperspeed + Flexibility = Hyperf,从名字上就可以看出超高速和灵活性是Hyperf的基因。对于超高速,Hyperf基于Swoole和Swow协程,并在框架设计上进行大量的优化以确保超高性能的输出。对于灵活性,Hyperf强大的依赖注入组件,组件均基于PSR标准的契约和由Hyperf定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。

Hyperf运行环境如下:

  • Linux
  • PHP 8.0+
  • Swoole 4.5+ or Swow
2. 基础准备

下载软件包至本地:

[root@master ~]# curl -O http://mirrors.douxuedu.com/competition/Hyperf.tar.gz

解压软件包并导入镜像:

[root@master ~]# tar -zxf Hyperf.tar.gz
[root@master ~]# docker load -i Hyperf/images/centos_7.9.2009.tar

安装Docker Compose:

[root@master ~]# cp Hyperf/docker-compose-Linux-x86_64 /usr/bin/docker-compose
[root@master ~]# docker-compose version
docker-compose version 1.25.0, build 0a186604
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
3. 容器化部署MySQL

(1)编写Dockerfile

编写init.sh脚本:

[root@master ~]# cd Hyperf/
[root@master Hyperf]# vi mysql_init.sh 
#!/bin/bash
mysql_install_db --user=root
mysqld_safe --user=root &
sleep 8
mysqladmin -u root password 'root'
mysql -uroot -proot -e "grant all on *.* to 'root'@'%' identified by 'root'; flush privileges;"
mysql -uroot -proot -e " source /opt/hyperf_admin.sql;"

编写yum源:

[root@master Hyperf]# vi local.repo 
[hyperf]
name=hyperf
baseurl=file:///root/yum
gpgcheck=0
enabled=1

编写Dockerfile文件:

[root@master Hyperf]# vi Dockerfile-mysql 
FROM centos:7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
ENV LC_ALL en_US.UTF-8
RUN yum -y install mariadb-server
COPY sql /opt/
COPY mysql_init.sh /opt/
RUN bash /opt/mysql_init.sh
EXPOSE 3306
CMD ["mysqld_safe","--user=root"]

(2)构建镜像

[root@master Hyperf]# docker build -t hyperf-mysql:v1.0 -f Dockerfile-mysql .
Sending build context to Docker daemon  643.8MB
Step 1/12 : FROM centos:7.9.2009
 ---> bae1bec259cb
Step 2/12 : MAINTAINER Chinaskills
 ---> Using cache
 ---> d2a088574726
Step 3/12 : RUN rm -rf /etc/yum.repos.d/*
 ---> Using cache
 ---> a2c179e2b75a
Step 4/12 : COPY local.repo /etc/yum.repos.d/
 ---> Using cache
 ---> 6db3f98be6d2
Step 5/12 : COPY yum /root/yum
 ---> Using cache
 ---> f4b3b9061b09
Step 6/12 : ENV LC_ALL en_US.UTF-8
 ---> Using cache
 ---> 523b8d138958
Step 7/12 : RUN yum -y install mariadb-server
 ---> Using cache
 ---> 0b66a990ade1
Step 8/12 : COPY sql /opt/
 ---> Using cache
 ---> 38b8501435f5
Step 9/12 : COPY mysql_init.sh /opt/
 ---> Using cache
 ---> 5f389602308d
Step 10/12 : RUN bash /opt/mysql_init.sh
 ---> Using cache
 ---> bf5471931b94
Step 11/12 : EXPOSE 3306
 ---> Using cache
 ---> 1e2eeada92b4
Step 12/12 : CMD ["mysqld_safe","--user=root"]
 ---> Using cache
 ---> f2312cf42712
Successfully built f2312cf42712
Successfully tagged hyperf-mysql:v1.0
4. 容器化部署Redis

(1)编写Dockerfile

[root@master Hyperf]# vi Dockerfile-redis
FROM centos:7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum -y install redis
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf && \
    sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
EXPOSE 6379
CMD ["/usr/bin/redis-server","/etc/redis.conf"]

(2)构建镜像

[root@master Hyperf]# docker build -t hyperf-redis:v1.0 -f Dockerfile-redis .
Sending build context to Docker daemon  643.8MB
Step 1/9 : FROM centos:7.9.2009
 ---> bae1bec259cb
Step 2/9 : MAINTAINER Chinaskills
 ---> Using cache
 ---> d2a088574726
Step 3/9 : RUN rm -rf /etc/yum.repos.d/*
 ---> Using cache
 ---> a2c179e2b75a
Step 4/9 : COPY local.repo /etc/yum.repos.d/
 ---> Using cache
 ---> 6db3f98be6d2
Step 5/9 : COPY yum /root/yum
 ---> Using cache
 ---> f4b3b9061b09
Step 6/9 : RUN yum -y install redis
 ---> Using cache
 ---> 3604db0933a7
Step 7/9 : RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf &&     sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
 ---> Using cache
 ---> 65610b0a9aa1
Step 8/9 : EXPOSE 6379
 ---> Using cache
 ---> dbb3373a6209
Step 9/9 : CMD ["/usr/bin/redis-server","/etc/redis.conf"]
 ---> Using cache
 ---> d8c3f4a447fe
Successfully built d8c3f4a447fe
Successfully tagged hyperf-redis:v1.0
5. 容器化部署Hyperf

(1)编写Dockerfile

[root@master Hyperf]# cat Dockerfile-hyperf 
FROM centos:7.9.2009
ADD yum /root/yum
ADD swoole-v4.8.3.zip /tmp
RUN rm -rf /etc/yum.repos.d/*
ADD local.repo /etc/yum.repos.d/local.repo
RUN yum clean all 
RUN yum install -y autoconf dpkg-devel dpkg-dev gcc gcc-c++ yum-utils tzdata unzip
RUN yum install -y php php-*
RUN cd /tmp && unzip swoole-v4.8.3.zip && mv swoole-v4.8.3 swoole
RUN cd /tmp/swoole && phpize  && ./configure --enable-mysqlnd --enable-openssl --enable-http2 && make -s -j$(nproc) && make install
RUN echo 'extension=swoole.so' > /etc/php.d/20-swoole.ini
RUN echo "swoole.use_shortname = 'Off'" >> /etc/php.d/20-swoole.ini
RUN php --ri swoole

(2)构建镜像

[root@master Hyperf]# docker build -t hyperf-admin:v1.0 -f Dockerfile-hyperf .
Sending build context to Docker daemon    748MB
Step 1/13 : FROM centos:7.9.2009
 ---> eeb6ee3f44bd
Step 2/13 : ADD yum /root/yum
 ---> Using cache
 ---> 4dc92be0540a
Step 3/13 : ADD swoole-v4.8.3.zip /tmp
 ---> Using cache
 ---> 7cd702422151
Step 4/13 : RUN rm -rf /etc/yum.repos.d/*
 ---> Using cache
 ---> 65babffa6486
Step 5/13 : ADD local.repo /etc/yum.repos.d/local.repo
 ---> Using cache
 ---> ae992ad32138
Step 6/13 : RUN yum clean all
 ---> Using cache
 ---> 484e80f41425
Step 7/13 : RUN yum install -y autoconf dpkg-devel dpkg-dev gcc gcc-c++ yum-utils tzdata unzip
 ---> Using cache
 ---> 346bfd6340fa
Step 8/13 : RUN yum install -y php php-*
 ---> Using cache
 ---> 9425e16fa12a
Step 9/13 : RUN cd /tmp && unzip swoole-v4.8.3.zip && mv swoole-v4.8.3 swoole
 ---> Using cache
 ---> d12edd34a486
Step 10/13 : RUN cd /tmp/swoole && phpize  && ./configure --enable-mysqlnd --enable-openssl --enable-http2 && make -s -j$(nproc) && make install
 ---> Using cache
 ---> 4198fe8c64dd
Step 11/13 : RUN echo 'extension=swoole.so' > /etc/php.d/20-swoole.ini
 ---> Using cache
 ---> 9fd3b28c6411
Step 12/13 : RUN echo "swoole.use_shortname = 'Off'" >> /etc/php.d/20-swoole.ini
 ---> Using cache
 ---> 48a0313c8d64
Step 13/13 : RUN php --ri swoole
 ---> Using cache
 ---> cd0dee04ddaa
Successfully built cd0dee04ddaa
Successfully tagged hyperf-admin:v1.0
6. 容器化部署前端服务

(1)编写Dockerfile

[root@master Hyperf]# vi Dockerfile-nginx 
FROM centos:7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum -y install nginx
RUN /bin/bash -c 'echo init ok'
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

(2)构建镜像

[root@master Hyperf]# docker build -t hyperf-nginx:v1.0 -f Dockerfile-nginx .
Sending build context to Docker daemon  643.8MB
Step 1/9 : FROM centos:7.9.2009
 ---> bae1bec259cb
Step 2/9 : MAINTAINER Chinaskills
 ---> Using cache
 ---> d2a088574726
Step 3/9 : RUN rm -rf /etc/yum.repos.d/*
 ---> Using cache
 ---> a2c179e2b75a
Step 4/9 : COPY local.repo /etc/yum.repos.d/
 ---> Using cache
 ---> 6db3f98be6d2
Step 5/9 : COPY yum /root/yum
 ---> Using cache
 ---> f4b3b9061b09
Step 6/9 : RUN yum -y install nginx
 ---> Using cache
 ---> 767105e717be
Step 7/9 : RUN /bin/bash -c 'echo init ok'
 ---> Using cache
 ---> 850dea3bff50
Step 8/9 : EXPOSE 80
 ---> Using cache
 ---> 0e06332a0dfc
Step 9/9 : CMD ["nginx","-g","daemon off;"]
 ---> Using cache
 ---> ffd462173f7d
Successfully built ffd462173f7d
Successfully tagged hyperf-nginx:v1.0
7. 编排部署Pig

(1)编写docker-compose.yml编排文件

[root@master Hyperf]# vi project/docker-compose.yaml
version: '3.1'
services:
  app:
    container_name: hyperf-admin
    image: hyperf-admin:v1.0
    command:
      - /bin/sh
      - -c
      - |
        cd /data
        cp .env.dev.docker .env
        php -d memory_limit=-1 `which composer` i --no-dev
        rm -rf runtime/*
        php bin/hyperf.php start
    volumes:
      - ./backend:/data
    tty: true
    links:
      - mysql
      - redis
    environment:
      HOST_IP: 127.0.0.1
      HOST_PORT: 9511
  mysql:
    container_name: mysql
    image: hyperf-mysql:v1.0
    ports:
      - 3307:3306
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./docker/data:/var/lib/mysql:rw
  redis:
    image: hyperf-redis:v1.0
    container_name: redis
#    command: redis-server
  nginx:
    image: hyperf-nginx:v1.0
    container_name: nginx
    ports:
      - 8081:80
    links:
      - app
    volumes:
      - ./docker/conf.d:/etc/nginx/conf.d
      - ./docker/log:/var/log/nginx
      - ./frontend:/var/www/frontend

(2)部署服务

[root@master Hyperf]# docker-compose -f project/docker-compose.yaml up -d
Creating network "project_default" with the default driver
Creating mysql ... done
Creating redis ... done
Creating hyperf-admin ... done
Creating nginx        ... done

查看服务:

[root@master Hyperf]# docker-compose -f project/docker-compose.yaml ps
Name                  Command                 State           Ports         
------------------------------------------------------------------------------
hyperf-admin   /bin/sh -c cd /data              Up                            
               cp .en ...                                                     
mysql          mysqld_safe --user=root          Up      0.0.0.0:3307->3306/tcp
nginx          nginx -g daemon off;             Up      0.0.0.0:8081->80/tcp  
redis          /usr/bin/redis-server /etc ...   Up      6379/tcp          

在浏览器上通过http://IP:8081访问,如图1所示:
在这里插入图片描述

账号:daodao和密码: a1a1a1,点击登录。如图2所示:
在这里插入图片描述
至此,Hyperf框架就部署完成了。

以下是 Hyperf 官方提供的通过 Kubernetes 实现容器部署的文档,供您参考: 1. 部署环境要求 - 操作系统:Linux - Docker:18.06.0-ce 或更高版本 - Kubernetes:1.11.0 或更高版本 2. 部署步骤 2.1 创建 Docker 镜像 首先,您需要创建一个 Docker 镜像,该镜像包含了 Hyperf 应用程序以及其依赖项。您可以使用 Dockerfile 来定义镜像的构建过程。示例 Dockerfile 如下: ``` FROM php:7.4-fpm # 安装依赖 RUN apt-get update && \ apt-get install -y git zip unzip && \ docker-php-ext-install pdo_mysql && \ pecl install redis && \ docker-php-ext-enable redis # 安装 Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # 复制 Hyperf 应用程序 COPY . /var/www # 安装依赖项 WORKDIR /var/www RUN composer install # 暴露端口 EXPOSE 9501 # 启动命令 CMD ["php", "bin/hyperf.php", "start"] ``` 其中,我们使用了 `php:7.4-fpm` 作为基础镜像,安装了 Hyperf 应用程序所需的依赖项,并将应用程序复制到了 `/var/www` 目录中。我们还使用了 Composer 安装了应用程序的依赖项,并暴露了端口 `9501`。在启动容器时,我们使用了 `php bin/hyperf.php start` 命令来启动 Hyperf 应用程序。您可以根据实际情况修改 Dockerfile。 然后,使用以下命令构建 Docker 镜像: ``` docker build -t your-image-name . ``` 其中,`your-image-name` 是您的镜像名称。 2.2 创建 Kubernetes 部署文件 接下来,您需要创建 Kubernetes 的部署文件,该文件定义了如何部署 Hyperf 应用程序。示例部署文件如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: your-deployment-name labels: app: your-app-name spec: replicas: 3 selector: matchLabels: app: your-app-name template: metadata: labels: app: your-app-name spec: containers: - name: your-container-name image: your-image-name ports: - name: http containerPort: 9501 ``` 其中,您需要修改以下部分: - `your-deployment-name`:您的部署名称。 - `your-app-name`:您的应用程序名称。 - `your-container-name`:您的容器名称。 - `your-image-name`:您的 Docker 镜像名称。 该部署文件定义了一个名为 `your-deployment-name` 的部署,使用了名为 `your-image-name` 的 Docker 镜像,并将端口 `9501` 暴露出来。该部署文件还定义了应用程序的副本数为 `3`。 2.3 创建 Kubernetes 服务文件 接下来,您需要创建 Kubernetes 的服务文件,该文件定义了如何访问 Hyperf 应用程序。示例服务文件如下: ```yaml apiVersion: v1 kind: Service metadata: name: your-service-name spec: selector: app: your-app-name ports: - name: http port: 80 targetPort: http type: LoadBalancer ``` 其中,您需要修改以下部分: - `your-service-name`:您的服务名称。 - `your-app-name`:您的应用程序名称。 该服务文件定义了一个名为 `your-service-name` 的服务,使用了应用程序名称为 `your-app-name` 的部署。该服务将端口 `80` 映射到了端口 `9501`,并使用了负载均衡器。 2.4 部署应用程序 最后,使用以下命令部署应用程序: ``` kubectl apply -f your-deployment-file.yaml kubectl apply -f your-service-file.yaml ``` 其中,`your-deployment-file.yaml` 和 `your-service-file.yaml` 分别是您的部署文件和服务文件。 部署完成后,您可以使用以下命令查看服务的 IP 地址和端口号: ``` kubectl get services ``` 然后,您可以使用浏览器或其他工具访问 Hyperf 应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值