首页 > 作文

如何通过Docker搭建一个swoft开发环境

更新时间:2023-04-08 00:24:44 阅读: 评论:0

本篇文章给大家分享的内容是关于如何通过docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们。

swoft


首个基于 swoole 原生协程的新时代 php 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 php-fpm,全异步非阻塞 io 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield,有类似 go 语言的协程、灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 aop、标准的 psr 规范实现等等,可以用于构建高性能的web系统、api、中间件、基础服务等等。

前言

swoft是一个在swoole之上构建的一个高性能协程 php 全栈框架,而swoolephper里面是一个高级技能,所以在相关的环境安装上也给许多人造成了很大的困扰,swoft更是如此,本文将通过docker以一种极其简单的方式解决运行环境和开发环境的部署。

docker

从百科上可以看到,docker是一个开源的的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口,也可以理解为我们可以将我们的代码和运行环境打包到一个容器中,打包好的容器可以发布到任何流行的linux机器上,这里指的linux机器其实并不准确,得益于docker for windows项目和hyper-v的发展,docker也可以以不错的状态运行在windows 10系统上,但笔者不建议将docker for windows用于生产环境上。

docker 名词概念

这里对docker常用的的一些名词进行简单的阐述和解释,以便新手对于下文的理解

dockerfiledockerfiledocker镜像的描述文件,通过docker build命令来构建成为镜像镜像(image),通过dockerfile构建得到,包含操作系统及运行环境容器(container),容器是运行起来的镜像,可理解为镜像是docker生命周期中的构建和打包阶段,而容器则是启动和执行阶段镜像仓库(repository),用于储存构建好的docker镜像的仓库,可理解为类似于git的仓库6 29事故

安装 docker

docker的安装流程并不复杂,本节将介绍linuxwindows 10系统下的安装流程,而mac系统上并不建议采用docker环境来运行或开发swoft项目,因为在mac for docker上共享磁盘的性能极其的差,会导致swoft在启动阶段耗时极长。

linux上安装dockerdocker-compo

linux上通过yumapt-get来 安装docker的流程可谓是相当简单
centos:yum install docker -y
ubuntu:apt-get install docker-engine -y
只需要根据系统的区别,在终端执行上面的一行命令即可完成docker的安装,在安装完成之后我们需要执行一下rvice docker start命令来启动一下docker服务。

在安装完docker之后,我们还需要安装一下docker-compo以便于后续对 docker 的使用
centos:yum install python-pip -y && pip install --upgrade pip && pip install -u docker-compo
ubuntu:apt-get install python-pip -y && pip install --upgrade pip && pip install -u docker-compo
只需要根据系统的区别,在终端执行上面的一行命令即可完成docker-compo的安装。

windows 10上安装dockerdocker-compo

我们直接到 docker 官网下载对应的安装包https://store.docker.com/edi企业会计准则解释第3号t...,非登录用户我们会看到plea login to download,意思是要我们先登录 docker 账号好再下载,我们直接点击按钮到登录页面完成账号注册或登录即可在上面的链接页面通过点击get docker下载,注意这个账号后面我们在使用时也会用到。
下载完安装包后可直接运行安装包进行安装,整个过程可以说是傻瓜式的,持续的下一步即可,注意安装前疫情英语作文需先开启系统的hyper-v,开启流程相对简单可参考其它文章https://gmentfault.com/a/11... ,注意hyper-v是与vmware是冲突的,两者不能并存,只能择其一,如果你必须要使用虚拟机的话,比如vagrant之类的工具,亦可在虚拟机内运行一个linux 系统,然后根据本文关于linux 系统的安装流程处理,在虚拟机内运行docker作为开发环境。
最新版的docker安装包已经包含了docker-compo了,也就无需再做多余的操作。
安装完成后,重启电脑,当你看到任务栏的小鲸鱼(docker icon)显示着docker is running即表示docker启动成功了。

我们需要右键docker,点击sign in / create docker id登录我们刚才注册的docker id,以便获得我们可以从 dockerhub 中获取公共镜像的权限。

由于我们是用于开发使用,所以我们还需要授权一下共享目录的权限,右键docker并点击ttings,设置界面切换到shared drives,勾选你项目代码所在的磁盘盘符,并点击右下角的apply即可完成授权。

swoft 开发环境

修改官方默认docker-compo.yml文件

我们通过命令git clone https://github.com/swoft-cloud/swoftgithub克隆(clone)swoft 项目,并使用项目自带的docker-compo.yml文件来实现一个用于开发的环境,docker-compo.ymldocker-compo的编排配置文件, 我们看一下官方默认文件的内容:

version: '3'rvices:    swoft:        container_name: swoft        image: swoft/swoft        ports:            - "80:80"        volumes:            - ./:/var/www/swoft        stdin_open: true        tty: true        command: php /var/www/swoft/bin/swoft start

这是一个相对简单的编排文件,仅仅只有swoft一个服务,也没有关联过多的内容,关于docker-compo.yml的文件格式我们这里不做过多的解释,可自行查找相关的内容进行阅读理解。

简单的解读此文件的内容可以理解为,使用了swoft/swoft官方镜像并设置了容器名称为swoft,绑定容器内的80端口与宿主机的80端口,设置./当前目录与容器内的/var/www/swoft目录为共享目录,开启与容器的交互式终端并于启动编排文件时启动swoft服务。

我们可以注意到默认编排文件上的command配置了php /var/www/swoft/bin/swoft start,也就是启动 swoft 服务的命令,但如果仅克隆(clone)项目并执行docker-compo up来尝试启动容器的话,我们会得到一个失败的结果,因为尚未执行compor insta正压力ll来加载compor的依赖而缺少vendor文件夹和autoload等相关文件,导致无法正确运行swoft实例,我们再看默认的编排文件设置了stdin_open: truetty: true两个参数,分别对应docker命令上的-i-t两个参数,简单的理解就是-i开启了输入(input)功能,-t开启了一个连接容器里面的交互式终端(terminal),我们可以利用这两个参数,并将编排文件的command行改为command: /bin/bash,使容器启动后不是直接启动swoft服务,而是由我们手动通过交互式终端(terminal)进入容器内去启动。

下面是一个更改后的docker-compo.yml文件实例:

version: '3'rvices:    swoft:        container_name: swoft        image: swoft/swoft        ports:            - "80:80"        volumes:            - ./:/var/www/swoft        stdin_open: true        tty: true        command: /bin/bash

启动开发环境容器

此时我们在编排文件的所在目录启动一个终端(shell), 然后执行docker-compo up -d-d的意思是以守护模式(daemon mode)运行,便于我们在同一个终端(shell)进入到容器内,命令执行后我们可以看到starting swoft ... done即表示启动容器成功。
如果在执行启动命令时得到一下错误,则说明宿主机的80端口已经被占用了,更改docker-compo.yml文件内的80:80为其它未被占用的端口即可,注意第一个80指的是宿主机的端口,第二个80指的是容器内的端口,也就是说我们只需要更改第一个即可

error: for swoft cannot start rvice swoft: b'driver failed programming external connectivity on endpoint swoft(dab0f4d00620e2f5c07e33084ca5cac6f08cb48018d6b737eadc035e5aa0b597): bind for 0.0.0.0:80 failed: port is already allocated'

进入开发环境容器

通过执行docker ps命令可以查看启动的容器信息,下面为示例信息:

container id  image               command                 created             status             ports               namesf22173763374  swoft/swoft:latest  "docker-php-entrypoin"  about a minute ago  up about a minute  0.0.0.0:80->80/tcp  swoft

得知容器id(container id)f22173763374容器名称(container name)swoft,我们可以执行docker exec -it f22173763374 bashdocker exec -it swoft bash通过交互式终端(terminal)进入到容器内。

如执行时报错the input device is not a tty. if you are using mintty, try prefixing the command with 'winpty',可在docker exec命令前面增加winpty命令解决,即个人评语winpty docker exec -it swoft bash

运行以及开发调试

安装compor依赖及生成自动加载(autoload)文件

通过docker exec命令进入容器后,我们留意到光标左侧的内容变为root@f22173763374:即为已进入容器内,其中f22173763374为对应的容器id(container id)
由于swoft官方镜像swoft/swoft配置的工作目录为/var/www/swoft,而docker-compo.yml又将项目当前目录关联了容器/var/www/swoft目录,即通过docker exec进入的目录已经为/var/www/swoft目录,即项目目录,所以我们可以直接执行compor install命令来加载compor的依赖并生成自动加载(autoload)文件。
考虑到国内的网络环境,我们在执行compor install命令前可以先执行compor config -g repo.packagist compor https://packagist.phpcompor.com命令配置compor 中国镜像源加速安装速度。

启动swoft服务

安装完compor依赖后,便可以执行php bin/swoft start启动服务了,当你看到

root@f22173763374:/var/www/swoft# php bin/swoft start                         rver information********************************************************************* http | host: 0.0.0.0, port: 81, type: 1, worker: 1, mode: 3* tcp  | host: 0.0.0.0, port: 8099, type: 1, worker: 1 (enabled)********************************************************************rver has been started. (master pid: 15, manager pid: 16)you can u ctrl + c to stop run. 

即意味着你的swoft以及启动成功了,我们可以打开浏览器访问一下http://127.0.0.1:80,当你看到下图即大功告成了!

如果你绑定宿主机的端口不是80,则改成对应的即可;
如果访问看到的是redis connection failure host=127.0.0.1 port=6379则说明缺少redis服务,最简单直接的就是直接在当前容器内安装redis rver,直接执行apt install -y redis-rver && rvice redis-rver start即可完成安装以及启动操作了;

修改代码并使代码生效

swoftphp-fpm模式下的开发会有一点差异,在php-fpm模式下直接改变代码内容,再访问对应的代码便能得到变更后的内容,是因为php-fpm模式下每一次请求都会重新加载php代码,而swoft持久化运行的,也就意味着代码在服务启动之后,接受的请求都无需重新加载,这个模式的变化可以使得swoft的大量代码可被重复使用,而无需重新加载和重新实例化,大大提升性能的其中一点原因之一。
这样的变更对开发会造成一定程度的影响,也就是说在swoft下,你需要重启 worker重启服务才能使变更的代码生效,但是得益于swoft热重载功能,可以自动检查代码变更并自动重启 worker,我们只需通过项目根目录下的.env文件更改auto_reload项为true即可,如项目根目录下没有.env文件,可直接复制.env.example文件为.env并作出对应的更改即可,有一点需要注意的是仅在改变app目录下的代码才会被热重载功能重载,改变其它代码不会被重载,这是由于不同代码是处于不同的生命周期导致的,仅workerstart之后加载的代码才能被重载,关于这部分的内容我们将在后续涉及到swoft 的生命周期时再做进一步的讲解。

更多php相关知识请关注我的专栏php​zhuanlan.zhihu.com

本文发布于:2023-04-08 00:24:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/21003aed1e6207179a9598aa5fbf86ca.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:如何通过Docker搭建一个swoft开发环境.doc

本文 PDF 下载地址:如何通过Docker搭建一个swoft开发环境.pdf

标签:容器   文件   镜像   命令
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图