Docker+ThinkPHP5部署基础

本篇是使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3"
services:
fpm:
image: php:7.2.0-fpm-alpine3.6
container_name: fpm
volumes:
- /home/xugz/tp5/web:/php
networks:
mywebnet:
ipv4_address: 192.138.0.2
httpd:
image: httpd:2.4-alpine
container_name: httpd
ports:
- 8081:80
volumes:
- /home/xugz/tp5/web/public:/usr/local/apache2/htdocs/
- /home/xugz/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
networks:
mywebnet:
ipv4_address: 192.138.0.3

networks:
mywebnet:
driver: bridge
ipam:
config:
- subnet: 192.138.0.0/16

保存文件使用 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
2
3
4
FROM php:7.2.0-fpm-alpine3.6
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories && echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN docker-php-ext-install pdo_mysql

返回上级目录修改docker-compose.yml文件,增加fpm服务标签

1
2
3
4
5
fpm:
build:
context: ./build
dockerfile: phpfpm
……

redis拓展

在build里面新建一个Dockerfile文件,随便取,譬如叫做phpredis,安装redis依赖使用pecl来安装Redis扩展。参考命令

1
2
3
4
5
FROM php:7.2.0-fpm-alpine3.6
RUN apk add autoconf gcc g++ make
COPY ./redis-4.0.1 / # curl 'http://pecl.php.net/get/redis-4.0.1.tgz' -o redis-4.0.1.tgz
RUN pecl install redis-4.0.1 \
&& docker-php-ext-enable redis

返回上级目录修改docker-compose.yml文件,增加fpm服务build标签

1
2
3
4
5
fpm:
build:
context: ./build
dockerfile: phpredis
……

构建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
2
3
4
5
6
7
8
9
10
11
12
mysql:
image: mysql:5.7
container_name: mysqld
ports:
- 3306:3306
volumes:
- /home/xugz/mysql/conf:/etc/mysql/conf.d
- /home/xugz/mysql/data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
networks:
- mywebnet

然后使用 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.0dir /data

编辑TP5对应的compose配置docker-compose.yml文件,加入Redis的配置

1
2
3
4
5
6
7
8
9
10
11
redis:
image: redis:alpine
container_name: redis
ports:
- 6379:6379
volumes:
- /home/xugz/tp5/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /home/xugz/tp5/redisdata:/data # 这里的data和 conf/redis.conf中的dir配置保持一致
networks:
mywebnet:
ipv4_address: 192.138.0.10

修改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 redis-server -v

本文标题:Docker+ThinkPHP5部署基础

文章作者:xugz

发布时间:2019年12月03日 - 16:22

最后更新:2021年09月11日 - 16:37

原始链接:https://xlline.github.io/2019/12/03/Docker-tp5-base/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。