1、安装docker客户端
开启Hyper-V
一、启用Hyper-V
打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图:
1513668234-6433-20171206211858191-1177002365.png下载windwos版本docker安装包 地址
如下图
启动docker.exe可能回报没有可用的linux系统或者wsl需要更新。
第一种情况处理办法:在 Microsoft Store 获取linux,这里我获取的是 ubuntu
image.png
第二种情况处理办法:下载wsl更新包,然后运行 wsl更新包
修改docker 镜像仓库
安装好后登陆docker(没有账号的请到官网进行注册)
image.png
使用git快速获取lnmp
windows上推荐使用cmder来代替cmd
cmdercmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令。
后面的步骤和在mac上的一样。毕竟docker是跨系统的,真香。
切换到你准备安装dnmp的目录下
$ git clone https://github.com/shmilylbelva/dnmp.git //建议使用https://github.com/yeszao/dnmp版本,功能更强大
$ cd dnmp
$ docker-compose up
即开始安装资源,如下图
image.png
完成以后可以在浏览器中访问localhost,出现以下界面代表ok。
出现
SQLSTATE[HY000] [1130] Host '172.19.0.2' is not allowed to connect to this MySQL server
mysql提示,是因为目前使用mysql-server 8.0.28以上的版本,php版本需要7.4.7以上才能连接,所以需要修改yal文件php版本为7.4.7以上,然后重新build
$ docker stop php # 第一步:停止容器
$ docker rm php # 第二步:删除容器
$ docker-compose up -d --no-deps --build php # 第三步:重新启动容器
其中最后一条命令参数作用:
-d:后台执行
--no-deps:不启动link的容器
--build:启动容器前先构建镜像
设置mysql远程可访问
新开一个终端进入mysql容器
docker ps //查看容器
docker exe -it mysql /bin/bash // 进入容器
mysql //进入mysql终端,应为初始mysql没有密码,所以直接能够进入
update mysql.user set host = '%' where user = 'root';//修改远程可访问
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';//修改密码为123456
FLUSH PRIVILEGES;//生效
刷新浏览器后,mysql连接成功
image.png
说明,连接MySQL这要分两种情况,
第一种情况,在PHP代码中
。
// 连接MySQL
$dbh = new PDO('mysql:host=mysql;dbname=mysql', 'root', '123456');
// 连接Redis
$redis = new Redis();
$redis->connect('redis', 6379);
因为容器与容器是expose
端口联通的,而且在同一个networks
下,所以连接的host
参数直接用容器名称,port
参数就是容器内部的端口。更多请参考《docker-compose ports和expose的区别》。
第二种情况,在主机中
通过命令行
或者Navicat
等工具连接。主机要连接mysql和redis的话,要求容器必须经过ports
把端口映射到主机了。以 mysql 为例,docker-compose.yml
文件中有这样的ports
配置:3306:3306
,就是主机的3306和容器的3306端口形成了映射,所以我们可以这样连接:
$ mysql -h127.0.0.1 -uroot -p123456 -P3306
$ redis-cli -h127.0.0.1
这里host
参数不能用localhost是因为它默认是通过sock文件与mysql通信,而容器与主机文件系统已经隔离,所以需要通过TCP方式连接,所以需要指定IP。
dnmp目录结构
/
├── data 数据库数据目录
│ ├── esdata ElasticSearch 数据目录
│ ├── mongo MongoDB 数据目录
│ ├── mysql MySQL8 数据目录
│ └── mysql5 MySQL5 数据目录
├── services 服务构建文件和配置文件目录
│ ├── elasticsearch ElasticSearch 配置文件目录
│ ├── mysql MySQL8 配置文件目录
│ ├── mysql5 MySQL5 配置文件目录
│ ├── nginx Nginx 配置文件目录
│ ├── php PHP5.6 - PHP7.4 配置目录
│ ├── php54 PHP5.4 配置目录
│ └── redis Redis 配置目录
├── logs 日志目录
├── docker-compose.sample.yml Docker 服务配置示例文件
├── env.smaple 环境配置示例文件
└── www PHP 代码目录
启动hyperf
docker exe -it php /bin/sh // 进入容器
cd HAdmin
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ //配置阿里云镜像
install-php-extensions redis 安装php扩展swoole和redis
install-php-extensions swoole
composer install //安装composer包
php bin/hyperf.php start //启动hyperf
image.png
image.png
修改php.ini 末尾添加swoole.use_shortname=Off
,否则启动hyperf会报错
重新启动
php bin/hyperf.php start
image.png
配置nginx
因为我是本地win上搭建的docker,这里地址需要填写虚拟机的php容器地址
docker exec -it php /bin/sh
image.png
upstream hyperf_websocket {
server 172.18.0.5:9504;//虚拟机的php容器地址
}
server {
listen 80;
server_name www.hadmin.dev;//设置的本地hosts域名
root /www/HAdmin;
index index.php index.html index.htm;
#charset koi8-r;
// http部分
location / {
client_max_body_size 20m;
# 将客户端的 Host 和 IP 信息一并转发到对应节点
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 转发Cookie,设置 SameSite
proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";
# 执行代理访问真实服务器
proxy_pass http://172.18.0.5:9501;
}
//socket部分
location /wss {
# WebSocket Header
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection "Upgrade";
# 将客户端的 Host 和 IP 信息一并转发到对应节点
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# 客户端与服务端无交互 60s 后自动断开连接,请根据实际业务场景设置
proxy_read_timeout 60s ;
# 执行代理访问真实服务器
proxy_pass http://hyperf_websocket;
}
// 以下的不用
access_log /dev/null;
#access_log /var/log/nginx/nginx.localhost.access.log main;
error_log /var/log/nginx/nginx.localhost.error.log warn;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ [^/]\.php(/|$) {
fastcgi_pass php:9000;
include fastcgi-php.conf;
include fastcgi_params;
}
}
前端请求ws服务,需要填写该地址
ws://socket.tik-im.com/wss/default.io
因为Hadmin设置的ws服务路由规则为wss/default.io
网友评论