Swoft第一个基于Swoole原生协程的新时代PHP高性能协程全栈框架,内置协程Web服务器和普通协程客户端,常驻内存,独立于传统PHP-FPM,全异步非阻塞IO实现,以类似同步客户端的方式实现异步客户端的使用,没有复杂的异步回调,没有繁琐的yield,具有类似Go的协程,灵活的注解,强大的全局依赖注入容器、完善的服务治理、灵活强大的AOP、标准的PSR规范实现等,可用于构建高性能的web系统、API、中间件、基础服务等。Swoft的Docker镜像突然使用docker大白话安装swoft,这实际上听起来很奇怪。swoft是一组依赖于swoole扩展的php框架。说docker安装swoft,其实就是docker安装swoft需要的组件依赖和环境。安装搭建swoft框架运行环境所需的依赖和环境还是需要一些时间的,比如php版本>=7.1,swoole版本>=2.1,还要安装hiredis帮助开启swoole的异步redis客户端,需要swoole启用协程模式等所以,为了节省我们的时间,官方提供了一个docker镜像包,里面包含了swoft运行环境需要的各种组件:php7.1+swoole2.1+--enable-async-redis-client--enable-coroutinecomposerpecl我们只需要下载镜像并创建一个新的容器。这个容器提供了swoft框架需要的所有依赖和环境。将宿主机上的sowft项目挂载到swoft镜像的工作目录/var/www/swoft。继续我们的开发或生产工作。将你从swoft稍显繁琐的依赖和环境搭建中解放出来,直接进入业务开发工作。一开始,我对swoft这个形象不是很理解。图片自带的框架其实纯粹是为了体验。一直误以为需要编辑image的swoft框架源码进行开发。特别注意sowft镜像entrypoint命令(运行初始化命令)为ENTRYPOINT["php","/var/www/swoft/bin/swoft","start"],即启动swoft服务与容器,这就需要我们选择在宿主机上开发的swoft项目挂载到容器工作目录时,必须是全量安装(使用composer安装所有依赖)。同时容器使用swoft服务作为前端进程。如果我们要停止/启动重新加载swoft服务,容器也会退出,略显不便。因此,为了后续开发的方便,我们应该将swoft服务分离出来作为容器的前台进程,这样重启/停止容器中的swoft服务就不会影响到容器本身的运行。当然,如果只是简单体验swoft,可以直接创建并启动容器,镜像中已经有完整安装好的swoft框架。后面会给出一种方法,只需要在宿主机上安装运维需要的docker/docker-compose/git,就可以借助swoft镜像部署开发或生产环境(修改镜像入口为bash方式,并然后进入镜像后,使用composer安装依赖,启动swoft,充分利用镜像资源)Docker部署swoft主机还是需要安装基础的php/composer(也可以cp自己本地开发的项目,不过这样可能会造成一些组件版本不一致。或者提交业务代码+composer.json+composer.lock文件,排除vendor目录,然后在线服务器上composerinstall是最标准的)1.在宿主机上创建一个swoft项目(host需要安装基本的php环境才能使用composer)composercreate-project--prefer-distswoft/swoftswoft[--dev]&&cdswoftorgitclonegit@github.com:swoft-cloud/swoft.git&&cdswoft&&作曲家安装&&cdswoft2,pullswoft镜像创建一个swoft容器,并将宿主机安装的swoft项目挂载到swoft容器的工作目录//拉取swoft镜像//将本地swoft项目目录关联到镜像的项目目录(/var/www/swoft)//将主机端口8081映射到容器端口80//将容器命名为mySwoft//以守护进程模式启动dockerrun-v$(pwd):/var/www/swoft-p8081:80--namemySwoft-dswoft/swoft//查看容器是否运行dockerps//查看容器日志dockerlogsmySwoft3,进入swoft容器shell//以交互方式执行mySwoft容器的bashdockerexec-itmySwoftbash//stop将停止容器,因此它将退出shell,然后使用dockerstartmySwoft启动就好了root@cce12db9add3:/var/www/swoft#phpbin/swoftstart|stop|reload//因为我们把宿主机上的swoft项目挂载到了swoft容器的项目目录/var/www/swoft,所以后期开发可以修改宿主机上的项目//可以在swoftroot@cce12db9add3的容器shell中通过命令使用PS的FTP同步工具查看对应的组件版本:/var/www/swoft#php-vroot@cce12db9add3:/var/www/swoft#php--riswooleroot@cce12db9add3:/var/www/swoft#composer-Vroot@cce12db9add3:/var/www/swoft#pecl-VDockerComposer部署swoft主机还是需要安装基本的php/composer(或者你可以cp自己本地开发的项目,但是这样可能会导致部分组件版本不一致,或者提交业务代码+composer.json+composer.lock文件,排除vendor目录,然后在线服务器上的composer安装一次是最标准的)swoft项目有一个docker-compose.yml文件的版本:'3'services:swoft:image:swoft/swoft:latest#build:./ports:-"80:80"#Portmappingvolumes:-./:/var/www/swoft#将当前路径下的本地swoft项目挂载到镜像项目路径stdin_open:true#开启标准输出tty:true#开启ttysessionprivileged:true#授予创建文件夹等权限类似entrypoint:["php","/var/www/swoft/bin/swoft","start"]#进入启动命令即启动swoft服务自然比直接使用docker方便,但是还是需要先在宿主机上创建一个swoft项目。1.在宿主机上创建一个swoft项目(宿主机需要安装基本的php环境才能使用composer)composercreate-project--prefer-distswoft/swoftswoft[--dev]&&cdswoftorgitclonegit@github.com:swoft-cloud/swoft.git&&cdswoft&&composerinstall&&cdswoft2,使用docker-compose来编排启动容器编辑docker-compose.yaml文件为容器版本自定义一个名称:'3'services:swoft:image:swoft/swoft:latestcontainer_name:mySwoft#为容器自定义一个名字,方便管理#build:./ports:-"80:80"#端口映射volumes:-./:/var/www/swoft#将当前路径下的本地swoft项目挂载到镜像项目路径stdin_open:true#打开标准输出tty:true#打开ttySessionprivileded:true#赋予创建文件夹等入口点等权限:["php","/var/www/swoft/bin/swoft","start"]#输入启动命令是启动swoft服务#启动容器docker-composeup-dswoft#查看是否容器运行成功dockerps#进入容器shelldockerexec-itmySwoftbash在没有PHP环境的宿主机上部署swoft前面两种部署swoft的方法需要在宿主机上安装php基础环境要使用composer安装本地swoft用swoft镜像的工作目录挂载项目的依赖组件,就可以启动容器了(因为容器的入口命令是直接启动swoft,如果我们把本地没有安装的swoft项目挂载到镜像的工作目录,容器会启动失败退出),这里介绍一种不需要宿主机安装php/composer的方法1.拉swoft(直接拉,不需要安装依赖)gitclonegit@github.com:swoft-cloud/swoft.git&&cdswoft直接使用docker镜像#-it打开标准输入和终端#--entrypoint覆盖镜像中默认启动swoft服务的设置#-d监护人模式#这会让容器在启动Pre-process时创建一个bash作为容器而不启动swoftservicedockerrun-it-d-p80:80\-v$(pwd):/var/www/swoft\--namemySwoft\--entrypoint=""\swoft/swoftbash#启动后,输入containerdockerexec-itmySwoftbash#使用容器中的composer安装依赖。此时的工作目录已经关联宿主机的swoft项目composeintall[--no-dev]#启动swoftphpbin/swoftstart#这里停止swoft不会导致容器退出phpbin/swoftstop使用docker-compose编辑docker-compose.yml文件,打开stdin_open(相当于docker的-i),tty(相当于docker的-t),entrypoint改变bash。version:'3'services:swoft:container_name:mySwoftimage:swoft/swoft:latest#build:./ports:-"8082:80"#映射主机端口8082到容器80volumes:-./:/var/www/swoft#挂载宿主机当前项目目录到容器的工作目录/var/www/swoftstdin_open:true#必须开启,否则容器会因为bash执行而退出tty:true#打开会话终端privileged:true#entrypoint:["php","/var/www/swoft/bin/swoft","start"]entrypoint:["bash"]#更改此命令后,启动容器时默认不会启动swoft,所以即使如果framework的依赖没有安装的话,是不会影响容器启动的。保存docker-compose.yml然后启动容器。docker-composeup-dswoft进入容器shell,使用容器的composer安装框架依赖#进入容器shelldockerexec-itmySwoftbash#会默认到swoft镜像的工作目录/var/www/swoft该目录与宿主机的swoft项目目录映射#使用容器中的composer安装依赖composerinstall[--no-dev]#启动swoftphpbin/swoftstart|stop|restart使宿主完全省去了简单的提前安装php/composer的工作,充分利用了镜像提供的现成环境~
