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

本篇文章給你們分享的內容是關於如何經過Docker搭建一個swoft開發環境 ,內容很詳細,有須要的朋友能夠參考一下,但願能夠幫助到大家。

Swoft
首個基於 Swoole 原生協程的新時代 PHP 高性能協程全棧組件化框架,內置協程網絡服務器及經常使用的協程客戶端,常駐內存,不依賴傳統的 PHP-FPM,全異步非阻塞 IO 實現,以相似於同步客戶端的寫法實現異步客戶端的使用,沒有複雜的異步回調,沒有繁瑣的 yield,有相似 Go 語言的協程、靈活的註解、強大的全局依賴注入容器、完善的服務治理、靈活強大的 AOP、標準的 PSR 規範實現等等,能夠用於構建高性能的Web系統、API、中間件、基礎服務等等。

前言

 

Swoft 是一個在 Swoole 之上構建的一個高性能協程 PHP 全棧框架,而 Swoole 在 PHPer 裏面是一個高級技能,因此在相關的環境安裝上也給許多人形成了很大的困擾,Swoft 更是如此,本文將經過 Docker 以一種極其簡單的方式解決運行環境和開發環境的部署。php

Docker

從百科上能夠看到,Docker 是一個開源的的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口,也能夠理解爲咱們能夠將咱們的代碼和運行環境打包到一個容器中,打包好的容器能夠發佈到任何流行的Linux機器上,這裏指的Linux機器其實並不許確,得益於Docker for Windows項目和Hyper-V的發展,Docker也能夠以不錯的狀態運行在Windows 10系統上,但筆者不建議將 Docker for Windows 用於生產環境上。node

Docker 名詞概念

這裏對 Docker 經常使用的的一些名詞進行簡單的闡述和解釋,以便新手對於下文的理解python

  • DockerfileDockerfile 是 Docker鏡像 的描述文件,經過 docker build 命令來構建成爲 鏡像
  • 鏡像(Image),經過 Dockerfile 構建獲得,包含操做系統及運行環境
  • 容器(Container),容器是運行起來的鏡像,可理解爲鏡像是Docker生命週期中的構建和打包階段,而容器則是啓動和執行階段
  • 鏡像倉庫(Repository),用於儲存構建好的 Docker鏡像 的倉庫,可理解爲相似於 Git 的倉庫

安裝 Docker

Docker 的安裝流程並不複雜,本節將介紹 Linux 及 Windows 10 系統下的安裝流程,而 Mac 系統上並不建議採用 Docker 環境來運行或開發 Swoft 項目,由於在 Mac for Docker 上共享磁盤的性能極其的差,會致使 Swoft 在啓動階段耗時極長。git

在 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 服務。github

在安裝完 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 的安裝。redis

在 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

 

 

咱們須要右鍵 Docker,點擊 Sign in / Create Docker ID 登陸咱們剛纔註冊的 Docker ID,以便得到咱們能夠從 DockerHub 中獲取公共鏡像的權限。segmentfault

因爲咱們是用於開發使用,因此咱們還須要受權一下共享目錄的權限,右鍵 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 的編排配置文件, 咱們看一下官方默認文件的內容:bash

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

相關文章
相關標籤/搜索