二 【总结】docker-compose 安装 nginx mysql hyperf

1,040 阅读4分钟

前序准备,有一台服务器 ,装好 docker docker-compose

设置好容器镜像加速。

{
 "registry-mirrors": [ "https://08e4196a38000f410f9cc01eac8df7a0.mirror.swr.myhuaweicloud.com", "https://hub-mirror.c.163.com","https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn" ]
}

一 资源准备,拉取镜像

提前下好镜像,避免docker-compose up 时各种卡。

docker pull nginx:latest
docker pull redis:latest
docker pull hyperf/hyperf:8.0-alpine-v3.15-swoole
docker pull mysql:8.0.28

#安装后看一眼。
docker images
REPOSITORY      TAG                       IMAGE ID       CREATED         SIZE
hyperf/hyperf   8.0-alpine-v3.15-swoole   2139f47d3995   10 days ago     122MB
mysql           8.0.28                    f2ad9f23df82   14 months ago   521MB
redis           latest                    a617c1c92774   2 years ago     105MB
nginx           latest                    298ec0e28760   2 years ago     133MB

这里说一个原则 ,尽量在前期确保质量,步子小一点,单步可测。

到docker-compose 那一步,乱七八糟的东西其实挺多的,操作一次,如果出了问题,排查起来要到处找原因。

前面每步走得比较稳,到docker-compose 时,就不用太慌了。我在本次练手时,docker-compose 就是一次过的。

二 hyperf 代码准备。

参考官网文档 hyperf.wiki/3.0/#/zh-cn…

docker run --name hyperf \
-v /www/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 hyperf

mysql redis constant hyperf/async-queue相关的选一下 y ,其它的n .(随时需要随时再装 )

有可能碰到科学上网问题,等上大约10分钟。

装好后,启动服务。

cd hyperf
php bin/hyperf start 
# 如下图,由于redis ,mysql 都没配,这里不停打日志连不上redis,
先不管他,这一步的目的,就是搞到代码。

image.png

回宿主机 测试一下:

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

测完后干掉容器,代码留下,后续用docker-compose 创建。

docker stop hyperf
docker rm hyperf

在宿主机上 添加 .env 文件

vim /www/wwwroot/hyperf/.env

#redis 链接
REDIS_HOST= 172.18.0.3
REDIS_AUTH=(null)
REDIS_PORT=6379
REDIS_DB=1

#mysql
DB_DRIVER=mysql
DB_HOST=172.18.0.2
DB_PORT=3306
DB_DATABASE=api
DB_USERNAME=root
DB_PASSWORD=123456
DB_CHARSET=utf8mb4
DB_PREFIX=edu_

//这里的ip 于 docker-compose.yaml 内设置一至即可。

三 docker-compose 整备。

3.1 准备好相关目录,设好.env

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

vim /myproject/.env

NGINX_ROOT=/www/wwwroot
MYSQL_DATA_DIR=/data/mysql/data
HYPERF_DIR=/www/wwwroot/hyperf
MYSQL_DEFAULT_PASSWORD=123456
# 准备好各容器对应的网络。
IP_SUBNET=172.18.0.0/24
IP_NGINX=172.18.0.5
IP_REDIS=172.18.0.3
IP_MYSQL=172.18.0.2
IP_HYPERF=172.18.0.4

3.2 hyperf 的Dockerfile

vim /myproject/hyperf/Dockerfile

FROM  hyperf/hyperf:8.0-alpine-v3.15-swoole
WORKDIR  /data/project
ENTRYPOINT ["php", "/data/project/hyperf/bin/hyperf.php", "start"]
# 9501 hyperf 服务,9500 用于swagger 
EXPOSE 9501 9500

开发时,会将ENTRYPOINT 改为 watch 模式,(后续文章中有会提到处理处理) 今天就搭个基础环境。

3.3 nginx 配置

cd /myproject/nginx

vim nginx.conf

user  root;
worker_processes  4;

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;
}

vim conf.d/hyperf.conf

server {
      listen 80;

      access_log  /var/log/nginx/hyperf-access.log;
      error_log   /var/log/nginx/hyperf_error.log;


      location / {
      
                # 放开跨域限制。
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Allow-Headers 'DNT,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization';
                if ($request_method = 'OPTIONS') { return 204; }

      
                proxy_pass http://172.18.0.4: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 docker-compose.yaml

version: "3"
networks:
  xuxing:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "${IP_SUBNET}"
services:
  nginx:
    image: nginx:latest
    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: mysql:8.0.28
    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: redis:latest
    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/hyperf:rw

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

四 启动服务,测试。

docker-compose up -d

测试一下 (容器,是否正常)

docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED              STATUS              PORTS                                                                      NAMES
6d2fe4f25563   myproject-hyperf   "php /data/project/h…"   About a minute ago   Up About a minute   0.0.0.0:9501->9501/tcp, :::9501->9501/tcp                                  hyperf
37a5728f23c7   mysql:8.0.28       "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                       mysql
84bbb9201df2   nginx:latest       "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx
24c24387230c   redis:latest       "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                  redis


curl 127.0.0.1
{"method":"GET","message":"Hello Hyperf."}

五 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 '123456'; 
grant all privileges on *.* to root@'%'; 
flush privileges;

六 hyperf watch .

由于是cli 模式,有个痛点,每改一行代码,想运行要重启一下hyperf

//安装
composer require hyperf/watcher --dev

//发布
php bin/hyperf.php vendor:publish hyperf/watcher

//改Dockerfile 的ENTRYPOINT
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", "server:watch"]
EXPOSE 9501

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


注意

1 删除文件和修改.env需要手动重启才能生效。

2 vendor 中文件变更后 composer dump-autoload -o , 或者直接重启一次。