近期有项目用到 hyperf-admin, 顺便学习记录一下基于官方的镜像开始构建到部署过程

👉 hyperf官方地址

安装&配置

由于官方默认是在Linux执行的, 但实际我是在Win10下的 git-bash 终端执行, 所以命令稍微有点不一样, 比如指定项目路径的方式和不需要指定终端为 /bin/sh

# 官方镜像
winpty docker run -v "D:\phpstudy\WWW\online-chat:/hyperf" -p 9501:9501 -it hyperf/hyperf:7.4-alpine-v3.11-swoole

# 官方镜像重制后的镜像
winpty docker run -v "D:\phpstudy\WWW\online-chat:/hyperf" -p 9501:9501 -it chuchuzz426/hyperf:1.0 bash

执行完后进入容器内执行

#安装应用
apk add vim wget tzdata

#修改时区为上海东八区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

#输出时间查看
date

#修改配置文件
vim ~/.bashrc

#修改PS1
export PS1='\[\033]0;Bash\007\]\n\[\033[32;1m\] ➜ \[\033[33;1m\]\W\[\033[34;1m\] [\t] \[\033[36m\]'

#添加alias
alias e='exit'
alias www='cd /hyperf'
alias ll='ls -al'
alias vp='vim ~/.bashrc'
alias sp='source ~/.bashrc'

#保存后执行
source ~/.bashrc

由于 Docker 容器默认是以非交互式且不登录的情况进入容器的, 我们需要以交互式的情况进入

# 以 sh 方式启动 则需要在后面添加 -il 参数, 表示以交互式并且模拟登录的情况进入容器, 只有模拟登陆才会初始化执行 ~/.bashrc
winpty docker exec -it e61fb6c63c38 sh -il

# 以 bash 方式启动, 会默认初始化执行 ~/.bashrc文件
winpty docker exec -it e61fb6c63c38 bash

启动hyperf

# 进入hyperf目录
cd /hyperf

# 将 Composer 镜像设置为阿里云镜像,加速国内下载速度
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

# 由于项目已经从github拉取下来 所以无需执行安装hyperf命令, 只需要执行composer update 获取依赖
composer update

# 启动 Hyperf
php bin/hyperf.php start

# 浏览器输入http://127.0.0.1:9501访问
http://127.0.0.1:9501

Linux shell 配置文件关系表

附带上文为什么修改 ~/.bashrc 原因, 因为想要在容器内定义一些alias命令, 而容器默认是非登录进入的, 所以说明一下初始化时读取的是哪个配置文件

文件 位置 作用和描述
~/.profile 用户主目录 ($HOME) 用户登录时执行的个人配置文件。通常在登录时执行一次,用于设置用户环境变量和执行用户的个人配置。
~/.bashrc 用户主目录 ($HOME) 非登录的 Bash shell 启动时执行的个人配置文件。用于设置 Bash shell 的特定配置,如别名、自定义函数等。
~/.bash_profile 用户主目录 ($HOME) 用户登录时执行的个人配置文件。如果存在该文件,则通常会覆盖 ~/.profile。用于设置用户环境变量和执行用户的个人配置。
/etc/profile /etc/ 目录 系统级别的 Bash shell 配置文件。在系统启动时,用于设置全局环境变量和执行系统范围的配置。用户登录时也会执行一次。

把容器制作为镜像并导出为tar

为了把修改过的容器方便在其他机器上使用, 打包制作成镜像

#容器制作为镜像
docker commit e61fb6c63c38 chuchuzz426/hyperf:1.0

#镜像导出为tar文件
docker save -o my-hyperf-image.tar chuchuzz426/hyperf:1.0

制作docker-compose.yml启动

为了省去配置命令的麻烦和方便后续扩展, 添加docker-compose.yml文件

version: '3'

x-project-settings: &project-settings
  project_name: hyperf-app

services:
  hyperf-app:
    image: chuchuzz426/hyperf:1.0
    container_name: hyperf
    ports:
      - "9501:9501"
      - "9502:9502"
      - "9503:9503"
    volumes:
      - D:\phpstudy\WWW\online-chat:/hyperf
    working_dir: /hyperf/hyperf
    # command: ["php", "bin/hyperf.php", "start"]
    # 先执行一遍composer install
    command:
      - /bin/sh
      - -c
      - "composer install && php bin/hyperf.php start"

接下来就是 原神⭕🗽 hyperf, 启动!

docker-compose up -d

# 如果不是首次执行的话, 避免缓存问题最好执行这条
docker-compose build --no-cache && docker-compose up -d

DB与redis连接配置

  1. 修改.env配置, 连接宿主机mysql, 先在宿主机执行 ipconfig 查看 WSL 的IPv4地址, 比如我的是172.21.240.1, 则 env配置文件的DB_HOST填写的就是172.21.240.1
  1. 如果mysql拒绝连接, 则修改一下mysql的用户授权
#用户授权,记得换成对应的库名和用户名及密码
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'%' IDENTIFIED BY 'your_password';

#刷新权限
FLUSH PRIVILEGES;
  1. redis连接宿主机同上, 记得确保 Redis 服务器的配置允许远程连接, 修改 redis.conf
#只允许本地和 172.21.240.1 连接
bind 127.0.0.1 172.21.240.1

#允许任何ip连接, 不推荐,特别是在生产服务器上或者没设置密码的
bind 0.0.0.0

server配置

在config/autoload/server.php的 server 配置如下, 端口具体根据实际情况修改

'servers' => [
    [
        'name' => 'http',
        'type' => Server::SERVER_HTTP,
        'host' => '0.0.0.0',
        'port' => 9502,
        'sock_type' => SWOOLE_SOCK_TCP,
        'callbacks' => [
            Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
        ],
    ],
    [
        'name' => 'ws',
        'type' => Server::SERVER_WEBSOCKET,
        'host' => '0.0.0.0',
        'port' => 9503,
        'sock_type' => SWOOLE_SOCK_TCP,
        'callbacks' => [
            Event::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'],
            Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
            Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
        ],
    ],
],

VUE

安装

# 环境依赖
# 1.  node ^v11.2.0 https://nodejs.org/zh-cn/download/
# 2.  npm ^6.4.1
git clone https://github.com/hyperf-admin/hyperf-admin-frontend.git vue-admin
cd vue-admin
npm i
npm run dev
# 打包
npm run build:prod
npm run build:test

vue.config.js配置

主要留意 module.exports 模块里的 devServerproxy 配置要和hyperf对应上

module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  publicPath: '/',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:9502',  // 后台接口地址
        ws: 'ws://127.0.0.1:9503',        //如果要代理 websockets,配置这个参数
        secure: false,  // 如果是https接口,需要配置这个参数
        changeOrigin: true,  //是否跨域
        pathRewrite:{	// 重写路径
          '^/api':''
        }
      }
    },
    // before: require('./mock/mock-server.js')
  },
  ...

生产环境

留意 .env.production文件配置的 VUE_APP_BASE_API 域名改为线上域名