最近公司壓測一個接口,用laravel框架,業務邏輯就是從緩存中取數據,tps總是上不去,於是決定換下swoole來替換php-fpm,來處理php請求,tps比原來高了好幾倍。
現在有個問題就是windows下對swoole支持不是很好,打算利用docker鏡像來解決環境問題,php代碼可以掛載到鏡像指定目錄下。下面簡單介紹下操作步驟
1 安裝docker19.03
官方下載地址: https://download.docker.com/win/stable/Docker%20Desktop%20Installer.exe
安裝完成后需要修改國內鏡像,不然下載docker鏡像龜速。修改操作
1.1 右鍵小鯨魚圖標,選擇setting
1.2 選擇 Docker Engine , 加入 163鏡像地址 ,"registry-mirrors": [ "http://hub-mirror.c.163.com"]
2 docker下 安裝 ubuntu鏡像 [ windows 下 swoole_set_process_name會報錯]
打開powershell,下面命令在上面運行
下載ubuntu鏡像 docker pull ubuntu
簡單啟動 docker run -it -d --name=ls-demo ubuntu /bin/bash
進入容器 docker attach ls-demo
docker 一些基本操作介紹(安裝中可能要用到的命令)
復雜點的啟動( -i: 交互式操作 -t: 終端 -d 后台啟動 --name 命名啟動的容器的名稱 -p 映射容器端口到本機 -v 掛載本地目錄到容器)
docker run -it -d -p 本機端口:容器端口 --name=容器的名稱 -v "本機路徑":容器路徑 鏡像名 鏡像中命令
查看鏡像
docker images
啟動鏡像(啟動鏡像后會新建一個容器,可以使用鏡像的hash-id 的部分,或者鏡像名稱啟動)
docker run 16a 或者 docker run n_ubuntu
docker run -it 16a /bin/bash 或者 docker run -it n_ubuntu /bin/bash 交互式終端啟動
刪除鏡像(假如鏡像有對應的容器啟動中需要先關閉對應容器,再刪除鏡像)
docker image rm 16a 或者 docker rmi n_ubuntu
查看容器名稱(-a 顯示所有,包括停止的容器)
docker ps -a
查詢最新創建的容器
docker ps -l
啟動容器(唯一hash容器id和容器名稱等價,下面的所有操作用兩者皆可)
docker start d1b 或者 docker start ls-demo
關閉容器
docker stop d1b 或者 docker stop ls-demo
刪除容器(start中的容器需要stop之后再刪除)
docker rm ls-demo
進入容器[上圖容器](容器名只要唯一就行, 可以打部分字符串)
docker attach ls-demo
提交容器為本地鏡像
docker commit ls-demo 新鏡像名字
3 ubuntu鏡像中安裝php環境
修改源
cp /etc/apt/sources.list /etc/apt/sources.list.bak &&
echo '' > /etc/apt/sources.list &&
echo '
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
' > /etc/apt/sources.list
修改完后更新源
apt-get update
安裝必要工具 net-tools 包含netstat iputils-ping 包含ping
apt-get -y vim install net-tools wget curl iputils-ping
添加php源
apt-get -y install software-properties-common && add-apt-repository ppa:ondrej/php && apt-get update
安裝過程中會選擇地區,城市
6 Asia 70 Shanghai
安裝php以及一些常用擴展
apt-get -y install php7.2-dev php7.2-cli php7.2-xml php7.2-mysql php7.2-mbstring php7.2-curl php7.2-bcmath php7.2-zip
4 swoole擴展簡單安裝
mkdir -p /tmp/php-extension &&
cd /tmp/php-extension &&
wget https://pecl.php.net/get/swoole-4.5.1.tgz &&
tar zxvf swoole-4.5.1.tgz &&
cd swoole-4.5.1 &&
phpize &&
./configure &&
make && make install
擴展寫入php.ini
sed -i "924 i extension=swoole.so" /etc/php/7.2/cli/php.ini
查看php擴展
php -m|grep swoole
5 laravel項目啟動laravel-swoole
假如本地有laravel項目,可以把本地目錄掛載到docker容器下,代碼可以git倉庫拉推都不影響
ps:假如原來項目中訪問的mysql,redis等在本地話,那么掛載后需要把對應的ip,localhost|127.0.0.1 替換成 容器內部訪問宿主機的ip
容器中連接宿主機(本地),下面是兩種查看宿主ip 的方法
ping host.docker.internal 查看對應ip,C類內網地址
本地windows安裝目錄查看,比如 C:\ProgramData\DockerDesktop\tmp-d4w\host.docker.internal B類內網地址
退出當前容器
shell命令中 exit
把當前安裝了php-swoole擴展的容器提交一個鏡像
docker commit ls-demo swoole-php-ubuntu
啟動剛生成的帶有自己安裝php-swoole環境的鏡像,掛載本地的laravel項目
docker run -it -d -p 本機端口:容器端口 -v "本機路徑":容器路徑 swoole-php-ubuntu
下面介紹容器中安裝laravel並運行laravel-swoole
下載安裝composer並且更換阿里鏡像
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" &&
php composer-setup.php &&
php -r "unlink('composer-setup.php');" && mv composer.phar /usr/local/bin/composer &&
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer下載laravel5.8
mkdir -p /data/www && cd /data/www &&
composer create-project --prefer-dist laravel/laravel ls-demo 5.8.*
安裝laravel-swoole v2.6.67
cd ls-demo && composer require swooletw/laravel-swoole v2.6.67
添加配置文件config目錄下生成3個,swoole開頭的,這里只用到了swoole_http.php
php artisan vendor:publish --tag=laravel-swoole
修改對應配置
sed -i "177 i SwooleTW\\\\Http\\\LaravelServiceProvider::class," config/app.php &&
sed -i "44 a SWOOLE_HTTP_DAEMONIZE=true" .env
啟動查看端口
php artisan swoole:http start && curl 127.0.0.1:1215
laravel-swoole wiki 地址[關於配置啟動可以查看]
https://github.com/swooletw/laravel-swoole/wiki
總結:
上面命令批量匯總
1 下載ubuntu鏡像並啟動
docker pull ubuntu
docker run -it --name=ls-demo ubuntu /bin/bash
2 批量執行
cp /etc/apt/sources.list /etc/apt/sources.list.bak &&
echo '' > /etc/apt/sources.list &&
echo '
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
' > /etc/apt/sources.list &&
apt-get update &&
apt-get -y install vim net-tools wget curl iputils-ping &&
apt-get -y install software-properties-common && add-apt-repository ppa:ondrej/php && apt-get update &&
apt-get -y install php7.2-dev php7.2-cli php7.2-xml php7.2-mysql php7.2-mbstring php7.2-curl php7.2-bcmath php7.2-zip &&
mkdir -p /tmp/php-extension &&
cd /tmp/php-extension &&
wget https://pecl.php.net/get/swoole-4.5.1.tgz &&
tar zxvf swoole-4.5.1.tgz &&
cd swoole-4.5.1 &&
phpize &&
./configure &&
make && make install &&
sed -i "924 i extension=swoole.so" /etc/php/7.2/cli/php.ini &&
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" &&
php composer-setup.php &&
php -r "unlink('composer-setup.php');" &&
mv composer.phar /usr/local/bin/composer &&
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ &&
mkdir -p /data/www &&
cd /data/www &&
composer create-project --prefer-dist laravel/laravel ls-demo 5.8.* &&
cd ls-demo && composer require swooletw/laravel-swoole v2.6.67 &&
php artisan vendor:publish --tag=laravel-swoole &&
sed -i "177 i SwooleTW\\\\Http\\\LaravelServiceProvider::class," config/app.php &&
sed -i "44 a SWOOLE_HTTP_DAEMONIZE=true" .env &&
php artisan swoole:http start &&
curl 127.0.0.1:1215 &&
ps aux|grep swoole