使用Docker构建PHP开发环境

PHP开发环境中的一些服务之间是须要通讯的,例如nginx和php-fpm,PHP和MySQL,PHP和redis等都须要通讯,若是采用宿主机端口映射的方式能够知足网络通讯可是效率和安全性都会减弱,因此可使用Docker的网络指令来构建一个互通的网络,下面列出经常使用的网络命令。php

建立网络html

docker network create dev-net  --driver bridge

查看网络mysql

docker network ls

删除网络nginx

docker network rm 网络名称

假设建立了一个dev-net的网络,在使用docker run 建立容器的时候加上–network dev-net参数便可将容器加入此网络,加入到同一网络的服务是可使用容器名称进行通讯的,有了这层桥接网络PHP各个组件服务之间的通讯就很容易解决了,首先拉取镜像web

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/建立目录
而后执行启动各个容器 例如:redis

#第一次运行时须要设置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  --network dev-net  redis:latest

容器启动后须要配置nginx和php-fpm之间进行通讯sql

#从nginx容器拷贝配置文件到宿主机的当前目录
docker cp nginx80:/etc/nginx/conf.d/default.conf ./
#编辑配置文件
vi default.conf

将nginx的配置文件修改以下docker

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容器内
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
#执行修改语句 语句中的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