Docker下ThinkPHP5的運行

1、結合 Apache 的基本運行

tp5 下載地址:http://www.thinkphp.cn/down.htmlphp

建立目錄 tp5,再分別建立 compose 文件夾(存放 compose 配置文件)和 web 文件夾(存放 tp5),而後使用 unzip 將 tp5 解壓到 tp5/web 目錄下。html

通常來講能夠將 Public 目錄做爲網站根目錄,Apache 中只要掛載 Public 目錄,Fpm 中則須要掛載整個目錄。mysql

1.1 Compose 編排

docker-compose.yml:linux

version: "3"
services:
  fpm:
   image: php:7.2.2-fpm-alpine
   container_name: fpm
   volumes:
      - /home/txl/tp5/web:/php
   networks:
      mywebnet:
       ipv4_address: 192.148.0.2
  httpd:
   image: httpd:2.4.33-alpine
   container_name: httpd
   ports:
      - 80:80
   volumes:
      - /home/txl/tp5/web/public:/usr/local/apache2/htdocs/
      - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
   networks:
      mywebnet:
       ipv4_address: 192.148.0.3

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

須要注意 vhosts 中配置的反向代理Ip和Fpm內網Ip的一致性:web

啓動:redis

docker-compose up -d

2、URL 重寫

一、httpd.conf 配置文件開啓 mod_rewrite.so 模塊sql

二、修改 vhostdocker

三、重啓容器thinkphp

docker-compose restart

3、MySQL 數據庫鏈接

修改 docker-compose.yml,將 MySQL 服務加入編排:數據庫

mysql:
   image: mysql:5.7.22
   container_name: mysqld
   ports:
     - 3306:3306
   volumes:
     - /home/txl/mysql/conf:/etc/mysql/conf.d
     - /home/txl/mysql/data:/var/lib/mysql
   environment:
     - MYSQL_ROOT_PASSWORD=123
   networks:
     mywebnet:
       ipv4_address: 192.148.0.4

在 TP 數據庫配置文件 application/database.php 中修改相應配置,寫一個數據庫鏈接測試方法:

<?php
namespace app\index\controller;
use think\Db;

class Index
{
    public function test()
    {
        $get_users = Db::table('user')->select();
        var_export($get_users);
    }
}

訪問:

若是報如下錯誤說明 fpm 容器還沒有安裝 pdo_mysql 擴展:

擴展安裝方法能夠參考:FPM 容器安裝 PHP 擴展

4、Redis 交互

修改 redis 基本配置:

bind 0.0.0.0   # 全部IP可連 
dir /data      # redis數據目錄
...

修改 docker-compose.yml,將 Redis 服務加入編排:

redis:
    image: redis:4-alpine
    container_name: redis
    ports:
     - 6379:6379
    volumes:
     - /home/txl/conf/redis.conf:/usr/local/etc/redis/redis.conf
     - /home/txl/tp5/redisdata:/data
    networks:
      mywebnet:
       ipv4_address: 192.138.0.5

在 TP 配置文件 application/config.php 中修改 Reids 配置:

'cache'                  => [
        // 驅動方式
        'type'   => 'redis',
        'host'    => '180.76.232.93',
        'port'    => '6379',
        // 緩存保存目錄
        //'path'   => CACHE_PATH,
        // 緩存前綴
        'prefix' => '',
        // 緩存有效期 0表示永久緩存
        'expire' => 0,
    ],

寫一個測試方法,判斷 redis 中是否有用戶列表,有則返回,無則從數據庫讀取並存入 redis:

<?php
namespace app\index\controller;
use think\Db;
use think\Cache;

class Index
{
    public function test()
    {
        $get_users = Cache::get("user");
        if(!$get_users)
        {
            $get_users = Db::table('user')->select();
            Cache::set("user",$get_users,200);
        }
        return $get_users;
    }
}

訪問:

進入 redis 容器查看剛剛存放進來數據:

若是報如下錯誤說明 fpm 容器還沒有安裝 redis 擴展:

擴展安裝套路和上面安裝 pdo_mysql 差很少,可是 redis 擴展須要使用 pecl 安裝。dockerfile 以下:

FROM php:7.2.2-fpm-alpine
RUN apk add autoconf gcc g++ make
RUN pecl install redis-4.0.0 \
    && docker-php-ext-enable redis

而後就是修改 docker-compose.yml 文件下的相應 build 節點,執行 docker build,最後刪除並重啓容器。

5、alpine 容器下的權限問題

建立文件上傳表單:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br> 
<input type="submit" value="上傳" /> 
</form> 

upload 接收處理方法:

public function upload(){
    // 獲取表單上傳文件 例如上傳了001.jpg
    $file = request()->file('image');
    // 移動到框架應用根目錄/uploads/ 目錄下
    $info = $file->move( '../uploads');
    if($info){
        // 成功上傳後 獲取上傳信息
        // 輸出 jpg
        echo $info->getExtension();
        // 輸出 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        // 輸出 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename(); 
    }else{
        // 上傳失敗獲取錯誤信息
        echo $file->getError();
    }
}

執行報錯:

進入 fpm 容器,以前將程序根目錄映射到 /php 下,查看該目錄文件:

能夠發現,網站程序目錄下全部文件所屬的用戶和用戶組都是1000。這是由於以前執行建立 fpm 容器時的用戶是我新建的用戶 txl,而它的 uid 以及 gid 正好都是1000:

而 fpm 容器中執行操做的默認用戶是 www-data,它的 uid 和 gid 都是82。所以該用戶天然無權限操做網站程序目錄的文件:

解決:將 www-data 用戶的 uid 以及 gid 修改成1000:

usermod -u 1000 www-data
groupmod -g 1000 www-data

but,基於 alpine 的容器默認沒有這兩個命令,須要先執行命令:

apk --no-cache add shadow

另外,在 alpine3.4 或更早版本,首先還須要加入數據源而後在執行上面的命令:

echo http://nl.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories

修改 uid 和 gid 成功後,須要重啓該容器,而後就能夠正常訪問了:

相關文章
相關標籤/搜索