二 【实战】环境准备. (nginx+mysql +hyperf )

717 阅读3分钟

简述,使用docker-compose 安装 ,受科学上网问题,镜像下载至私仓

1 资源准备。

  1. 服务器一台,学习专用。安装好centos docker docker-compose
  2. git 仓库.(受限github 的科学上网问题,直接用了华为的codehub) 依次创建
    1. 后端接口,
    2. 前端 pc
    3. 前端手机端
    4. 运营后台
  3. 将指定域名指向服务器。(我为了图方便,直接*.xxx.com )指过去了

2 镜像拉取。 (请自行解决好科学上网问题)

  1. redis,nginx 无脑装最新即可。不好用了随时换。
docker pull redis:latest
docker pull nginx:latest
  1. 关于mysql ,计划用8. 非生产用,选项不用太严格,当前是8.0.33 向前推3-4 个版本,选了个8.0.28 网上一查,也没啥大问题。
docker pull mysql:8.0.28
 docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        latest    8e69fcb59ff4   7 days ago      130MB
nginx        latest    eb4a57159180   8 days ago      187MB
mysql        8.0.28    f2ad9f23df82   14 months ago   521MB
# 14个月,1年多了,应该很稳。
  1. hyperf hyperf.wiki/3.0/#/zh-cn…
docker run --name hyperf \ -v /data/wwwroot:/data/project \ -p 9501:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \ hyperf/hyperf:8.0-alpine-v3.15-swoole

cd /data/project
composer create-project hyperf/hyperf-skeleton  api  
# 一堆选择,我就选了redis,mysql ,simple queue ,model-cache 这前要用的,后期有需求再了再加

cd api 
php bin/hyperf.php start

测一把

curl 127.0.0.1:9501  
{"method":"GET","message":"Hello Hyperf."}
docker logs hyperf

[ERROR] RedisException: Connection refused in /data/project/api/vendor/hyperf/redis/src/RedisConnection.php:299
....

连不上redis ,mysql 估计 也连不上 ,这个正常后续docker-compose 时一并处理。现在确保hyperf 能启动即可。 将项目代码,推至仓库 后端接口

至此,镜像准备就绪, hyperf 代码准备就绪 。

docker images
REPOSITORY      TAG                       IMAGE ID       CREATED         SIZE
hyperf/hyperf   8.0-alpine-v3.15-swoole   2139f47d3995   5 days ago      122MB
redis           latest                    8e69fcb59ff4   7 days ago      130MB
nginx           latest                    eb4a57159180   8 days ago      187MB
mysql           8.0.28                    f2ad9f23df82   14 months ago   521MB

为了后续部署时方便,将这些镜像生新打tag ,推至我的私仓。 (科学上网始终是件头痛的事。)

image.png

3 容器部署

3.1 目录创建

mkdir /myproject && \
mkdir -p /myproject/nginx/conf.d  && \
mkdir -p /myproject/hyperf

3.2 配置 hyperf Dockerfile

/myproject/hyperf/Dockerfile

FROM  swr.cn-south-1.myhuaweicloud.com/docker-study/hyperf:1.0
WORKDIR  /data/project
ENTRYPOINT ["php", "/data/project/api.xuxing.tech/bin/hyperf.php", "start"]
EXPOSE 9501 9500

3.3 nginx 配置文件

/myproject/nginx/nginx.conf


user  root;
worker_processes  6;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

     gzip_disable "MSIE [1-6].";
     include /etc/nginx/conf.d/*.conf;

    sendfile        on;
}

/myproject/nginx/conf.d/api.conf

server {
      listen 80;
      server_name  api.xxx.com;
      access_log  /var/log/nginx/hyperf-access.log;
      error_log   /var/log/nginx/hyperf_error.log;

      location / {
        	proxy_pass http://172.18.0.84:9501;
        	proxy_http_version 1.1;
        	proxy_set_header Upgrade $http_upgrade;
        	proxy_set_header Connection 'upgrade';
        	proxy_set_header Host $host;
        	proxy_set_header X-Real-IP $remote_addr ;
        	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
        	proxy_set_header X-Forwarded-Proto https;
        	proxy_cache_bypass $http_upgrade;
    	}
 }

3.4 /myproject/.env

docker-compose 用的环境变量。

NGINX_ROOT=/www/wwwroot
MYSQL_DATA_DIR=/data/mysql/data
HYPERF_DIR=/www/wwwroot/api.xuxing.tech
MYSQL_DEFAULT_PASSWORD=123456
IP_SUBNET=172.18.0.0/24
IP_NGINX=172.18.0.81
IP_REDIS=172.18.0.82
IP_MYSQL=172.18.0.83
IP_HYPERF=172.18.0.84

3.5 /myproject/docker-compose.yaml

version: "3"
networks:
  xuxing:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "${IP_SUBNET}"
services:
  nginx:
    image: swr.cn-south-1.myhuaweicloud.com/docker-study/nginx:1.0
    ports:
      - 80:80
      - 443:443
    volumes:
      - ${NGINX_ROOT}:/www/wwwroot
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./logs:/var/log/nginx
    restart: always
    container_name: nginx
    networks:
      xuxing:
        ipv4_address: ${IP_NGINX}
  mysql:
    image: swr.cn-south-1.myhuaweicloud.com/docker-study/mysql:1.0
    ports:
      - "3306:3306"
    volumes:
      - ${MYSQL_DATA_DIR}:/var/lib/mysql
    restart: always
    container_name: mysql
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=${MYSQL_DEFAULT_PASSWORD}
    networks:
      xuxing:
        ipv4_address: ${IP_MYSQL}
  redis:
    image: swr.cn-south-1.myhuaweicloud.com/docker-study/redis:1.0
    ports:
      - "6379:6379"
    restart: always
    container_name: redis
    networks:
      xuxing:
        ipv4_address: ${IP_REDIS}
  hyperf:
    build:
      context: ./hyperf/
    privileged: true
    user: root
    container_name: hyperf
    restart: always
    volumes:
      - ${HYPERF_DIR}:/data/project/api.xuxing.tech:rw

    ports:
      - "9501:9501"
    stdin_open: true
    tty: true
    networks:
      xuxing:
        ipv4_address:  ${IP_HYPERF}

3.6 启动服务,测试

docker-compose up -d

测一下: curl 127.0.0.1 docker logs hyperf 没有连不上redis 的报错。 浏览器访问 api.xxx.com

image.png

4 mysql 建库,加个外部用户。

再次提醒 ,本项目学习演示为主,生产时注意安全。

docker exec -it mysql mysql -uroot -p123456;
CREATE DATABASE api default character set utf8mb4 collate utf8mb4_general_ci;
create USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'docker@Demo123'; 
grant all privileges on *.* to root@'%';
flush privileges;

用工具连一下测,ok.

5 hyperf 热重载。

5.1 进入容器,


//安装 composer require hyperf/watcher --dev 
//发布 php bin/hyperf.php vendor:publish hyperf/watcher 

5.2 改Dockerfile entrypoint

 ENTRYPOINT ["php", "/data/project/api.xuxing.tech/bin/hyperf.php", "server:watch"] 
 EXPOSE 9501 9500 //记得

将原有的docker-compose up 中build 的镜像删掉。

重新docker-compose up -d

5 总结一下。

至此 完成目标

  1. 安装nginx ,redis,mysql ,hyperf 环境 (php+ swoole)

  2. 代码初始化完成,并使用git 进行有效管理 。

  3. 域名指向完成. 环境基本redis ,可以直接开写后端代码并测试接口了。