前序准备,有一台服务器 ,装好 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,
先不管他,这一步的目的,就是搞到代码。
回宿主机 测试一下:
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 , 或者直接重启一次。