首個基於 Swoole 原生協程的新時代 PHP 高性能協程全棧框架,內置協程網絡服務器及經常使用的協程客戶端,常駐內存,不依賴傳統的 PHP-FPM,全異步非阻塞 IO 實現,以相似於同步客戶端的寫法實現異步客戶端的使用,沒有複雜的異步回調,沒有繁瑣的 yield, 有相似 Go 語言的協程、靈活的註解、強大的全局依賴注入容器、完善的服務治理、靈活強大的 AOP、標準的 PSR 規範實現等等,能夠用於構建高性能的Web系統、API、中間件、基礎服務等等。php
忽然白話文git
使用 docker 安裝 swoft 其實聽起來比較怪怪的,swoft 是一套 php 框架,依賴 swoole 擴展,說 docker 安裝 swoft,實際上是 docker 安裝 swoft 運行所需的組件依賴和環境。github
swoft 框架運行環境所需的依賴和環境挨個安裝搭建仍是須要一些時間的,好比 php 版本 >= 7.1, swoole 版本 >= 2.1, 並且還要安裝 hiredis 來協助開啓 swoole 的異步 redis 客戶端,同時要求 swoole 開啓協程模式等。redis
因此呢,爲了節省咱們的時間,官方提供了一個 docker 鏡像包,裏面包含了 swoft 運行環境所須要的各項組件:docker
php 7.1+
swoole 2.1+ --enable-async-redis-client --enable-coroutine
composer
pecl
咱們只須要下載鏡像並新建一個容器,這個容器就提供了 swoft 框架所需的全部依賴和環境,將宿主機上的 sowft 項目掛載到 swoft 鏡像的工做目錄 /var/www/swoft 下,就能夠繼續咱們的開發或生產工做了。讓你從 swoft 略繁瑣的依賴和環境搭建中解放出來,直接進入業務開發工做中去。shell
一開始我沒理解好這個 swoft 鏡像,鏡像裏自帶的框架實際上是單純的用來體驗的,我一直誤覺得要編輯鏡像的 swoft 框架源碼作開發....json
須要特別注意的是,sowft 鏡像的 entrypoint 命令(運行初始化命令)是
ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "start"]
即 swoft 服務會隨着容器而啓動,這就要求咱們若是選擇將宿主機上開發用的 swoft 項目掛載到容器工做目錄時,需已徹底安裝才能夠(使用 composer 安裝好各依賴)。同時容器使用 swoft服務 做爲前置進程,若咱們想中止/啓動來從新載入 swoft服務 時,容器也會跟隨退出,這樣就略有不便了。因此,爲了後續開發方便,咱們應分離 swoft 服務做爲容器的前臺進程,使得在容器內 重啓/中止 swoft 服務不影響容器自身運行。固然,若是隻是單純的體驗 swoft,直接建立並啓動容器便可,鏡像中已有一套徹底安裝的 swoft框架。
在後面咱們將給出一個只須要在宿主機上安裝運維所需的 docker/docker-compose/git 便可徹底藉助 swoft鏡像 去部署開發或生產環境的方法(修改鏡像 entrypoint 到 bash 模式,而後進入鏡像後使用 composer 安裝依賴,啓動 swoft,充分利用鏡像資源)
宿主機仍需安裝基本的 php / composer(或者你把本身本地開發的項目cp過來,但這樣可能會致使部分組件版本不一致,仍是提交業務代碼 + composer.json + composer.lock 文件,排除 vendor 目錄,在線上服務器再 composer install 一遍最爲規範)
一、在宿主機建立 swoft 項目(宿主機需實安裝基礎的 php 環境來使用 composer)bash
composer create-project --prefer-dist swoft/swoft swoft [--dev] && cd swoft 或者 git clone git@github.com:swoft-cloud/swoft.git && cd swoft && composer install && cd swoft
二、拉取 swoft 鏡像 建立 swoft 容器 並將宿主機上安裝好的 swoft 項目掛載到 swoft 容器的工做目錄服務器
// 拉取 swoft 鏡像 // 關聯本地 swoft 項目目錄到鏡像的項目目錄(/var/www/swoft) // 映射主機 8081 端口 到 容器 80 端口 // 容器命名爲 mySwoft // 守護模式啓動 docker run -v $(pwd):/var/www/swoft -p 8081:80 --name mySwoft -d swoft/swoft // 查看容器是否運行 docker ps // 查看容器日誌 docker logs mySwoft
三、進入 swoft 容器 shellswoole
// 交互模式執行 mySwoft 容器的 bash docker exec -it mySwoft bash // stop 會中止容器因此會退出 shell 後用 docker start mySwoft 啓動就好 root@cce12db9add3:/var/www/swoft# php bin/swoft start|stop|reload // 因咱們將宿主機上的swoft項目掛載到了swoft容器的項目目錄/var/www/swoft 因此後期開發修改宿主機上的項目便可 // 可使用PS的FTP同步工具
能夠在 swoft 的容器 shell 裏經過命令查看相應的組件版本
root@cce12db9add3:/var/www/swoft# php -v root@cce12db9add3:/var/www/swoft# php --ri swoole root@cce12db9add3:/var/www/swoft# composer -V root@cce12db9add3:/var/www/swoft# pecl -V
宿主機仍需安裝基本的 php / composer(或者你把本身本地開發的項目cp過來,但這樣可能會致使部分組件版本不一致,仍是提交業務代碼 + composer.json + composer.lock 文件,排除 vendor 目錄,在線上服務器再 composer install 一遍最爲規範)
swoft 項目中是有 docker-compose.yml 文件的
version: '3' services: swoft: image: swoft/swoft:latest # build: ./ ports: - "80:80" #端口映射 volumes: - ./:/var/www/swoft # 掛載當前路徑下的本地swoft項目到鏡像項目路徑 stdin_open: true #打開標準輸出 tty: true # 打開 tty 會話 privileged: true # 給與權限 好比建立文件夾之類的 entrypoint: ["php", "/var/www/swoft/bin/swoft", "start"] # 入口啓動命令 即啓動 swoft 服務
使用方法天然比直接用 docker 方便些,不過依舊是要在宿主機上先建立一個 swoft 項目
一、在宿主機建立 swoft 項目(宿主機需實安裝基礎的 php 環境來使用 composer)
composer create-project --prefer-dist swoft/swoft swoft [--dev] && cd swoft 或者 git clone git@github.com:swoft-cloud/swoft.git && cd swoft && composer install && cd swoft
二、使用 docker-compose 來編排啓動容器
編輯 docker-compose.yaml 文件 給容器自定義個名字
version: '3' services: swoft: image: swoft/swoft:latest container_name: mySwoft # 給容器自定義個名稱便於管理 # build: ./ ports: - "80:80" #端口映射 volumes: - ./:/var/www/swoft # 掛載當前路徑下的本地swoft項目到鏡像項目路徑 stdin_open: true #打開標準輸出 tty: true # 打開 tty 會話 privileged: true # 給與權限 好比建立文件夾之類的 entrypoint: ["php", "/var/www/swoft/bin/swoft", "start"] # 入口啓動命令 即啓動 swoft 服務
# 啓動容器 docker-compose up -d swoft # 查看容器是否成功運行 docker ps # 進入容器shell docker exec -it mySwoft bash
前面兩種部署 swoft 的方法都須要在宿主機上安裝 php 基礎環境來使用 composer 安裝好本地 swoft 項目的依賴組件,才能與 swoft 鏡像的工做目錄掛載,啓動容器(由於容器的入口命令就是直接啓動 swoft,若是咱們掛載本地未安裝好依賴的 swoft 項目到鏡像工做目錄,那容器就會啓動失敗退出了),下面咱們介紹一種不須要在宿主機上安裝 php / composer 的方法。
一、拉取 swoft(拉取就好,不須要安裝依賴)
git clone git@github.com:swoft-cloud/swoft.git && cd swoft
# -it 開啓標準輸入及終端 # --entrypoint 覆蓋鏡像內默認啓動 swoft 服務的設定 # -d 守護模式 # 這樣便使得容器在啓動時會建立一個 bash 做爲前置進程 而不啓動 swoft 服務 docker run -it -d -p 80:80 \ -v $(pwd):/var/www/swoft \ --name mySwoft \ --entrypoint="" \ swoft/swoft bash # 啓動後進入容器 docker exec -it mySwoft bash # 使用容器內的 composer 安裝依賴 此時的工做目錄已於宿主機的swoft項目關聯 compose intall [--no-dev] # 啓動 swoft php bin/swoft start # 此時中止 swoft 也不會致使容器退出 php bin/swoft stop
編輯 docker-compose.yml 文件,開啓 stdin_open(等同於docker的 -i), tty(等同於docker的 -t), entrypoint 改成 bash。
version: '3' services: swoft: container_name: mySwoft image: swoft/swoft:latest # build: ./ ports: - "8082:80" # 映射宿主機 8082 端口到 容器 80 volumes: - ./:/var/www/swoft # 將宿主機的當前項目目錄掛載到容器的工做目錄 /var/www/swoft stdin_open: true # 必定要開啓此項 不然容器會因 bash 執行完退出 tty: true # 開啓會話終端 privileged: true # entrypoint: ["php", "/var/www/swoft/bin/swoft", "start"] entrypoint: ["bash"] # 改成此命令後 啓動容器時默認不會啓動 swoft 因此即便框架依賴未安裝 也不會影響容器啓動
保存 docker-compose.yml 後啓動容器
docker-compose up -d swoft
進入容器 shell 使用容器種的 composer 安裝框架依賴
# 進入容器shell docker exec -it mySwoft bash # 會默認在 swoft 鏡像的工做目錄 /var/www/swoft 此目錄以和宿主機的swoft項目目錄映射在一塊兒了 # 用容器內的 composer 安裝依賴 composer install [--no-dev] #啓動 swoft php bin/swoft start|stop|restart
這樣使得宿主機徹底省去了還要事先簡單安裝下 php / composer 的工做,徹底利用鏡像提供的現成的環境~