window10下通过docker安装swoole,运行laravel-swoole服务

2022-11-10,,,,

最近公司压测一个接口,用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

window10下通过docker安装swoole,运行laravel-swoole服务的相关教程结束。

《window10下通过docker安装swoole,运行laravel-swoole服务.doc》

下载本文的Word格式文档,以方便收藏与打印。