1. 程式人生 > >使用Docker構建PHP開發環境

使用Docker構建PHP開發環境

PHP開發環境中的一些服務之間是需要通訊的,例如nginx和php-fpm,PHP和MySQL,PHP和redis等都需要通訊,如果採用宿主機埠對映的方式可以滿足網路通訊但是效率和安全性都會減弱,所以可以使用Docker的網路指令來構建一個互通的網路,下面列出想用的網路命令。

建立網路
docker network create dev-net  --driver bridge

其中driver bridge是橋接模式
檢視網路
docker network ls
刪除網路
docker network rm 網路名稱

假設建立了一個dev-net的網路,在使用docker run 建立容器的時候加上--network dev-net引數即可將容器加入此網路,加入到同一網路的服務是可以使用容器名稱進行通訊的,有了這層橋接網路PHP各個元件服務之間的通訊就很容易解決了,首先拉取映象

docker pull php:7.3-fpm
docker pull nginx
docker pull mysql:latest
docker pull redis:latest

假設開發者需要講程式碼放置在/home/wwwroot/default/,首先需要執行mkdir -p /home/wwwroot/default/ 建立目錄

然後執行各個容器例如:

#第一次執行時需要設定mysql密碼
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d --network dev-net mysql:latest \
--default-authentication-plugin=mysql_native_password

#nginx預設的web目錄是/usr/share/nginx/html 和宿主目錄 /home/wwwroot/default/做一個對映關係
docker run -p 80:80 -v /home/wwwroot/default/:/usr/share/nginx/html \
--name nginx80 --network dev-net -d nginx:latest

#PHP中的目錄也做同樣的對映
docker run --name php-fpm --network dev-net -d \
-v /home/wwwroot/default/:/usr/share/nginx/html php:7.3-fpm

#執行redis
docker run -d --name redis redis:latest

容器啟動後需要配置nginx和php-fpm之間進行通訊

#從nginx容器拷貝配置檔案到宿主機的當前目錄
docker cp nginx80:/etc/nginx/conf.d/default.conf ./
#編輯配置檔案
vi default.conf

將nginx的配置檔案修改如下

location ~ \.php$ {
     root           /usr/share/nginx/html;
     fastcgi_pass   php-fpm:9000;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;
     include        fastcgi_params;
}

拷貝配置檔案到nginx容器內

docker cp ./default.conf nginx80:/etc/nginx/conf.d/default.conf

進入nginx容器內部重新載入nginx配置

docker exec -it nginx80 /bin/bash
#重新載入nginx配置
/usr/sbin/nginx -s reload
#退出容器
exit

在宿主機的/home/wwwroot/default/目錄建立php檔案然後測試訪問效果,可以看到php能夠正常解析

安裝對應的擴充套件

#進入php-fpm容器
docker exec -it php-fpm /bin/bash
#例如安裝pdo pdo_mysql等擴充套件
docker-php-ext-install pdo pdo_mysql mysqli
#安裝redis時因為容器內的/usr/src/php/ext/目錄中沒有redis擴充套件包 所以需要先下載拷貝到容器內,否則會報錯
docker-php-ext-install redis

#pecl擴充套件也可以按如下方式執行(會自動下載對應的擴充套件包,安裝時出現兩個提示直接回車跳過即可)
pecl install redis-4.2.0 && docker-php-ext-enable redis

安裝完擴充套件後需要重啟器容

docker restart php-fpm

環境搭建完畢後使用php連線MySQL時會提示連線拒絕,可以通過修改mysql伺服器中mysql資料庫中的user表中的Host欄位的值來實現

#進入mysql容器內
docker exec -it mysql /bin/bash
#登入MySQL
mysql -uroot -proot
#進入資料庫
use mysql
#執行修改語句 語句中的php-fpm指的是php容器的名稱
update user set Host='php-fpm' where User='root' and Host='localhost';
flush privileges;
exit;
exit

設定完畢後再次測試,PHP可以連線到MySQL伺服器了.

使用phpMyAdmin操作容器內的MySQL資料庫方法

1.下載phpMyadmin到web目錄(只要能夠使用url地址訪問到的目錄或者子目錄都可以)

wget https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip

2.解壓

unzip phpMyAdmin-4.8.4-all-languages.zip
#重新命名
mv phpMyAdmin-4.8.4-all-languages phpmyadmin

3.修改配置

cd phpmyadmin
mv config.sample.inc.php config.inc.php
vi config.inc.php
將$cfg['Servers'][$i]['host'] = 'localhost';修改為$cfg['Servers'][$i]['host'] = 'mysql';

備註:$cfg['Servers'][$i]['host'] = 'mysql'; 中的mysql指的是mysql容器的名稱

接下來可以使用瀏覽器訪問phpmyadmin並登陸mysql