win10中 hyper-v 中搭建 docker 快速搭建一个thinkphp6 的项目 swoole 环境 websocket 示例代码

这篇具有很好参考价值的文章主要介绍了win10中 hyper-v 中搭建 docker 快速搭建一个thinkphp6 的项目 swoole 环境 websocket 示例代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 先安装docker  和docker-composer 

  1.1安装docker 直接使用快捷一键安装

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

  1.2等待一分钟docker安装完成启动docker 

$ sudo systemctl enable docker
$ sudo systemctl start docker

   1.3 测试docker 安装 和镜像加速

   直接参考文章安装和调试  CentOS 安装 Docker | Docker 从入门到实践

2.安装php 运行环境

  2.1   选用最简单 的拥有 php-fpm 和 nginx 的 镜像 webdevops/php-nginx   webdevops/php-nginx — Dockerfile Documentation documentation  直接使用 docker pull 拉取最新镜像 

docker pull webdevops/php-nginx 

  2.2 拉完了之后docker images  查看镜像文件是否成功

docker images 

  显示如下就说明pull 下来了docker thinkphp,docker,php,swoole,nginx

 

2.3 运行下webdevops/php-nginx的镜像文件 

docker run -itd --name php-ngins-thinkphp6 -p 89:80 -v /home/guyi/www/thinkphp6/:/app/ webdevops/php-nginx  

-itd    交互终端方式打开具体参数解读可阅读该篇文章 docker run参数详解_docker run 参数详解_日日行不惧千万里的博客-CSDN博客

--name  给容器取一个名字

-p    89 :就是虚拟机可以访问的端口(后面 ip:89 就可以访问)   80是容器里面的80端口 

-v    /home/guyi/www/thinkphp6/ 虚拟机目录映射的目录(指向放项目的目录即可)     /app/ 虚拟机          的容器路径。 还可增加 配置文件目录 修改配置文件的时候就无须进入容器修改:   -v  nginx 的        配置目录/conf.d : /opt/docker/etc/nginx/conf.d    其他挂载配置路径看下表

容器内php 配置文件路径     

File/Directory Description
/opt/docker/etc/php/php.webdevops.ini PHP settings from WebDevOps image
/opt/docker/etc/php/php.ini ​ php.ini for custom settings
/opt/docker/etc/php/fpm/php-fpm.conf PHP-FPM main configuration file
/opt/docker/etc/php/fpm/pool.d/application.conf Application PHP-FPM pool configuration file
/opt/docker/etc/supervisor.d/php-fpm.conf Supervisord configuration file for PHP-FPM

 容器内nginx 配置路径

File/Directory Description
/opt/docker/etc/nginx/conf.d 

Main global configuration directory

(automatically included files)

/opt/docker/etc/nginx/conf.d/10-php.conf PHP cgi configuration
/opt/docker/etc/nginx/ssl

SSL configuration directory for

certifications and keys

/opt/docker/etc/nginx/ssl/server.crt  Example SSL certification (*.vm)
/opt/docker/etc/nginx/ssl/server.csr  Example SSL certification request (*.vm)
/opt/docker/etc/nginx/ssl/server.key  Example SSL key (​.vm)
/opt/docker/etc/nginx/vhost.common.d 

Vhost configuration directory

(automatically included files)

/opt/docker/etc/nginx/vhost.common.d/10-location-root.conf Redirect requests to DOCUMENT_INDEX
/opt/docker/etc/nginx/vhost.common.d/10-php.conf PHP cgi configuration for vhost
/opt/docker/etc/nginx/global.conf Global nginx configuration
/opt/docker/etc/nginx/main.conf Main Nginx configuration
/opt/docker/etc/nginx/php.conf Deprecated PHP configuration
/opt/docker/etc/nginx/vhost.common.conf Deprecated vhost common include
/opt/docker/etc/nginx/vhost.conf Vhost configuration
/opt/docker/etc/nginx/vhost.ssl.conf Vhost SSL configuration
/opt/docker/etc/supervisor.d/nginx.conf Supervisord configuration file for Nginx

webdevops/php-nginx   镜像名字

2.4  运行后 访问虚拟机ip:89    访问192.168.199.1:89  或者 直接curl  ip:89  出现centos 的欢迎页面即可 。到此环境搭建好了。

3. 安装 thinkphp6  框架    可选择 直接下载源码放到  run 挂载的目录下 docker thinkphp,docker,php,swoole,nginx

 或者 cd /home/guyi/www/thinkphp6 下 直接用官网的composer 安装 tp6框架

composer create-project topthink/think thinkphp6

4.项目搭建好后需要在nginx 配置文件中修改入口目录 

  4.1 挂载过 /opt/docker/etc/nginx/vhost.conf  直接在虚拟机对应目录修改即可

  4.2运行时run  没有 -v 挂载的直接 进入容器修改

 docker ps  //查看虚拟机的容器id 或者名字

docker exec -it 78b4726227a1 /bin/bash      //进入容器的命令  78b4726227a1 容器的id

docker thinkphp,docker,php,swoole,nginx

vim /opt/docker/etc/nginx/vhost.conf   //修改vhost.conf

server {
    listen 80 default_server;

    server_name  _ *.vm docker;

    root "/app/public";
    index index.php;
 # 隐藏 index.php 以及使得Nginx支持pathinfo模式
    if (!-e $request_filename) {
        rewrite ^/index.php(.*)$ /index.php?s=$1 last;
        rewrite ^(.*)$ /index.php?s=$1 last;
    }

    include /opt/docker/etc/nginx/vhost.common.d/*.conf;
}

##############
# SSL
##############

server {
    listen 443 default_server;

    server_name  _ *.vm docker;

    root "/app/public";
    index index.php;

    include /opt/docker/etc/nginx/vhost.common.d/*.conf;
    include /opt/docker/etc/nginx/vhost.ssl.conf;
}

进入后  按 i  进入插入模式 将配置文件放入  按esc    输入 :wq! 

docker thinkphp,docker,php,swoole,nginx

 然后 exit 退出容器 重启下nigix  docker restart  78b4726227a1

重启后访问 ip:89 出现tp6欢迎页面 至此 tp6搭建完成

5.安装swoole 最简单的方式实现

  5.1  拉取swoole 镜像 版本可自行配置 

     docker pull phpswoole/swoole:4.6.2-php7.3

  5.2 测试镜像环境:

 docker run --rm phpswoole/swoole:4.6.2-php7.3 "php -m"

 docker run --rm phpswoole/swoole:4.6.2-php7.3 "php --ri swoole"

 

 docker run --rm phpswoole/swoole:4.6.2-php7.3 "composer --version

5.3 建一个websocket 启动方法 更多方法查看git或者官方文档:

swoole-src: Coroutine-based concurrency library for PHP - Gitee.comj

创建一个server.php  放到你指定的swoole的虚拟机目录 

<?php
 
# /usr/local/swoole//server.php  路径由自己指定 启动容器的时候会用
 
declare(strict_types=1);
$server = new swoole_websocket_server("0.0.0.0",9502);
 
$server->on('open',function(swoole_websocket_server $server,$request){
    echo "server: handshake success with fd{$request->fd}\n";
});
 
$server->on('message',function(swoole_websocket_server $server,$frame){
   echo "receive from {$frame->fd}:{$frame->data}";
   echo "opcode:{$frame->opcode}";
   echo "fin: {$frame->finish}\n";
  // $server->push($frame->fd,"this is a server");
  foreach ($server->connections as $fd) {
        // 需要先判断是否是正确的websocket连接,否则有可能会push失败
        if ($server->isEstablished($fd)) {
            $server->push($fd, $frame->data);
        }
    }
});
 
$server->on('close',function($ser,$fd){
   echo "client {$fd} closed\n";
});
 
$server->start();

5.4 启动swoole容器 

docker run --rm -p 9502:9502 --name swoole -v /usr/local/swoole/:/var/www phpswoole/swoole:4.6.2-php7.3

/usr/local/swoole/ 就是你刚刚创建的 server.php 的虚拟机目录 

5.5测试访问:

curl http://127.0.0.1:9502

容器启动后会尝试执行 php server.php 命令启动服务,所以无需手动进入容器执行,出现问题请进入容器目录 执行 php server.php 命令; 到此swoole 运行成功了。

网上copy 了段弹幕代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
 
<style type="text/css">
 
*{
    margin: 0;
    padding: 0;
}
 
 
#navBar{
    width: 50%;
    height: 400px;
    padding-bottom:40px;
    border: 1px solid #000;
    margin: 5% auto 0;
    position: relative;
    background: #ccc;
}
 
#navBar #video{
    width:100%;
    height:100%;
    background:#fcfcfc;
    text-align:center;
}
 
#navBar .dm_tool{
    width: 100%;
    height: 40px;
    background: #ccc;
    margin-top:1px;
    bottom: 0;
    display: flex;
}
 
#navBar .dm_tool .dm_con{
    width: 89%;
    height: 38px;
    outline: none;
    border: 1px solid #ccc;
    padding-left: 10px;
    float: left;    
}
 
#navBar .dm_tool .sendToDm{
    width: 9.7%;
    background: limegreen;
    color: white;
    outline: none;
    border: 0;    
    cursor:pointer;
}
 
#navBar .dmArea{
    width:100%;
    height:400px;
    top:0;
    left:0;
    position:absolute;
    z-index:10;
    overflow:hidden;
}
 
#navBar .dmArea span{
    white-space:nowrap;
    position:absolute;
}
</style>
 
<body>
 
<div id="navBar">
    <div id="video"><span style="position:absolute;top:45%;left:45%;">假装在播放视频</span></div>
    <div class="dm_tool">
        <input type="text" placeholder="say something..." name="dm_con" class="dm_con" />
        <button class="sendToDm">发一弹</button>
    </div>
    <div class="dmArea">
        <!--span>假装在播放视频 假装在播放视频 </span-->
    </div>
</div>
 
 
</body>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
<script type="text/javascript">
 
var DmClass = {
    "Dm_H":0, //弹幕区域高度
    "Dm_W":0,//弹幕区域宽度
    "DmObj":"",//弹幕区对象
 
    //初始化方法
    init :     function(){
        var _this  = this;
 
        _this.DmObj = $(".dmArea");
        _this.Dm_H = _this.DmObj.height();
        _this.Dm_W = _this.DmObj.width();
 
        //发送弹幕方法
        _this.sendToDmFunc();
    },
 
    sendToDmFunc    :        function(){
        var _this = this;
        
        $(".sendToDm").click(function(){
 
 
            var sendCon = $('input[name="dm_con"]').val();
            if($.trim(sendCon) == "") {
                var testList = ["hello world!","你好","视频真好看","吹牛我就服你!!","哈哈哈"];
                var _s = Math.floor(Math.random()*5);
                sendCon = testList[_s];
                //return false;
            }
 
            //json 数据格式
            var sData = '{"data":"'+sendCon+'"}';
            //发送到sockey服务器
            SocketClass.websocket.send(sData);
 
 
 
        });
    },
 
    //往弹幕区域添加从服务器广播过来的弹幕数据
    addToDm    :    function(rdata){
        var _this = this;
 
        //json转对象
        var newObj = eval('(' + rdata + ')');
 
        //定义新的弹幕对象
        var newDom = $("<span></span>");
 
        //随机取一个位置
        var p = _this.randPosition();
 
        //放入弹幕内容
        newDom.html(newObj.data);
        _this.DmObj.append(newDom);
 
        //设置初始位置为弹幕区的最右边
        newDom.css({"left":_this.Dm_W+"px","top":p+"px"});
 
 
        //当前单条弹幕位置
        var tR = _this.Dm_W;
        //定时器 20毫秒执行一次
        var newTimer = setInterval(function(){
 
            tR -= 2;
 
            //当弹幕走出弹幕区将之删除,并清除当前的定时器
            if(tR <= -newDom.width()){
                newDom.remove();
                clearInterval(newTimer);
            }
            //新位置
            newDom.css("left",tR+"px");
        },20);
 
    },
 
    //随机获取位置
    randPosition    :    function(){
        var _this = this;
        var rn = Math.floor(Math.random()*(_this.Dm_H - 20));
        return rn;
    },
 
}
 
//sockey 服务
var SocketClass = {
    "wsServer":"ws://ip地址:9502", //服务地址
    "websocket":"", //socket 对象
    init     :    function(){
        var _this = this;
 
        //连接docket
        _this.socketServerInit();
    },
 
    socketServerInit    :    function(){
        var _this = this;
        _this.websocket = new WebSocket(_this.wsServer);
 
        //连接上socket
        _this.websocket.onopen = function (evt) {
            alert("socket server connected");
            console.log("Connected to WebSocket server.");
        };
 
        //socket 服务器关闭
        /*_this.websocket.onclose = function (evt) {
            alert("socket server closed");
            console.log("Disconnected");
        };*/
 
        //接收socket服务器的广播数据
        _this.websocket.onmessage = function (evt) {
            console.log('Retrieved data from server: ' + evt.data);
 
            //将接收到的弹幕数据调用addToDm方法 添加到弹幕区域
            DmClass.addToDm(evt.data);
        };
 
        //连接错误
        _this.websocket.onerror = function (evt, e) {
            console.log('Error occured: ' + evt.data);
        };
    },
 
 
}
 
//初始执行方法
$(function(){
    DmClass.init();
    SocketClass.init();
});
 
 
</script>
</html>文章来源地址https://www.toymoban.com/news/detail-754294.html

到了这里,关于win10中 hyper-v 中搭建 docker 快速搭建一个thinkphp6 的项目 swoole 环境 websocket 示例代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Win10家庭版 找不到Hyper-V的解决办法,亲测可行

    安装虚拟机VMware Workstation Pro16的时候,发现找不到hyper-v功能选项。window10家庭版发现无法找到hyper-v功能选项,其实这是window自动隐藏该功能,下面讲一下怎么开启hyper-v。 1、首先打开控制面板,选择: 程序 2、选择: 启用或关闭Windows功能 3、点击Hyper-V进行关闭或打开 1、在

    2024年02月11日
    浏览(79)
  • Hyper-V 安装 win10 失败, 提示 SCSI DVD (0,0)The boot loader failed

    因为关于此类的报错内容并给出解决办法的博客,均没有解决我的问题,于是我在此记录下来,已帮助后续遇到该问题的互联网朋友。 当反复出现上述报错,并且调整 BIOS 启动顺序(CD 优先)仍不能解决上述问题时,选择 虚拟机代数为第一代即可,(即便你有 UEFI安全启动的

    2024年02月16日
    浏览(81)
  • Win11系统怎么关闭hyper-v虚拟机?

    hyper-v是一款受大家欢迎的虚拟化产品,允许用户使用内置的系统工具创建虚拟机等,但是有一些win11用户在使用之后又不想用了,想要将其关闭但是不知道具体的操作。其实关闭虚拟机的方法有很多,下面就来一起看看。 方法一:通过CMD禁用 1、按 Windows + S 键打开 搜索栏,

    2024年02月02日
    浏览(44)
  • virtualBox解决不能为虚拟电脑 AR_Base 打开一个新任务. Raw-mode is unavailable courtesy of Hyper-V. win11亲测有用。

    数值意义如下: 找到“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNetworkSetup2Interfaces”下,将文件夹一个一个展开,找到如图所示一个文件夹,这就是“Virtualbox Host-Only Network Adapter”虚拟网卡残留的信息,然后将其删除。

    2024年02月05日
    浏览(54)
  • Hyper-V搭建免费桌面云

    Hyper-V 是 Microsoft 的硬件虚拟化产品。 它用于创建并运行计算机的软件版本,称为“虚拟机”。 每个虚拟机都像一台完整的计算机一样运行操作系统和程序。 如果需要计算资源,虚拟机可提供更大的灵活性、帮助节省时间和金钱,并且与在物理硬件上运行一个操作系统相比,

    2024年02月16日
    浏览(39)
  • docker系列--解决hyper-v导致docker无法启动问题

    一、问题 windows docker desktop 启动报错异常,导致docker无法启动成功   我们看到问题出在hyper-v的问题上,搜索解决方法,官网常见问题如下 Overview | Docker Documentation 二、解决 Hyper-V 已安装并正常工作 在BIOS中启用虚拟化 Windows启动时启用了虚拟机监控程序 在开始菜单中,键入“

    2024年02月14日
    浏览(50)
  • Docker安装找不到Hyper-V解决办法(修正)

    网上的解决方案使用同一个脚本,但是运行出现退出管理者权限,导致后续Dism无法使用,仅需将第一行的跳转目录删除即可 以下为完整步骤: 创建txt文本 并将其文件名修改为Hyper-V.cmd 并且使用管理员身份打开 运行后填入Y 重启电脑  勾选上对应Hyper-V

    2024年02月11日
    浏览(47)
  • 对于windows10家庭版无法勾选Hyper-V的问题的解决

    Hyper-V是Win10自带的虚拟机安装管理工具,使用Hyper-V 可以比较方便地在win10上安装各种不同的虚拟机,包括各种版本的Linux,FreeBSD和Windows。 但是不少初学者在尝试使用该功能时,发现自己并不能按照上文链接中的方法达成目的,其中很大一部分是由于本身电脑版本问题。因此

    2024年02月02日
    浏览(35)
  • docker for Windows, WSL2 ,Hyper-v的关系

    Hyper-V是由微软开发的一种虚拟化技术和虚拟机管理器。它允许在Windows操作系统上创建和运行多个虚拟机实例,每个虚拟机可以运行独立的操作系统和应用程序。 属于硬件虚拟化。 WSL2在技术上与WSL有很大的不同。在WSL2中,Windows 10引入了虚拟化技术,利用了Hyper-V虚拟机来运

    2024年02月08日
    浏览(44)
  • Hyper-V虚拟机没有声音怎么办?介绍两种“发声”方式(以Windows10为例)

    最近使用在VMware上的Windows虚拟机发现稍微有点卡,之前有听说过Windows原生的虚拟机工具Hyper-V所以像尝试一下,安装的教程这里就不做过多的演示了,相信有很多人碰到虚拟机没有声音的问题,然后想通过增强会话或远程桌面的方式发声,但是都会碰到问题,以下就是问题以

    2024年02月07日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包