Swoft 系列教程:(1)使用 Docker 安装部署 Swoft

8
之前有写过一篇 Docker 安装部署 Swoft 的文章,但有些冗余混乱,故重写作为教程的开篇。要不读读看?

Swoft项目:https://github.com/swoft-clou...
Swoft文档:https://doc.swoft.org/
Swoft镜像:https://hub.docker.com/r/swof...

Swoft 简介

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

即异步非阻塞IO,EventLoop,事件驱动。cpu_num 个 worker 即可承载高并发请求,提供协程/异步IO客户端,数据库连接池,对象连接池,任务进程池。优雅的注解声明,IOC/DI容器,严格遵循PSR规范。

Swoft 镜像的主要用途

Swoft 官方提供了基于 Debine 的 Docker 镜像。镜像中已安装配置好运行 Swoft 的所需组件及依赖:PHP 7.0+ / Swoole / Composer / Pecl。虽然不使用镜像从头安装部署以上几项组件也不难,但镜像内置可以开箱即用,免去了这些略繁琐的工作,让我们尽可能快的投入到 Swoft 的开发中去。

此外

Swoft 镜像与开发的配合

如果只是单纯的想快速体验 Swoft,使用 docker run -p 80:80 swoft/swoft 拉取创建容器访问即可。

如何正确的在 Swoft 项目的开发中使用镜像呢?如果是要将镜像好好利用到开发工作中,则需要清楚一下几点。

  • 镜像内置完全安装的 Swoft 框架,但它只是用来快速演示的,并不是要你拿去修改,开发还是要对本地的 Swoft 项目开发。
  • 我们应该做的是将本地的 Swoft 框架 挂载到镜像的工作目录 /var/www/swoft 从而替换掉镜像自带的,这样启动 Swoft服务 就会启动映射到本地的 Swoft 项目了
  • 镜像的容器启动时默认会启动 Swoft 服务 作为前置进程,这就要求我们在挂载了本地 Swoft 项目时需要保证已完全安装了各项依赖(github 拉取下来的 Swoft 源码 并没有安装库依赖,需要使用 Composer install 一下)

好像咬到尾巴了,为了开发需要挂载本地 Swoft 项目到镜像工作目录,因为容器启动时还会一并启动 Swoft 服务,所以要求挂载的本地 Swoft项目 必须使用 Composer 安装好依赖,嗯?这不还是得在本地装 PHP + Composer 嘛,镜像不是都提供了嘛,重复劳动了。

  • 修改 Swoft 镜像的 entrypoint 使得 Swoft 容器启动时不同时启动 Swoft 服务,这就不需要要求我们挂载的本地 Swoft 项目必须完全安装好依赖了。
  • 容器创建好后,登入容器 sh,使用镜像内置的 Composer 安装依赖
  • 启动 Swoft 服务

这样就能充分利用镜像内置的环境和工具,快乐的开始 Swoft 的开发了工作了,下面给出具体的实例。

Swoft 镜像的使用

前面夸赞了那么多镜像的便利之处,下面如果不完全把镜像用到极致那就不太好了 O(∩_∩)O哈哈~

1、首先我们从 github 上拉取最新的 Swoft 源码到本地

cd ~ && git clone git@github.com:swoft-cloud/swoft.git && cd swoft

2、查看 swoft 镜像的 Dockerfile

# 在文件尾设定了 entrypoint 命令为 启动 swoft服务
ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "start"]

entrypoint 就是我们后面需要改掉的参数

3、直接使用镜像创建容器

docker run \
-p 8081:80 \ #映射宿主机808
-v $(pwd):/var/www/swoft \#挂载本地 Swoft 项目到镜像工作目录
-it -d \ #重要 开启 stdin tty 并以daemon模式运行
--entrypoint="" \#重要 覆盖掉镜像内设定的 entrypoint 参数
--name my_swoft \#容器命令
--privileges=true \#赋予权限
swoft/swoft bash

4、使用 docker-compose 更为简洁

#编辑 docker-compose 编排文件
vim docker-compose.yml
#内容修改如下
version: '3'

services:
    swoft:
       image: swoft/swoft:latest
       container_name: my_swoft # 给容器自定义个名称便于管理
       #build: ./
       ports:
         - "8081:80" #端口映射
       volumes:
         - ./:/var/www/swoft # 挂载本地swoft项目到镜像工作目录
       stdin_open: true #打开标准输出 -i
       tty: true # 打开 tty 会话 -t
       privileged: true # 给与权限 比如创建文件夹之类的
       #entrypoint: ["php", "/var/www/swoft/bin/swoft", "start"] # 入口启动命令 即启动 swoft 服务
       entrypoint: ["bash"] 

创建容器

docker-compose up -d swoft ./

5、登入容器,安装依赖,开启 Swoft 服务
使用3或4创建的Swoft容器,便以 bash 作为启动的前置进程,而非启动 Swoft 服务,我们登入容器使用内置的 Composer 安装依赖后,启动Swoft服务即可。

docker exec -it my_swoft bash
# 安装框架依赖
composer install
# 启动/停止/重启 Swoft 服务
php bin/swoft start|stop|restar

6、开启热重载,关闭 daemon,让框架调试信息输出到 stderr 方便开发调试
编辑本地的 Swoft 项目 .env 文件

# Application
APP_DEBUG=true
# Server
...
AUTO_RELOAD=true
...
# Swoole Settings
...
DAEMONIZE=0
...

保存并重新启动 Swoft服务

clipboard.png

小提示:可以使用 PHPStorm IDE 配置 FTP/SFTP 文件改动自动上传的方式,开发起飞~

你可能感兴趣的

小妖找大王 · 3月22日

windows下安装的docker,成功运行容器,映射宿主机的80端口到容器的80端口。。但是不能访问 请问有遇到嘛

回复

0

我把entrypoint改为bash了,你需要登录容器启动swoft服务,docker exec -it 容器名称 bash && php bin/swoft start

big_cat 作者 · 3月22日
0

找到问题了 因为是win7 用的是Toolbox,访问的时候不能使用自己的宿主机真实IP,需要用Virtualbox 虚拟机的IP才可以访问。。
感谢

小妖找大王 · 3月22日
big_cat 作者 · 8月23日

快速的开发环境搭建:

#在宿主机上创建项目并全量拉取框架
composer create-project swoft/swoft swoft && cd swoft
#使用swoft-docker的环境运行宿主机项目
docker run -p 80:80 -v $(pwd):/var/www/swoft --name swoft swoft/swoft
在 ./swoft 下直接开干

回复

阿刀哥 · 9月7日

Swoft 官方提供了基于 Debine

debian?

回复

载入中...