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

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

前言

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

Docker

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

Docker 名词概念

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

  • DockerfileDockerfile 是 Docker镜像 的描述文件,通过 docker build 命令来构建成为 镜像
  • 镜像(Image),通过 Dockerfile 构建得到,包含操作系统及运行环境
  • 容器(Container),容器是运行起来的镜像,可理解为镜像是Docker生命周期中的构建和打包阶段,而容器则是启动和执行阶段
  • 镜像仓库(Repository),用于储存构建好的 Docker镜像 的仓库,可理解为类似于 Git 的仓库

安装 Docker

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

在 Linux 上安装 Docker 与 docker-compose

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

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

在 Windows 10 上安装 Docker 与 docker-compose

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

我们需要右键 Docker,点击 Sign in / Create Docker ID 登录我们刚才注册的 Docker ID,以便获得我们可以从 DockerHub 中获取公共镜像的权限。

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

Swoft 开发环境

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

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

version: ''

services:

    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-compose.yml的文件格式我们这里不做过多的解释,可自行查找相关的内容进行阅读理解。

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

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

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

version: ''

services:

    swoft:

        container_name: swoft

        image: swoft/swoft

        ports:

            - "80:80"

        volumes:

            - ./:/var/www/swoft

        stdin_open: true

        tty: true

        command: /bin/bash

启动开发环境容器

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

ERROR: for swoft Cannot start service 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               NAMES

f22173763374  swoft/swoft:latest  "docker-php-entrypoin"  About a minute ago  Up About a minute  0.0.0.0:->/tcp  swoft

得知 容器ID(Container ID) 为 f22173763374容器名称(Container Name)为 swoft,我们可以执行 docker exec -it f22173763374 bash 或 docker 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

运行以及开发调试

安装 Composer 依赖及生成自动加载(Autoload)文件

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

启动 Swoft 服务

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

root@f22173763374:/var/www/swoft# php bin/swoft start

                         Server Information

********************************************************************

* HTTP | host: 0.0.0.0, port: , type: , worker: , mode: 

* TCP  | host: 0.0.0.0, port: , type: , worker:  (Enabled)

********************************************************************

Server has been started. (master PID: , manager PID: )

You can use 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 Server,直接执行 apt install -y redis-server && service redis-server start 即可完成安装以及启动操作了;

修改代码并使代码生效

Swoft 跟 PHP-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

如何通过Docker搭建一个swoft开发环境的更多相关文章

  1. 用 Docker 搭建 ORACLE 数据库开发环境

    用 Docker 搭建 ORACLE 数据库开发环境 需要安装 ORACLE 数据库做开发,直接安装的话因为各类平台的限制,非常复杂,会遇到很多问题. 还好,现在有 Docker 化的部署方式,省去很 ...

  2. Mac下docker搭建lamp本地开发环境

    1.先在Mac上下载docker:官网下载:下载地址(选择mac版本下载,可能速度较慢) DaoCloud下载:下载地址(速度较快,可能版本较低) 2.装完之后打开: 3.检查一下是否下载成功: $  ...

  3. 利用Docker搭建java项目开发环境

    一.需求 一台 Ubuntu 16.0.4 LTS ,安装了Docker服务,Rancher服务,也制作了Tomcat相关的image,接下来我们就来说一下如何快速的构建一个开发环境和测试环境 二.步 ...

  4. 搭建一个java开发环境的步骤

    首先思考java开发环境需要些什么? 1.适用于我们开发环境的jdk 2.对应开发环境的IDE 3.如果是web应用,还需要web服务器,常用的有Tomcat 1) 下载对应组件 2) 安装 jdk安 ...

  5. 2,搭建一个java开发环境

    (1)java开发需要的条件? 1)适用于环境开发的jdk(里面包括了jre和加热里面包括了jvm) 2)对应开发环境的eclipse 3)如果涉及到web开发,还需要web服务器(Tomcat) ( ...

  6. 快速搭建一个vue开发环境

    常规的搭建就是从npm到vue到webpack这样一个一个的来,这样一套下来说不上复杂但是也不简单.之前公司的vue后台项目 我还是写的轻车熟路的,因为前端同事已经把架子搭好了,环境配置的丝般顺滑,你 ...

  7. docker搭建一个渗透测试环境 bwapp为例

    bwapp是一个渗透测试靶场,他其中中含有100多个Web漏洞  基本涵盖了所有主要的已知Web漏洞,包括OWASP Top 10的各种 首先要去搜索一下  看一下有哪些镜像可以下载    docke ...

  8. 搭建一个ES6开发环境

    一.首先先建立一个项目工程目录,并在目录下建立两个文件夹:src和dist src:书写ES6代码的文件夹,写的js程序都放在这里. dist:利用Babel编译成的ES5代码的文件夹,在HTML页面 ...

  9. 在MAC上搭建python数据分析开发环境

    最近工作转型到数据开发领域,想在本地搭建一个数据开发环境.自己有三年python开发经验,马上想到使用numpy.scipy.sklearn.pandas搭建一套数据开发环境. ubuntu的环境,百 ...

随机推荐

  1. javascript当中静态方法和prototype用法

    6)静态方法和prototype(难) 例 3.6.1 <head>    <meta http-equiv="content-type" content=&qu ...

  2. SIFT算法原理(3)-确定关键点的主方位,构建关键点描述符

    介绍官网:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html ...

  3. Markdown上手使用

    前言 学习Markdown主要是为了更好的编辑博客(捂脸),顺便学一学Markdown语法,毕竟MarkdownPad 2放着吃灰好久了(雾) MarkdownPad2 下载 链接:https://p ...

  4. word中去除所有table键

    1.打开word---文件---选项---显示,不勾选制表符 2.选择需要的文本,按[CTRL+H]查找替换, 3.将鼠标定位至“查找内容”,点击“特殊格式-制表符”,然后出现^t,在“替换为”中输入 ...

  5. 记录 shell学习过程(4)for 循环

    1. for in ` #seq 生成从1到10 如果生成从10到1则写作 seq 10 -1 1 do echo $i done for in 也可以循环出字符串 for i in where is ...

  6. [HAOI2016] 找相同字符 - 后缀数组,单调栈

    [HAOI2016] 找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. \(n,m \l ...

  7. H5Plus 入门学习-Dcloud H5+ API调用实例

    使用API Reference完整简单的操作,更多操作查看官方文档. 最后提供项目的下载地址[下载][一款移动APP演示]

  8. python3练习100题——014

    这题卡了我一整天,然后还是看答案撸了一遍- 原题链接:http://www.runoob.com/python/python-exercise-example14.html 题目:将一个正整数分解质因 ...

  9. Python中的模块简单认识

    将自己定义的方法,变量存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件称为模块. 细说的话,模块可以分为四个通用类别: 1 使用python编写的.py文件(自定义模块) 2 已被编译为共 ...

  10. OpenCV离散傅里叶变换

    离散傅里叶变换 作用:得到图像中几何结构信息 结论:傅里叶变换后的白色部分(即幅度较大的低频部分),表示的是图像中慢变化的特性,或者说是灰度变化缓慢的特性(低频部分). 傅里叶变换后的黑色部分(即幅度 ...