參考資料
- Swoole文檔中心 https://wiki.swoole.com/
- Swoft官方文檔 https://doc.swoft.org/
- DockerHub官網(wǎng) https://hub.docker.com
- Docker For Windows地址 https://hub.docker.com/editions/community/docker-ce-desktop-windows
- DockerToolbox地址 http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
- Swoft的Github倉(cāng)庫(kù) https://github.com/swoft-cloud/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ò)展:xdebug
、xhprof
奠宜、blackfire
包颁、zend
、trace
压真、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ú)法直接安裝的姆怪。
家庭版通過(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
偽裝成專(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)閉事镣。
可使用管理員權(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
查看是否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下載地址:http://mirrors.aliyun.com/docker-toolbox/windows/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 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)行总寻。
進(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
執(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可獲取公共鏡像肴沫。
使用Docker Quickstart Terminal命令行非常不方便,還是使用Cmder進(jìn)行Docker的處理比較方便蕴忆。
$ @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
使用瀏覽器訪(fǎng)問(wèn)default虛擬機(jī)中的nginx:http://192.168.99.100:8888/
安裝Swoft
不管采用那種方式安裝Swoft,首先設(shè)置default虛擬機(jī)的共享目錄并重啟虛擬機(jī)拔疚,讓虛擬機(jī)中的文件與本地機(jī)器對(duì)應(yīng)起來(lái)肥隆。這樣才能在本地修改代碼后,docker中才能同步稚失。
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是運(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的共享目錄
$ 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é)在于流程上:
- 運(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)目。
- 進(jìn)入容器下載安裝配置swoft項(xiàng)目
$ docker exec -i -t swoft1 bash
root@2c546044f222:
就這樣荐开,我終于在設(shè)置共享目錄成功的狀態(tài)下開(kāi)啟了容器付翁,爬起來(lái)了。不過(guò)晃听,下一步又該如何呢百侧?
未完待續(xù)...