PHP Swoole Swoft

參考資料

Swoft是在Swoole之上構(gòu)建的一個(gè)高性能協(xié)程PHP全棧框架,內(nèi)置協(xié)程網(wǎng)絡(luò)服務(wù)器及常用協(xié)程客戶(hù)端勺爱,常駐內(nèi)存廷蓉,不依賴(lài)PHP-FPM畜隶,全異步非阻塞IO實(shí)現(xiàn)淌实,以類(lèi)似同步客戶(hù)端的寫(xiě)法實(shí)現(xiàn)異步客戶(hù)端的使用溉知,沒(méi)有負(fù)責(zé)的異步回調(diào)和繁瑣的yield,有類(lèi)似Go語(yǔ)言的協(xié)程刃宵、靈活的注解、強(qiáng)大的全局依賴(lài)注入容器徘公、完善的服務(wù)治理牲证、靈活強(qiáng)大的AOP、標(biāo)準(zhǔn)的PSR規(guī)范實(shí)現(xiàn)等关面,可用來(lái)構(gòu)建高性能的Web系統(tǒng)坦袍、API十厢、中間件、基礎(chǔ)服務(wù)等功能捂齐。

環(huán)境需求

  • PHP版本必須大于7.1
 swoft/component 2.0 requires php >7.1.0
  • 必須安裝PHP包管理工具composer
  • 必須安裝Redis的異步客戶(hù)端hiredis
  • 必須安裝PHP擴(kuò)展swoole蛮放,Swoole版本至少大于2.1
  • Swoole必須開(kāi)啟協(xié)程和異步Redis
  • PHP必須啟動(dòng)PDO擴(kuò)展

沖突解決

與Swoole有沖突的PHP擴(kuò)展:xdebugxhprof奠宜、blackfire包颁、zendtrace压真、uopz娩嚼,需要禁用或不安裝。

環(huán)境搭建

手工安裝Swoft

$ git clone https://github.com/swoft-cloud/swoft
$ cd swoft

# 使用composer中國(guó)鏡像
$ composer config -g repo.packagist composer https://packagist.laravel-china.org

# 不安裝dev依賴(lài)滴肿,加快速度岳悟。
$ composer install --no-dev
Cloning failed using an ssh key for authentication, enter your GitHub credentials to access private repos

$ composer config --global --auth github-oauth.github.com <token>

# 設(shè)置環(huán)境配置文件
$ cp .env.example .env
$ vim .env

Docker安裝Swoft

Docker

Docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包應(yīng)用及依賴(lài)到一個(gè)可移植的容器中泼差,然后發(fā)布到任何流行的Linux機(jī)器上贵少。Docker可以實(shí)現(xiàn)虛擬化,而且是完全使用沙箱機(jī)制拴驮,相互之間不會(huì)有任何接口春瞬。簡(jiǎn)單來(lái)說(shuō),可以理解為將代碼和運(yùn)行環(huán)境打包到一個(gè)容器套啤,然后發(fā)布到機(jī)器上宽气。

Windows10安裝Docker

由于本地測(cè)試使用,使用Windows10安裝Docker潜沦,建議使用Linux安裝Docker萄涯。

Docker For Windows

Docker For Windows 是新一代的平臺(tái). 官方也更支持. 支持Windows container 但是存在一個(gè)缺點(diǎn),必須使用 HyperV 的虛擬化平臺(tái)唆鸡。但是開(kāi)啟了HyperV 的角色之后Windows10 更像是運(yùn)行在HyperV 上面的一個(gè)虛擬機(jī)了, 也就意味著著 Workstation還有Virtualbox 這樣的虛擬化平臺(tái)就無(wú)法使用了涝影。

Docker的Windows10安裝包:https://hub.docker.com/editions/community/docker-ce-desktop-windows

Windows10版本需求:Docker Desktop requires Windows 10 Pro or Enterprise version 14393 to run

Docker可以支持在 Mac、Windows争占、Linux 上安裝燃逻,但是在 Windows10 系統(tǒng)中Docker for Windows目前只能在 64 位的 Windows10 專(zhuān)業(yè)版、企業(yè)版臂痕、教育版下才能安裝伯襟,Win7/Win8/Win10 家庭版需要通過(guò)Docker Toolbox來(lái)安裝。家庭版不支持Hyper-V握童,Docker Desktop是無(wú)法直接安裝的姆怪。

Windows家庭版

家庭版通過(guò)腳本開(kāi)啟Hyper-V

創(chuàng)建hyper-v.bat批處理文件,以管理員身份運(yùn)行。

$ vim hyper-v.bat
pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt

for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"

del hyper-v.txt

Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

確認(rèn)Windows10是否已經(jīng)開(kāi)啟Hyper-V

控制面板 -> 程序 -> 啟用或關(guān)閉Windows功能 -> 選中Hyper-V

Hyper-V

偽裝成專(zhuān)業(yè)版繞過(guò)安裝檢測(cè)

Ctrl+R運(yùn)行中輸入regedit打開(kāi)注冊(cè)表稽揭,定位到HKEY_LOCAL_MACHINE\software\Microsoft\Windows NT\CurrentVersion中選中EditionId俺附,右鍵修改,將“數(shù)值數(shù)據(jù)”修改為Professional溪掀,確認(rèn)關(guān)閉事镣。

regedit

可使用管理員權(quán)限運(yùn)行CMD命令實(shí)現(xiàn)同樣操作

REG ADD "HKEY_LOCAL_MACHINE\software\Microsoft\Windows NT\CurrentVersion" /v EditionId /T REG_EXPAND_SZ /d Professional /F

安裝成功后啟動(dòng)后出現(xiàn) Docker doesn't support your Windows version. Check documentation for minimum requirements

Docker不支持Windows家庭版

查看是否Windows10是否開(kāi)啟了虛擬化

Windows10開(kāi)啟虛擬化

啟動(dòng)BIOS的虛擬化設(shè)置,開(kāi)啟CPU虛擬化支持

進(jìn)入到BIOS后膨桥,找到Configuration選項(xiàng)或者Security選項(xiàng)蛮浑,然后選擇Virtualization,或者Intel Virtual Technology只嚣,

此路不通,選擇Docker Toolbox艺沼。

Docker Toolbox

Docker Toolbox 自帶一個(gè)VirtualBox的驅(qū)動(dòng), 能夠生成一個(gè)VirtualBox的虛擬機(jī)册舞,作為Docker deamon的運(yùn)行使用,一般設(shè)置2G 內(nèi)存 進(jìn)行運(yùn)行障般。它的優(yōu)點(diǎn)是自帶VB兼容性好调鲸,Windows 下面基本上都可以運(yùn)行。缺點(diǎn)是不支持Windows的container 只能運(yùn)行Linux container挽荡。

通過(guò)docker toolbox來(lái)安裝docker

Docker Toolbox

Docker的Toolbox有CE和EE版藐石,CE為免費(fèi)版,EE由公司支持的付費(fèi)版定拟。Docker for Windows是依賴(lài) Hyper-v 的于微,但是Docker Toolbox是用VirtualBox的

Docker Toolbox工具集主要包括:

  • Docker CLI 客戶(hù)端,用來(lái)運(yùn)行docker引擎創(chuàng)建鏡像和容器
  • Docker Machine. 可以讓你在windows的命令行中運(yùn)行docker引擎命令
  • Docker Compose. 用來(lái)運(yùn)行docker-compose命令
  • Kitematic. 這是Docker的GUI版本
  • Docker QuickStart shell. 這是一個(gè)已經(jīng)配置好Docker的命令行環(huán)境
  • Oracle VM Virtualbox. 虛擬機(jī)

由于Docker引擎的守護(hù)進(jìn)程使用Linux的內(nèi)核青自,所以不能直接在Windows中運(yùn)行Docker引擎株依。需要運(yùn)行Docker Machine命令docker-machine,在機(jī)器上創(chuàng)建或獲取一個(gè)Linux虛擬機(jī)延窜,用這個(gè)Linux虛擬機(jī)才可以在Windows系統(tǒng)上運(yùn)行Docker引擎恋腕。

下載安裝這些流程就不說(shuō)了,安裝時(shí)的選項(xiàng)需要注意下選項(xiàng)逆瑞。

Docker Toolbox

Docker Quickstart Terminal 啟動(dòng)報(bào)錯(cuò)

Running pre-create checks...
Error with pre-create check: "This computer is running Hyper-V. VirtualBox won't boot a 64bits VM when Hyper-V is activated. Either use Hyper-V as a driver, or disable the Hyper-V hypervisor. (To skip this check, use --virtualbox-no-vtx-check)"
Looks like something went wrong in step ′Checking if machine default exists′... Press any key to continue...

Windows 8.1 Hyper-V 與 VirtualBox, VMware 有沖突荠藤,即 Windows 8.1 Hyper-V 安裝后, VirtualBox 以及 VMware 無(wú)法創(chuàng)建或執(zhí)行 64bit 虛擬機(jī)。

直接把Hyepr-v禁用获高,管理員模式運(yùn)行 CMD

# 禁用Hyepr-v
$ bcdedit /set hypervisorlaunchtype off

# 啟用Hyepr-v
$ bcdedit /set hypervisorlaunchtype auto 

修改啟動(dòng)文件以允許它創(chuàng)建默認(rèn)的 VM

以管理員身份打開(kāi)C:\Program Files\Docker Toolbox\start.sh并修改

  # "${DOCKER_MACHINE}" create -d virtualbox $PROXY_ENV "${VM}"
  "${DOCKER_MACHINE}" create -d virtualbox --virtualbox-no-vtx-check $PROXY_ENV "${VM}"

使用管理員打開(kāi)cmd命令行

$ bcdedit /copy {current} /d "No Hyper-V"
已將該項(xiàng)成功復(fù)制到 {14cfe56b-60bb-11e9-82c8-0c96e6d1d776}
$ bcdedit /set {14cfe56b-60bb-11e9-82c8-0c96e6d1d776} hypervisorlaunchtype off
操作成功完成

Docker Quickstart Terminal 啟動(dòng)報(bào)錯(cuò)

Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default --type headless failed:
VBoxManage.exe: error: Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:01.647988 Power up failed (vrc=VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT, rc=E_FAIL (0X80004005))
Looks like something went wrong in step ′Checking status on default′... Press any key to continue...

這個(gè)錯(cuò)誤怎么辦哈肖?簡(jiǎn)單粗暴的方法,直接殺死VirtualBox進(jìn)程谋减,然后重啟Docker Quickstart Terminal牡彻。

關(guān)掉Hyper-V之后,重啟電腦。

打開(kāi)Docker Quickstart Terminal庄吼,開(kāi)啟之后會(huì)自動(dòng)加載一個(gè)Linux 虛擬機(jī)缎除。使用管理員身份打開(kāi)VirtualBox,可以看到有一個(gè)default的虛擬機(jī)正在運(yùn)行总寻。

VirtualBox default

進(jìn)入default虛擬機(jī)查看IP地址

$ ifconfig | grep eth
$ ifconfig eth1
inet addr:192.168.99.100

虛擬機(jī)操作命令

# 初始化 Virtual Box 的 default 虛擬機(jī)
$ docker-machine create –driver virtualbox default

# 查看虛擬機(jī)環(huán)境
$ docker-machine env
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\junchow\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env') DO @%i

# 查看虛擬機(jī)狀態(tài)器罐,注意如果在VirtualBox中打開(kāi)虛擬機(jī)后,命令行中將會(huì)顯示為stop狀態(tài)渐行。
$ docker-machine status

# 開(kāi)啟虛擬機(jī)
$ docker-machine start
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
Error setting up host only network on machine start: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe modifyvm default --nic2 hostonly --nictype2 82540EM --nicpromisc2 deny --hostonlyadapter2 VirtualBox Host-Only Ethernet Adapter #2 --cableconnected2 on failed:
VBoxManage.exe: error: Code E_FAIL (0x80004005) - Unspecified error (extended info not available)
VBoxManage.exe: error: Context: "LockMachine(a->session, LockType_Write)" at line 525 of file VBoxManageModifyVM.cpp

# 關(guān)閉虛擬機(jī)
$ docker-machine stop

# 重啟虛擬機(jī)
$ docker-machine restart

# 使用SSH連接虛擬機(jī)
$ docker-machine ssh default

一路折騰重啟后終于出現(xiàn)了

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com


Start interactive shell

junchow@DESKTOP-H6DQQNO MINGW64 /c/Program Files/Docker Toolbox
Docker Quickstart Terminal

執(zhí)行docker命令測(cè)試下

$ docker -v
Docker version 18.03.0-ce, build 0520e24302

$ docker version
Client:
 Version:       18.03.0-ce
 API version:   1.37
 Go version:    go1.9.4
 Git commit:    0520e24302
 Built: Fri Mar 23 08:31:36 2018
 OS/Arch:       windows/amd64
 Experimental:  false
 Orchestrator:  swarm

Server: Docker Engine - Community
 Engine:
  Version:      18.09.5
  API version:  1.39 (minimum version 1.12)
  Go version:   go1.10.8
  Git commit:   e8ff056dbc
  Built:        Thu Apr 11 04:50:00 2019
  OS/Arch:      linux/amd64
  Experimental: false

$ docker-compose -v
docker-compose version 1.20.1, build 5d8c71b2

# 顯示所有鏡像
$ docker images

Kitematic (Alpha)

Kitematic 是一個(gè)UI的container 管理界面轰坊,能夠 從docker hub 中拉取images 執(zhí)行, 并且查看web頁(yè)面 修改配置, 修改volume 等工作。打開(kāi)Kitematic祟印,登錄到DockerHub可獲取公共鏡像肴沫。

Kitematic

使用Docker Quickstart Terminal命令行非常不方便,還是使用Cmder進(jìn)行Docker的處理比較方便蕴忆。

Cmder
$ @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

容器操作命令

# 查看啟動(dòng)的容器信息
$ docker ps

# 查看所有容器
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                  NAMES
14ac8225efd9        nginx               "nginx -g 'daemon of…"   4 hours ago          Created                                            priceless_elbakyan
b2c0db6bc301        nginx               "nginx -g 'daemon of…"   4 hours ago          Created                                            vigilant_varahamihira
fd1384877d56        nginx               "nginx -g 'daemon of…"   4 hours ago          Created                                            amazing_dijkstra
af8d7a9a6023        nginx               "nginx -g 'daemon of…"   4 hours ago          Created                                            goofy_galileo
02a7f4f5f1ce        nginx               "nginx -g 'daemon of…"   4 hours ago          Exited (0) 10 minutes ago                          serene_bohr                                                                                                                                          

# 運(yùn)行一個(gè)容器
$ docker run -d -p 8888:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
27833a3ba0a5: Pull complete
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:ad250db8c3c15a6d4ee51a9e6947ca16a1010bf958c9db1d7223450ac88e1f28

# 查看啟動(dòng)的容器信息
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
02a7f4f5f1ce        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:8888->80/tcp   serene_bohr

# 進(jìn)入容器
# 使用該命令有一個(gè)問(wèn)題:當(dāng)多個(gè)窗口同時(shí)使用該命令進(jìn)入該容器時(shí)颤芬,所有的窗口都會(huì)同步顯示。
# 如果有一個(gè)窗口阻塞了套鹅,那么其他窗口也無(wú)法再進(jìn)行操作站蝠。
# 所以docker attach命令不太適合于生產(chǎn)環(huán)境,平時(shí)自己開(kāi)發(fā)應(yīng)用時(shí)可以使用該命令卓鹿。
$ docker attach 02a7f4f5f1ce

# 通過(guò)交互式終端(terminal)進(jìn)入到容器內(nèi)
$ docker exec -it 02a7f4f5f1ce bash
$ docker exec -it swoft bash

# 中止運(yùn)行狀態(tài)的容器
$ docker stop 02a7f4f5f1ce
02a7f4f5f1ce

# 停止所有容器才能刪除其中的鏡像
$ docker ps -a -q
1695c7d93229
$ docker stop $(docker ps -a -q)
unknown shorthand flag: 'a' in -a
See 'docker stop --help'.

# 刪除所有容器
$ docker rm $(docker ps -a -q)

# 將一個(gè)已經(jīng)處于中止?fàn)顟B(tài)的容器刪除
$ docker rm 02a7f4f5f1ce
02a7f4f5f1ce

鏡像操作命令

# 查看當(dāng)前容器中所有鏡像
$ docker images

# 查看鏡像信息
$ docker images nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              27a188018e18        10 hours ago        109MB

Docker無(wú)法刪除鏡像菱魔,由于是依賴(lài)容器。

Error response from daemon: conflict: unable to delete 493b8cc21299 (must be forced) - image is being used by stopped container 1695c7d93229

解決的方式是先刪除容器吟孙,在刪除鏡像澜倦。

$ docker ps 
$ docker rm container_id
$ docker images
$ docker rmi image_id
Kitematic

使用瀏覽器訪(fǎng)問(wèn)default虛擬機(jī)中的nginx:http://192.168.99.100:8888/

Kitematic

安裝Swoft

不管采用那種方式安裝Swoft,首先設(shè)置default虛擬機(jī)的共享目錄并重啟虛擬機(jī)拔疚,讓虛擬機(jī)中的文件與本地機(jī)器對(duì)應(yīng)起來(lái)肥隆。這樣才能在本地修改代碼后,docker中才能同步稚失。

VirtualBox6.0.6設(shè)置共享目錄

Docker安裝Swoft鏡像

Swoft官方提供了基于Debian的Docker鏡像栋艳,鏡像中已經(jīng)安裝配置好運(yùn)行Swoft所需組件以及依賴(lài)。使用鏡像可以開(kāi)箱即用句各,免去繁瑣的安裝配置吸占。

# 默認(rèn)沒(méi)有指定安裝目錄的位置,將會(huì)被安裝到/var/www/目錄下凿宾。
$ docker run -p 80:80 swoft/swoft
                         Server Information
********************************************************************
* HTTP | host: 0.0.0.0, port: 80, 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: 1, manager PID: 6)
You can use CTRL + C to stop run.

docker run命令簡(jiǎn)要說(shuō)明矾屯,詳細(xì)內(nèi)容可查看《Docker命令》

# docker run -d -p [宿主機(jī)端口]:[容器端口] -it -v [宿主機(jī)地址]:[容器地址] 容器名稱(chēng) /bin/bash
-d, --detach=false 表示指定容器運(yùn)行于前臺(tái)還是后臺(tái)初厚,默認(rèn)false表示后臺(tái)件蚕。
-p, --publish-all=false 指定容器暴露的端口
-i, --interactive=false 表示打開(kāi)STDIN標(biāo)準(zhǔn)輸入用于控制臺(tái)交互
-v, --volume=[] 給容器掛載存儲(chǔ)卷孙技,也就是掛載到容器的某個(gè)目錄。
-t, --tty=false 分配tty設(shè)備用來(lái)支持終端登錄排作,默認(rèn)為false牵啦。

值得注意的是docker run -p 80:80 swoft/swoft啟動(dòng)容器時(shí)將swoft服務(wù)作為容器的進(jìn)程,如果swoft進(jìn)程退出容器就會(huì)關(guān)閉妄痪,容器啟動(dòng)時(shí)會(huì)根據(jù)Dockfile文件去執(zhí)行php /var/www/swoft/bin/swoft start命令哈雏。

現(xiàn)在,查看下docker所有容器發(fā)現(xiàn)衫生,有一個(gè)名為practical_chaum編號(hào)為2c34c8c76813得容器正Up 3 minutes裳瘪。老鐵,沒(méi)錯(cuò)罪针,這個(gè)容器現(xiàn)在運(yùn)行正常彭羹。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
2c34c8c76813        swoft/swoft         "php /var/www/swoft/…"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   practical_chaum

容器的名字叫做practical_chaum,不太容易能記住泪酱,來(lái)修改下:

docker@default:~$ docker rename practical_chaum swoft
docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
2c34c8c76813        swoft/swoft         "php /var/www/swoft/…"   32 minutes ago      Up 32 minutes       0.0.0.0:80->80/tcp   swoft

另外皆怕,如果查看docker的鏡像會(huì)發(fā)現(xiàn):

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
swoft/swoft         latest              493b8cc21299        2 months ago        447MB

進(jìn)入swoft容器項(xiàng)目中,使用composer install加載composer.json的依賴(lài)并生成自動(dòng)加載文件/vendor/autoload.php西篓。

$ docker exec -i -t practical_chaum bash
root@2c34c8c76813:/var/www/swoft# composer install
# 如果項(xiàng)目服務(wù)沒(méi)有啟動(dòng)可以使用,我們現(xiàn)在已經(jīng)是正在運(yùn)行的狀態(tài)中憋活。
root@2c34c8c76813:/var/www/swoft# php bin/swoft start
The server have been running!(PID: 1)

看看swoft項(xiàng)目代碼

root@2c34c8c76813:/var/www/swoft# ls
CONTRIBUTING.md  LICENSE    README_CN.md  bin           composer.json  config             docker-compose.yml  phpunit.xml  resources  test
Dockerfile       README.md  app           changelog.md  composer.lock  dev.composer.json  phar.build.inc      public       runtime    vendor

瀏覽器訪(fǎng)問(wèn):http://192.168.99.100/

Swoft

swoft是運(yùn)行起來(lái)岂津,那我自己要寫(xiě)代碼怎么操作? 怎么搞悦即?怎么搞吮成?能不能把當(dāng)前容器的swoft項(xiàng)目同步到我的物理機(jī)上面,我每次修改后在同步到容器里面去呢辜梳?我猜想應(yīng)該是可以的粱甫,不過(guò)...

首先第一點(diǎn)需要明確的是在創(chuàng)建容器時(shí)不能直接使用docker run -p 80:80 swoft/swoft,而需要使用:

$ docker run -d -i -t -p 81:81 -v /share/swoft:/var/www/swoft --privileged --entrypoint="" --name swoft1 swoft/swoft /bin/bash

為什么呢作瞄?其中涉及到兩個(gè)非常重要的參數(shù)選項(xiàng):

  • -v /share/swoft:/var/www/swoft 共享目錄
  • --entrypoint=""啟動(dòng)點(diǎn)

可以觀察兩種不同方式的差異

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS                        NAMES
2c546044f222        swoft/swoft         "/bin/bash"              6 seconds ago       Up 5 seconds                    80/tcp, 0.0.0.0:81->81/tcp   swoft1
2c34c8c76813        swoft/swoft         "php /var/www/swoft/…"   About an hour ago   Exited (0) About a minute ago                                swoft

重點(diǎn)看COMMAND茶宵,在swoft容器中使php /var/www/swoft/…,而在swoft1容器中是/bin/bash宗挥。好吧乌庶,只要去理解--entrypoint選項(xiàng)的含義這個(gè)問(wèn)題就很好解答了。

本地安裝Swoft

本地Composer配置

$ composer -v
Composer version 1.8.5 2019-04-09 17:46:47
$ composer self-update
$ composer dump-autoload
$ composer clear-cache

切換鏡像為中國(guó)源 https://packagist.phpcomposer.com契耿,不過(guò)我打開(kāi)直接就是403瞒大,看來(lái)不用了。

$ composer config -g repo.packagist composer https://packagist.phpcomposer.com

切換到中國(guó)源搪桂,安裝或更新的時(shí)候報(bào)404錯(cuò) The "https://packagist.phpcomposer.com/p/provider-2019-04%248b0d8928e17b685afa0499b2b6241008aec0bcb7a26a9d0307e7d8642af87d12.json" file could not be downloaded (HTTP/1.1 404 Not Found)透敌。

$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
  [Composer\Downloader\TransportException]
  The "https://packagist.phpcomposer.com/p/provider-2019-04%248b0d8928e17b685afa0499b2b6241008aec0bcb7a26a9d0307e7d8642af87d12.json" file could not be downloaded (HTTP/1.1 404 Not Found)

算了,還是切換到 https://packagist.org,我這里是能打開(kāi)的酗电。

$ composer config -g repo.packagist composer https://packagist.org

本地PHP環(huán)境配置

$ php -v
PHP 7.2.1 (cli) (built: Jan  4 2018 04:28:54) ( NTS MSVC15 (Visual C++ 2017) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

預(yù)備使用share作為VirtualBox的共享目錄

設(shè)置共享目錄
$ cd d:\docker\share

下載安裝swoft

$ git clone https://github.com/swoft-cloud/swoft
$ cd swoft
$ cp .env.example .env
$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - This package requires php >=7.1 but your HHVM version does not satisfy that requirement.
  Problem 2
    - swoft/component 2.0 requires php >7.1.0 -> your PHP version (7.0.12) does not satisfy that requirement.
    - swoft/component 2.0 requires php >7.1.0 -> your PHP version (7.0.12) does not satisfy that requirement.
    - swoft/component 2.0 requires php >7.1.0 -> your PHP version (7.0.12) does not satisfy that requirement.
    - Installation request for swoft/annotation ^2.0 -> satisfiable by swoft/component[2.0].

淡淡地憂(yōu)傷:your PHP version (7.0.12) does not satisfy that requirement魄藕,為什么呢?注意檢查下PHP配置文件php.ini中是否打開(kāi)了openssl擴(kuò)展顾瞻。全是坑泼疑,composer報(bào)的錯(cuò)讓人誤導(dǎo)。

使用Docker Machine查看下本地虛擬機(jī)荷荤,也就是宿主機(jī)退渗,又稱(chēng)為主機(jī)的,不知道這樣表達(dá)對(duì)不蕴纳?

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
default   -        virtualbox   Stopped                 Unknown

其中名為default的虛擬機(jī)處于關(guān)閉狀態(tài)会油,使用docker-machine start default開(kāi)啟虛擬機(jī)。

$ docker-machine start default
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

關(guān)于Docker Machine命令的使用古毛,可參見(jiàn)《Docker Machine》翻翩。

開(kāi)啟default虛擬機(jī)后,查看下它的狀態(tài)稻薇,確認(rèn)處于運(yùn)行Running的狀態(tài)嫂冻。

$ docker-machine status default
Running 

接下來(lái),使用Docker Machine提供的SSH命令連接到default虛擬機(jī)中去塞椎。

$ docker-machine ssh default
   ( '>')   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

查看default虛擬機(jī)上存在的容器

docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS                NAMES
6a1c6b9b067a        swoft/swoft         "/bin/bash"         3 hours ago         Exited (255) About an hour ago   0.0.0.0:80->80/tcp   swoft

可以看到名為swoft的容器正處于Exited (255) About an hour ago狀態(tài)桨仿,由于處于Exited狀態(tài)可以先移除它。

docker@default:~$ docker rm swoft
swoft

由于使用VirtualBox將default虛擬機(jī)與本地Windows物理機(jī)做共享目錄案狠,因此在default虛擬機(jī)的share目錄下已經(jīng)同步了Windows中swoft目錄服傍。這里,使用-v參數(shù)將default虛擬機(jī)的/share/swoft目錄與swoft容器的/var/www/swoft目錄設(shè)置為數(shù)據(jù)共享骂铁。

docker@default:~$ docker run -d -i -t -p 80:80 -v /share/swoft:/var/www/swoft --name swoft swoft/swoft /bin/bash
0aeec5f5e6f8f7fb3864843dd08be7c22a421a76d349d89a6e2040deb1b638b1

docker run命令需要重點(diǎn)學(xué)習(xí)下吹零,加了個(gè)-rm選項(xiàng)表示如果啟動(dòng)失敗則刪除鏡像,不過(guò)這樣就看不到錯(cuò)誤日志了拉庵。

docker@default:~$ docker run -d -i -t --rm -p 80:80 -v /share/swoft:/var/www/swoft --name swoft swoft/swoft /bin/bash

現(xiàn)在查看所有容器灿椅,發(fā)現(xiàn)swoft容器的狀態(tài)仍然是Exited的,說(shuō)明出現(xiàn)錯(cuò)誤了名段。

docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
0aeec5f5e6f8        swoft/swoft         "php /var/www/swoft/…"   3 seconds ago       Exited (255) 3 seconds ago                       swoft

出錯(cuò)了怎么辦阱扬?當(dāng)然是看日志找線(xiàn)索。打開(kāi)docker logs swoft顯示swoft容器的日志伸辟,可以看到錯(cuò)誤就趴在那里麻惶,一動(dòng)不動(dòng)。

docker@default:~$ docker logs swoft

Fatal error: Uncaught Error: Class 'Swoole\Runtime' not found in /var/www/swoft/bin/swoft:7
Stack trace:
#0 {main}
  thrown in /var/www/swoft/bin/swoft on line 7

上面的錯(cuò)誤說(shuō)在swoft容器/var/www/swoft/bin/swoft文件的第7行出現(xiàn)了一個(gè)致命的錯(cuò)誤Swoole\Runtime類(lèi)不存在信夫,的確這是一個(gè)致命的錯(cuò)誤窃蹋,文件丟失了嗎卡啰,擴(kuò)展沒(méi)安裝嗎,猜測(cè)下警没。忽然想到一點(diǎn)匈辱,應(yīng)該在Windows里面調(diào)試好Swoft后在做這些操作,錯(cuò)誤不就可以避免了嗎杀迹?是的亡脸,應(yīng)該從源頭上去控制。好吧树酪,還是殺回去吧浅碾。

回到Windows下的swoft運(yùn)行下,果然不錯(cuò)续语,差之毫厘謬之千里垂谢。哎...

$ d:
$ cd docker\share\swoft
$ php bin\swoft -h
PHP Fatal error:  Uncaught Error: Class 'Swoole\Runtime' not found in D:\docker\share\swoft\bin\swoft:7
Stack trace:
#0 {main}
  thrown in D:\docker\share\swoft\bin\swoft on line 7

Fatal error: Uncaught Error: Class 'Swoole\Runtime' not found in D:\docker\share\swoft\bin\swoft:7
Stack trace:
#0 {main}
  thrown in D:\docker\share\swoft\bin\swoft on line 7

Windows峰弹,Windows响牛,Windows怎么搞,怎么搞毒涧,算了吧力试?

算了徙邻,整個(gè)問(wèn)題關(guān)鍵環(huán)節(jié)在于流程上:

  1. 運(yùn)行容器并設(shè)置共享目錄,重點(diǎn)在于入口點(diǎn)選項(xiàng)畸裳。
$ docker run -d -i -t -p 80:80 -v /share/swoft:/var/www/swoft --privileged --entrypoint="" --name myswoft swoft/swoft /bin/bash

這里重點(diǎn)看下兩個(gè)參數(shù)

  • --privileged 表示特權(quán)的意思鹃栽,可以設(shè)置容器中的內(nèi)核參數(shù)。使用該參數(shù)后容器內(nèi)的root擁有真正的root權(quán)限躯畴,否則容器內(nèi)的root只是外部的一個(gè)普通用戶(hù)權(quán)限,privileged啟動(dòng)的容器可以查看到很多主機(jī)上的設(shè)備薇芝,并且可以執(zhí)行mount掛載命令蓬抄,甚至允許在容器中啟動(dòng)容器。
  • --entrypoint="" 表示重置容器的入口夯到,默認(rèn)swoft的入口程序是bin/swoft腳本文件嚷缭,設(shè)置為空表示運(yùn)行容器時(shí)不自動(dòng)運(yùn)行bin/swoft腳本,因?yàn)槿萜鲀?nèi)swoft項(xiàng)目的依賴(lài)還沒(méi)有安裝耍贾,所以先啟動(dòng)容器然后進(jìn)入容器安裝依賴(lài)阅爽,最后再手工運(yùn)行swoft項(xiàng)目。
  1. 進(jìn)入容器下載安裝配置swoft項(xiàng)目
$ docker exec -i -t swoft1 bash
root@2c546044f222:

就這樣荐开,我終于在設(shè)置共享目錄成功的狀態(tài)下開(kāi)啟了容器付翁,爬起來(lái)了。不過(guò)晃听,下一步又該如何呢百侧?

未完待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砰识,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子佣渴,更是在濱河造成了極大的恐慌辫狼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辛润,死亡現(xiàn)場(chǎng)離奇詭異膨处,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砂竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)真椿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晦溪,你說(shuō)我怎么就攤上這事瀑粥。” “怎么了三圆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵狞换,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舟肉,道長(zhǎng)修噪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任路媚,我火速辦了婚禮黄琼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘整慎。我一直安慰自己脏款,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布裤园。 她就那樣靜靜地躺著撤师,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拧揽。 梳的紋絲不亂的頭發(fā)上剃盾,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音淤袜,去河邊找鬼痒谴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铡羡,可吹牛的內(nèi)容都是我干的积蔚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烦周,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼库倘!你這毒婦竟也來(lái)了临扮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤教翩,失蹤者是張志新(化名)和其女友劉穎杆勇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饱亿,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚜退,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彪笼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钻注。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖配猫,靈堂內(nèi)的尸體忽然破棺而出幅恋,到底是詐尸還是另有隱情,我是刑警寧澤泵肄,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布捆交,位于F島的核電站,受9級(jí)特大地震影響腐巢,放射性物質(zhì)發(fā)生泄漏品追。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一冯丙、第九天 我趴在偏房一處隱蔽的房頂上張望肉瓦。 院中可真熱鬧,春花似錦胃惜、人聲如沸泞莉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戒财。三九已至,卻和暖如春捺弦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孝扛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工列吼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苦始。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓寞钥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陌选。 傳聞我的和親對(duì)象是個(gè)殘疾皇子理郑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345