首頁  >  文章  >  後端開發  >  如何透過Docker建構一個swoft開發環境

如何透過Docker建構一個swoft開發環境

不言
不言原創
2018-07-26 10:26:143131瀏覽

這篇文章給大家分享的內容是關於如何透過Docker搭建一個swoft開發環境 ,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。

Swoft<br>#第一個基於 Swoole 原生協程的新時代 PHP 高效能協程全端組件化框架,內建協程網路伺服器及常用的協程客戶端,常駐內存,不依賴傳統的 PHP-FPM,全異步非阻塞 IO 實現,以類似於同步客戶端的寫入方法實現非同步客戶端的使用,沒有複雜的非同步回調,沒有繁瑣的 yield,有類似 Go 語言的協程、靈活的註解、強大的全局依賴注入容器、完善的服務治理、靈活強大的 AOP、標準的 PSR 規範實作等等,可以用來建立高效能的Web系統、API、中介軟體、基礎服務等等。

前言

Swoft 是一個在Swoole 之上建構的一個高效能協程PHP 全端框架,而SwoolePHPer 裡面是一個高階技能,所以在相關的環境安裝上也給許多人造成了很大的困擾,Swoft 更是如此,本文將透過Docker 以極為簡單的方式解決運行環境和開發環境的部署。

Docker

從百科上可以看到,Docker 是一個開源的應用程式容器引擎,讓開發者可以打包他們的應用程式以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面,也可以理解為我們可以將我們的程式碼和運行環境打包到一個容器中,打包好的容器可以發佈到任何流行的Linux機器上,這裡指的Linux機器其實並不準確,得益於Docker for Windows專案和Hyper-V的發展,Docker也可以以不錯的狀態運行在Windows 10系統上,但筆者不建議使用Docker for Windows 用於生產環境。

Docker 名詞概念

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

  • DockerfileDockerfileDocker映像 的描述文件,透過docker build# 命令來構建成為鏡像

  • 映像(Image),透過Dockerfile 建置得到,包含作業系統及執行環境

  • 容器(Container),容器是運行起來的映像,可理解為鏡像Docker生命週期中的建置和打包階段,而容器則是啟動和執行階段

  • 鏡像倉庫(Repository),用於儲存建置好的Docker映像 的倉庫,可理解為類似Git 的倉庫

安裝Docker

Docker 的安裝流程並不複雜,本節將介紹LinuxWindows 10 系統下的安裝流程,而Mac 系統上並不建議採用Docker 環境來運行或開發Swoft 項目,因為在Mac for Docker 上共享磁碟的效能極其的差,會導致Swoft 在啟動階段耗時極長。

Linux 上安裝Dockerdocker-compose

Linux 上透過yumapt-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 上安裝Dockerdocker-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建構一個swoft開發環境

我們需要右鍵Docker,點擊Sign in / Create Docker ID 登入我們剛才註冊的Docker ID,以便取得我們可以從DockerHub 取得公共映像的權限。

由於我們是用來開發使用,所以我們還需要授權一下共享目錄的權限,右鍵Docker 並點擊Settings,設定介面切換到 Shared Drives,勾選你專案程式碼所在的磁碟機代號,並點選右下角的Apply 即可完成授權。

Swoft 開發環境

修改官方預設<span style="font-size: 16px;">docker-compose.yml</span>檔案

我們透過指令git clone https://github.com/swoft-cloud/swoftGithub複製(clone) Swoft 項目,並使用專案自帶的docker-compose.yml 檔案來實作一個用於開發的環境,docker-compose.ymldocker- 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 bashdocker 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,当你看到下图即大功告成了!

如何透過Docker建構一個swoft開發環境

如果你绑定宿主机的端口不是80,则改成对应的即可;
如果访问看到的是 Redis connection failure host=127.0.0.1 port=6379 则说明缺少 Redis 服务,最简单直接的就是直接在当前容器内安装 Redis Server,直接执行 apt install -y redis-server && service redis-server start 即可完成安装以及启动操作了;

修改程式碼並使程式碼生效

SwoftPHP-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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn