這篇文章給大家分享的內容是關於如何透過Docker搭建一個swoft開發環境 ,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。
Swoft
<br>#第一個基於 Swoole 原生協程的新時代 PHP
高效能協程全端組件化框架,內建協程網路伺服器及常用的協程客戶端,常駐內存,不依賴傳統的 PHP-FPM,全異步非阻塞 IO
實現,以類似於同步客戶端的寫入方法實現非同步客戶端的使用,沒有複雜的非同步回調,沒有繁瑣的 yield,有類似 Go
語言的協程、靈活的註解、強大的全局依賴注入容器、完善的服務治理、靈活強大的 AOP、標準的 PSR
規範實作等等,可以用來建立高效能的Web系統、API、中介軟體、基礎服務等等。
Swoft
是一個在Swoole
之上建構的一個高效能協程PHP 全端框架
,而Swoole
在PHPer
裡面是一個高階技能,所以在相關的環境安裝上也給許多人造成了很大的困擾,Swoft
更是如此,本文將透過Docker
以極為簡單的方式解決運行環境和開發環境的部署。
從百科上可以看到,Docker
是一個開源的應用程式容器引擎,讓開發者可以打包他們的應用程式以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux
機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面,也可以理解為我們可以將我們的程式碼和運行環境打包到一個容器中,打包好的容器可以發佈到任何流行的Linux
機器上,這裡指的Linux機器其實並不準確,得益於Docker for Windows
專案和Hyper-V
的發展,Docker
也可以以不錯的狀態運行在Windows 10系統上,但筆者不建議使用Docker for Windows
用於生產環境。
這裡對Docker
常用的一些名詞進行簡單的闡述和解釋,以便新手對於下文的理解
Dockerfile
,Dockerfile
是Docker映像
的描述文件,透過docker build
# 命令來構建成為鏡像
映像(Image
),透過Dockerfile
建置得到,包含作業系統及執行環境
容器(Container
),容器是運行起來的映像,可理解為鏡像Docker
生命週期中的建置和打包階段,而容器則是啟動和執行階段
鏡像倉庫(Repository
),用於儲存建置好的Docker映像
的倉庫,可理解為類似Git
的倉庫
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
即可完成授權。
<span style="font-size: 16px;">docker-compose.yml</span>
檔案
我們透過指令git clone https://github.com/swoft-cloud/swoft
從Github
上複製(clone)
Swoft 項目,並使用專案自帶的docker-compose.yml
檔案來實作一個用於開發的環境,docker-compose.yml
是docker- compose
的編排配置文件, 我們看一下官方預設文件的內容:
version: '3' 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: true
和tty: true
兩個參數,分別對應docker
指令上的-i
和-t
兩個參數,簡單的理解就是-i
開啟了輸入(input)
功能,-t
開啟了一個連接容器裡面的互動式終端(terminal)
,我們可以利用這兩個參數,並將編排檔案的command
行改為command: /bin/bash
,使容器啟動後不是直接啟動Swoft
服務,而是由我們手動透過互動式終端(terminal)
進入容器內去啟動。
下面是一個更改後的 docker-compose.yml
檔案實例:
version: '3' 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:80->80/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
<span style="font-size: 16px;">Composer</span>
依赖及生成<span style="font-size: 16px;">自动加载(Autoload)</span>
文件
通过 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 中国镜像源
加速安装速度。
<span style="font-size: 16px;">Swoft</span>
服务
安装完 Composer
依赖后,便可以执行 php bin/swoft start
启动服务了,当你看到
root@f22173763374:/var/www/swoft# php bin/swoft start Server 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) ******************************************************************** Server has been started. (master PID: 15, manager PID: 16) 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 的生命週期
時再做進一步的講解。
相關建議:
Docker 容器裡設定排程任務 crontab(DaoCloud Docker Laravel5)
以上是如何透過Docker建構一個swoft開發環境的詳細內容。更多資訊請關注PHP中文網其他相關文章!