如何通過Docker搭建一個swoft開發環境

来源:https://www.cnblogs.com/a609251438/archive/2019/12/25/12098988.html
-Advertisement-
Play Games

本篇文章給大家分享的內容是關於如何通過Docker搭建一個swoft開發環境 ,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。Swoft首個基於 Swoole 原生協程的新時代 PHP 高性能協程全棧組件化框架,內置協程網路伺服器及常用的協程客戶端,常駐記憶體,不依賴傳統的 PHP-FPM ...


本篇文章給大家分享的內容是關於如何通過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 官網下載對應的安裝包 .,非登錄用戶我們會看到 Please Login to Download ,意思是要我們先登錄 Docker 賬號好再下載,我們直接點擊按鈕到登錄頁面完成賬號註冊或登錄即可在上面的鏈接頁面通過點擊 Get Docker 下載,註意這個賬號後面我們在使用時也會用到。
下載完安裝包後可直接運行安裝包進行安裝,整個過程可以說是傻瓜式的,持續的下一步即可,註意安裝前需先開啟系統的 Hyper-V,開啟流程相對簡單可參考其它文章 . ,註意 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: '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: truetty: 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

運行以及開發調試

安裝 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: 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 的生命周期 時再做進一步的講解。

更多PHP相關知識請關註我的專欄PHP​zhuanlan.zhihu.com


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、流程圖 二、分配個人任務的方式 1、直接指定辦理人 說明:這樣分配辦理人不夠靈活,因為項目開發中任務的辦理人不要放置在XML當中實際開發中辦理人是不固定的。 2、使用流程變數指定辦理人 2.1 流程圖中的設置 說明:在Activiti中#{username}和${username}的意義是一樣的 ...
  • 一、接收任務 接收任務(ReceiveTask)即等待任務,接收任務是一個簡單任務,它會等待對應消息的到達。當前,官方只實現了這個任務的java語義。 當流程達到接收任務,流程狀態會保存到資料庫中。在任務創建後,意味著流程會進入等待狀態,直到引擎接收了一個特定的消息, 這會觸發流程穿過接收任務繼續執 ...
  • Java JDBC 資料庫鏈接小結隨筆 一、鏈接資料庫的步驟 二、 關於Statement 和 PrepareStatement 兩者區別 用法 三、關於 ResultSet 的一些小結 四、自定義工具類的封裝 五、一些異常的解釋 一、鏈接資料庫的步驟 註冊驅動 獲得鏈接對象 創建sql容器 執行s ...
  • 簡介 Min_25篩~~據說~~可以在$O(\frac{n^{\frac{3}{4}}}{logn})$處理出含有以下性質的函數f的首碼和: 1.$f(ab)=f(a)f(b)$,即f是一個積性函數 2.$f(p^k)$可以快速計算。 PS:本文沒有關於複雜度的證明。。。 預處理 首先要預處理兩個東 ...
  • springboot集成開發實現商場秒殺 加入主要依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependen ...
  • "題目鏈接" problem 給出一個$n,n include include include include include include include include using namespace std; typedef long long ll; const int N = 50001 ...
  • 場景 Dubbo環境搭建-管理控制台dubbo-admin實現服務監控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103624846 Dubbo搭建HelloWorld-搭建服務提供者與服務消費者並完成遠程調用(附代碼下載) ...
  • 這篇文章介紹的內容是關於PHP+Mysql防止SQL註入的方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下 方法一: mysql_real_escape_string -- 轉義 SQL 語句中使用的字元串中的特殊字元,並考慮到連接的當前字元集 ! $sql = "select c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...