一、結合 Apache 的基本運行
tp5 下載地址:http://www.thinkphp.cn/down.html
創建目錄 tp5,再分別創建 compose 文件夾(存放 compose 配置文件)和 web 文件夾(存放 tp5),然后使用 unzip 將 tp5 解壓到 tp5/web 目錄下。
一般來說可以將 Public 目錄作為網站根目錄,Apache 中只要掛載 Public 目錄,Fpm 中則需要掛載整個目錄。
1.1 Compose 編排
docker-compose.yml:
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的一致性:
啟動:
docker-compose up -d
二、URL 重寫
1、httpd.conf 配置文件開啟 mod_rewrite.so 模塊
2、修改 vhost
3、重啟容器
docker-compose restart
三、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); } }
訪問:
四、Redis 交互
- redis 鏡像地址:https://hub.docker.com/_/redis
- 初始配置模板:https://redis.io/topics/config
修改 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,最后刪除並重啟容器。
五、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 成功后,需要重啟該容器,然后就可以正常訪問了: