0%

Docker 部署 ThinkPHP 5.x 容器

构建 Dockerfile 文件

使用 Docker 部署 thinkphp 项目中,作者介绍了三点注意事项:

  1. thinkphp 的入口文件在 public 目录下,所以需要将VirtualHostDocumentRoot指向 public 目录;
  2. thinkphp 需要设置伪静态,Apache 需要加载mod_rewrite.so模块;
  3. 下载相应版本的 thinkphp 放到项目根目录下。

并给出了如下的 Dockerfile 配置:

1
2
3
4
5
6
7
8
9
10
11
FROM php:5.6-apache

ENV THINKPHP_VERSION=5.0.21

RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load \
&& sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf \
&& sed -i 's/\/var\/www\/html/\/var\/www\/html\/public/g' /etc/apache2/sites-enabled/000-default.conf
RUN curl -OL https://github.com/top-think/framework/archive/v$THINKPHP_VERSION.tar.gz \
&& tar xvf v$THINKPHP_VERSION.tar.gz && mv framework-$THINKPHP_VERSION thinkphp

ADD . /var/www/html/

不过需要注意到,在仓库 https://github.com/top-think/framework.git 中,只提供了 thinkphp 框架,并没有提供相应的 Web 开发框架,而这可以在仓库 https://gitee.com/liu21st/thinkphp.git 中找到。

据此,修改后的 Dockerfile 配置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM php:5.6-apache

RUN sed -i 's/deb.debian.org\|security.debian.org/mirrors.tuna.tsing.edu.cn/g' /etc/apt/sources.list && \
apt update && apt install -y git

ENV THINKPHP_VERSION=5.0.22

RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load \
&& sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf \
&& sed -i 's#/var/www/html#/var/www/html/tp5/public#g' /etc/apache2/sites-enabled/000-default.conf

RUN git clone --depth 1 -b v$THINKPHP_VERSION https://gitee.com/liu21st/thinkphp.git ./tp5 && \
git clone --depth 1 -b v$THINKPHP_VERSION https://gitee.com/liu21st/framework.git ./tp5/thinkphp

ADD . /var/www/html/

主要修改的地方有:

  • 第 3-4 行:将官方 apt 源修改为清华镜像源,并下载 git 工具
  • 第 10 行:修改DocumentRoot指向的public 目录位置
  • 第 12-13 行:拉取 ThinkPHP 5.0.22 的 public 等文件和 thinkphp 框架

创建并运行 ThinkPHP 容器

基于 Dockerfile 文件,可以构建如下的 shell 脚本文件 run-tp5.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
THINKPHP_VERSION=5.0.22

if [[ -n $(docker image ls | grep -v local/thinkphp:v${THINKPHP_VERSION}) ]]; then
echo "create local image 'local/thinkphp:v${THINKPHP_VERSION}'"
docker build -f <path-to-Dockerfile> -t local/thinkphp:v${THINKPHP_VERSION} .
fi

if [[ -n $(docker container ls | grep -v mytp5) ]]; then
echo "create container 'mytp5'"
docker create -p 8080:80 --name mytp5 local/thinkphp:v${THINKPHP_VERSION}
fi

if [[ -n $(docker ps | grep -v mytp5 )]]; then
echo "run conatiner 'mytp5'"
docker start mytp5
fi

echo "container 'mytp5' has started"

run-tp5.sh 脚本主要做了三件事:

  1. 基于 Dockerfile 文件在当前目录创建本地镜像 local/thinkphp:v5.0.22
  2. 基于本地镜像 local/thinkphp:v5.0.22 创建容器 mytp5,并将容器内部端口 80 映射为外部端口 8080
  3. 运行容器 mytp5

容器启动后,运行命令 docker exec -it mytp5 /bin/bash 便可以进入容器内部,修改 ThinkPHP 容器配置。

在浏览器中访问地址127.0.0.1:8080,看到如下欢迎界面表明 ThinkPHP 服务部署成功。

其他

如果在项目中用到了 mysql 等扩展,则需要使用 docker-php-ext-install 命令安装相应的扩展,在 Dockerfile 中添加如下代码:

1
2
3
4
5
6
7
# 安装 postgresql 扩展
RUN apt-get update && apt-get install -y libpq-dev \
&& docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
&& docker-php-ext-install pdo pdo_pgsql

# 安装mysql扩展
RUN docker-php-ext-install pdo pdo_mysql

参考链接

  1. 使用Docker部署thinkphp项目