Windows(WSL2)安装Docker部署PHP多版本环境

一、安装和配置docker

1、下载docker,安装docker,安装时勾选WSL2引擎

2、通过微软商店下载WSL2,这里选用的时ubuntu22.04

3、Ubuntu下载后默认是WSL1,这时在docker配置Resources->WSL integration中是看不到Ubuntu的,通过以下命令更改WSL配置

# 查看WSL列表

wsl --list --verbose

# 设置Ubuntu-22.04为WSL2

wsl --set-version Ubuntu-22.04 2

这时再点击WSL integration中Refresh就可以看到Ubuntu22.04,开启后就可以在WSL中操作docker了。

二、创建容器

1、拉取ubuntu系统镜像

docker pull ubuntu:22.04

2、创建容器

docker run -itd \
    -p 80:80 \
    --name lnmpa \
    --mount type=bind,source=/mnt/e/project,target=/data/www \
    ubuntu:22.04 /bin/bash

以上命令为:端口映射80,,容器名称设置为lnmpa,挂载磁盘/mnt/e/project文件夹到容器中/data/www文件夹。

此时使用docker ps -a就可以看到刚才创建的容器。

3、进入容器

使用docker exec -it lnmpa /bin/bash即可进入容器进行环境配置操作。

三、配置环境

1、更新软件

使用以下命令,把软件和源更新到最新

apt-get update
apt-get upgrade -y

2、安装Nginx,与常规nginx操作一样

apt-get install -y nginx

3、添加PHP源且安装PHP7.1、PHP8.0

# 安装vim工具
apt-get install -y vim

# 添加PHP源
apt-get install -y software-properties-common
apt-get update
add-apt-repository ppa:ondrej/php
apt-get update

# 安装PHP7.1
apt-get install php7.1 php7.1-gmp php7.1-readline php7.1-sqlite3 php7.1-tidy php7.1-xml php7.1-bcmath php7.1-bz2 php7.1-intl php7.1-mbstring php7.1-soap php7.1-xsl php7.1-cli php7.1-common php7.1-curl php7.1-dev php7.1-fpm php7.1-gd php7.1-grpc php7.1-http php7.1-json php7.1-mbstring php7.1-mcrypt php7.1-mongodb php7.1-mysql php7.1-oauth php7.1-pgsql php7.1-opcache php7.1-redis php7.1-snmp php7.1-yac php7.1-zip

# 安装PHP8.0
apt-get install php8.0 php8.0-gmp php8.0-readline php8.0-sqlite3 php8.0-tidy php8.0-xml  php8.0-bcmath php8.0-bz2 php8.0-intl php8.0-mbstring php8.0-soap php8.0-xsl php8.0-cli php8.0-common php8.0-curl php8.0-dev php8.0-fpm php8.0-gd php8.0-grpc php8.0-http php8.0-mbstring php8.0-mcrypt php8.0-mongodb php8.0-mysql php8.0-oauth php8.0-pgsql php8.0-opcache php8.0-redis php8.0-snmp php8.0-yac php8.0-zip

然后在对应的php.ini配置中添加以下yac的cli开启使用的配置,不开启yac在cli模式下无法使用。

# 进入php7.1的cli配置文件夹
cd /etc/php/7.1/cli/conf.d
# 查看yac软链对应的地址
ll | grep yac
# 编辑对应的配置
vim /etc/php/7.1/mods-available/yac.ini
# 添加配置
yac.enable_cli = 1;

上面是PHP7.1添加yac的cli配置,其他版本照例配置即可。

接着需要启动fork模式的支持,在php.ini中添加以下配置

grpc.enable_fork_support = 1

4、安装swoole扩展

先用php-v命令查看当前php版本,如果不是8.0,参考Ubuntu切换PHP版本切换PHP版本到8.0

# 首先安装以下依赖
apt-get install -y libc-ares-dev
apt-get install -y libcurl4-openssl-dev

# 安装扩展
pecl install swoole

# 添加配置
echo 'extension=swoole.so' >> /etc/php/8.0/mods-available/swoole.ini
cd /etc/php/8.0/cli/conf.d/ && ln -s ../../mods-available/swoole.ini 20-swoole.ini
cd /etc/php/8.0/fpm/conf.d/ && ln -s ../../mods-available/swoole.ini 20-swoole.ini

#同时swoole.ini配置新增以下配置
swoole.use_shortname='Off'

5、安装redis

参考ubuntu安装redis

四、其他扩展安装及配置

1、配置nginx

由于之前配置的有linux的配置,直接修改配置文件中的路径,然后上传即可

2、安装supervisor

apt-get install supervisor

3、安装监听工具inotify

由于使用了hyperf框架,这个框架是cli模式,在开发期间调试需要反复重启启动文件,为了省事就写了个脚本,对项目文件监听,如果有修改php文件,就kill掉进程,重新启动,然后使用supervisor常驻脚本任务。

apt-get install -y inotify-tools

监听文件脚本如下:

# 监控排除.idea/runtime目录/.log/.swp文件
inotifywait -rq --exclude "(^.+.[^php]$)" -e modify {项目路径} | while read LINE
do
        kill -9 $(ps -ef | grep {项目名称APP_NAME} | grep -v grep | awk '{print $2}');
done;

4、启动各个服务

先用nginx -t命令检查nginx配置是否正常

再用service nginx start命令启动nginx

service php7.1-fpm start命令启动php7.1的fpm

service supervisor start启动常驻任务

五、镜像备份与使用

1、导出容器为镜像

docker commit lnmpa lnmpa:1.0.1

2、再次使用是生成新的容器

docker run -itd \
    -p 80:80 \
    --name lnmpa \
    --mount type=bind,source=/mnt/e/project,target=/data/www \
    lnmpa:1.0.1 /bin/bash


评论