本篇是使用Docker部署ThinkPHP运行环境的命令笔记。这里ThinkPHP框架版本为5.0.24。主要包括Apache下的基本运行、apache角度的URL重写、添加PHP拓展、连接数据库和结合redis的简单操作示例等。
下载框架 官网框架下载地址到本地,使用ftp方式上传到虚拟机tool目录中。
结合apache的基本运行
创建一个目录叫做tp5
在tp5中创建两个目录。一个放程序文件(web),一个放docker-compose.yml(compose)
解压框架压缩包至目录 /home/xugz/tp5/web,使用命令 cd tool && unzip mydata.zip -d ../tp5/web
解压至指定目录
如果没有安装zip和unzip。执行 sudo yum install zip unzip -y
我们需要将TP5web文件夹整个目录挂载到PHP-FPM容器,Apache容器仅仅挂载public文件夹,httpd.conf文件中fpm配置改为:ProxyPassMatch ^/(.*\.php)$ fcgi://192.138.0.2:9000/php/public/$1
docker-compose.yml文件中添加如下内容
1 | version: "3" |
保存文件使用 docker-compose up -d
编译运行成功后使用 curl localhost:8081/index.php
验证。
添加控制器、url重写
tp5默认有个控制器,位置在: application/index/controller/index.php
在我们开启防火墙端口sudo iptables -A INPUT -p tcp -m tcp --dport 8081 -j ACCEPT
后,可以在windows本机通过 虚拟机:端口/index.php
tp5创建控制可以用命令直接帮你创建:php think make:controller index/test
需要确保本地有PHP环境 当然我们也可以手工创建
开启apache重写模块
取消本行注释 LoadModule rewrite_module modules/mod_rewrite.so
在网站配置相关节点加入 AllowOverride all
完成后使用 docker-compose restart
让其重启重新构建容器虚拟机:端口/index
访问Index目录下index文件 虚拟机:端口/index/index/test
访问Index目录下index中的test方法虚拟机:端口/index/user
访问Index目录下user文件index方法 虚拟机:端口/index/user_index
访问Index目录下UserIndex文件index方法
添加PHP扩展
在容器中直接修改安装的话,容器删除后重新启动时,拓展和配置等都会丢失,所以我们在docker-compose文件中进行构建。在docker-compose.yml文件同目录创建新文件夹叫做build.
参考地址: https://hub.docker.com/_/php/
PDO_MYSQL扩展
默认的PHP–FPM容器没有PDO_MYSQL扩展,我们需要指定安装。
在build里面新建一个Dockerfile文件,注意文件名 我们这次随便取,譬如叫做phpfpm,配置镜像源并更新apk包后执行安装PDO_MYSQL扩展。参考命令
1 | FROM php:7.2.0-fpm-alpine3.6 |
返回上级目录修改docker-compose.yml文件,增加fpm服务标签
1 | fpm: |
redis拓展
在build里面新建一个Dockerfile文件,随便取,譬如叫做phpredis,安装redis依赖使用pecl来安装Redis扩展。参考命令
1 | FROM php:7.2.0-fpm-alpine3.6 |
返回上级目录修改docker-compose.yml文件,增加fpm服务build标签
1 | fpm: |
构建fpm服务设置 docker-compose build fpm
, 完成后我们发现他帮我们新建了一个镜像,原有镜像没有所需拓展,删除原有启动新镜像docker-compose stop fpm && docker-compose rm fpm && docker-compose up -d fpm
连接数据库
编辑TP5对应的compose配置docker-compose.yml文件,加入MySQL的配置
1 | mysql: |
然后使用 docker-compose up -d mysql
创建MySQL服务器容器
在应用程序web目录里application/database.php中修改MySQL配置,参考配置如下
配置完成后,可定义模型和数据库调用尝试验证。点我,我是隐藏的参考地址
结合redis容器基本操作
拉取官方镜像 docker pull redis:alpine
在conf目录下拉取redis配置文件 wget https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf
编辑redis.conf文件修改一些基本参数 如 bind 0.0.0.0
和 dir /data
编辑TP5对应的compose配置docker-compose.yml文件,加入Redis的配置
1 | redis: |
修改application/config.php中关于缓存相关配置,参考如图
然后使用 docker-compose up -d
创建redis服务器容器。成功的话使用 docker exec -it redis redis-cli
可进入Redis客户端。也可以写简单的测试验证,最简单的代码如图
使用浏览器访问 http://192.168.2.156:8081/news
即可看到测试数据
参考文档: https://hub.docker.com/_/redis/
上传文件 todo
默认模板配置已完成 参考地址。默认模板实例代码已创建 模板实例代码参考地址
此时我们刷新页面报错:mkdir():Permission denied。这是因为主机上的用户和容器里用户未对应导致的权限问题。
如果你是apline 3.4 版本在数据源中加入 echo http://nl.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories
然后执行 apk -no-cache add shadow
。是 alpine 3.6.则直接安装即可 apk add shadow
。通过 地址 找到对于 usermod文件的所在包。
完成之后执行 usermod -u 1000 www-data && groupmod -g 1000 www-data
修改用户www-data的用户以及群组ID为1000。搞定后要重启容器。
使用 cat /etc/passwd
命令查看用户归属组等信息
常见问题
浏览器访问报错 variable type error:array
默认输出类型导致解析异常。在应用程序web目录里application/config.php中修改,如 default_return_type = 'json'
wget文件报错 unable to resolve host address
因为VPS的本地DNS不通导致的,我们需要修改当前VPS的DNS。
修改 /etc/resolv.conf 文件,增加DNS nameserver 8.8.8.8保存退出后重试。
查看运行在docker中的redis版本
使用命令 `docker exec -it