使用 Docker / Docker Compose 部署 Swoft 應用

Swoft

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

Swoft 的 Docker 鏡像

忽然白話文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,充分利用鏡像資源)

Docker 部署 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

Docker Composer 部署 Swoft

宿主機仍需安裝基本的 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

在未安裝 PHP 環境的宿主機上部署 swoft

前面兩種部署 swoft 的方法都須要在宿主機上安裝 php 基礎環境來使用 composer 安裝好本地 swoft 項目的依賴組件,才能與 swoft 鏡像的工做目錄掛載,啓動容器(由於容器的入口命令就是直接啓動 swoft,若是咱們掛載本地未安裝好依賴的 swoft 項目到鏡像工做目錄,那容器就會啓動失敗退出了),下面咱們介紹一種不須要在宿主機上安裝 php / composer 的方法。

一、拉取 swoft(拉取就好,不須要安裝依賴)

git clone git@github.com:swoft-cloud/swoft.git && cd swoft

直接使用 docker 鏡像

# -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

編輯 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 的工做,徹底利用鏡像提供的現成的環境~

相關文章
相關標籤/搜索