简述,使用docker-compose 安装 ,受科学上网问题,镜像下载至私仓
1 资源准备。
- 服务器一台,学习专用。安装好centos docker docker-compose
- git 仓库.(受限github 的科学上网问题,直接用了华为的codehub) 依次创建
- 后端接口,
- 前端 pc
- 前端手机端
- 运营后台
- 将指定域名指向服务器。(我为了图方便,直接*.xxx.com )指过去了
2 镜像拉取。 (请自行解决好科学上网问题)
- redis,nginx 无脑装最新即可。不好用了随时换。
docker pull redis:latest
docker pull nginx:latest
- 关于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年多了,应该很稳。
- 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 ,推至我的私仓。 (科学上网始终是件头痛的事。)
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
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 总结一下。
至此 完成目标
-
安装nginx ,redis,mysql ,hyperf 环境 (php+ swoole)
-
代码初始化完成,并使用git 进行有效管理 。
-
域名指向完成. 环境基本redis ,可以直接开写后端代码并测试接口了。