一,構建hyperf 鏡像
官網git https://github.com/hyperf/hyperf-docker
- 使用dockerfile構建鏡像
根據需要這里我使用8.1 swoole版本的鏡像
在/home/hyperfdocker 目錄中新建一個Dockerfile文件,將這個git上的Dockerfile內容復制粘貼進去
docker build -t hyperf:php8.1 .
因為我的網絡沒有科學上網,失敗了,換另一種方法
- 進入docker鏡像倉庫下載hyperf官方鏡像
https://hub.docker.com/r/hyperf/hyperf
此處我們直接下載鏡像
docker pull hyperf/hyperf:8.1-alpine-v3.11-swoole
docker images
二,生成容器
docker run -d --name hyperf -v 宿主機代碼目錄: 容器內代碼目錄 -p 宿主機端口:容器端口(默認9501) -it --privileged -u root hyperf/hyperf:7.4-alpine-v3.11-swool
docker run -d --name hyperf -v /home/hyperfdocker:/www -p 9701:9501 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:8.1-alpine-v3.16-swoole
查看容器
三,安裝hyperf并運行
進入容器
docker exec -it hyperf bash
cd到工作目錄
cd /www
修改composer 國內阿里云源 加速下載 (如提示composer命令不存在,需要安裝composer,或在宿主機執行)
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
通過composer下載安裝代碼
composer create-project hyperf/hyperf-skeleton
注意這里必須安裝PHP >= 8.1,否則安裝不成功一直報錯
composer完成后cd到hyperf-skeleton目錄下運行項目
php bin/hyperf.php start
注意這里有個坑,如果我們composer安裝的時候選擇安裝了mysql,redis等模塊,那就須要配置連接信息,否則會一直報錯,start啟動不起來(mysql不會報錯)
假設我們開啟了mysql模塊,我本機已經啟動了一個mysql容器,我們就去修改配置文件,然后連接mysql數據庫
容器之間的互聯是使用共享網絡指定共同的內網ip進行橋接連通,第一步創建共享網絡。第二步容器運行時指定好網絡就行
- 查看容器列表
docker ps -a
- 查看容器網絡
- 查看docker 鏡像/容器的元數據
docker inspect mysql5
前面其實我已經安裝了一個lnmp環境,這里我想就用hyperf容器來聯通lnmp環境中的mysql容器
docker inspect lnmp_default
這里我們采用創建自定義網絡的方式來連通,通過創建自定義網絡,可以為容器提供一個獨立的網絡環境,使得容器可以相互通信,并與其他網絡資源進行交互。自定義網絡提供了更靈活和可擴展的容器互聯方式,相對于過時的 --link 參數更加推薦和強大
創建自定義網絡后,可以將容器連接到該網絡,并使用容器名稱或服務名稱進行容器間通信。這種方式更加標準化,具備更好的擴展性和管理能力。
所以我們只需要將hyperf 容器 加入 mysql5容器網絡lnmp_default即可,這里也有兩種方法,一種是在 run初始化容器的是使用 --network lnmp_default
聲明他的網絡,另外一種就是容器已經run好了,那現在直接加入就行了
docker network connect lnmp_default hyperf
然后再使用 docker inspect lnmp_default
查看,發現已經包含進來了
如要要驗證,可以使用兩邊互相ping通來測試
- hyperf配置mysql連接
修改.env配置文件
注意,
這里面的db_host 是剛剛查看的mysql5 容器的ip
db_port 是容器內部端口不是映射端口
在項目目錄\hyperf-skeleton\config目錄下打開routes.php文件,添加路由配置
Router::addGroup('/index/',function (){Router::get('test','App\Controller\IndexController@test');
});
在項目目錄\hyperf-skeleton\app\Controller下找到IndexController.php文件,新增一個action,文件內容修改如下:
public function test(){$users = Db::select('SELECT * FROM `user`'); // 返回arrayreturn ['users' => $users,];}