当前位置: 首页 > 工具软件 > PHP Docker > 使用案例 >

Docker配置PHP环境 + Nginx + Mysql

鲁斯伯
2023-12-01
# 拉取相关镜像
docker pull nginx
docker pull php:7.4-fpm
docker pull mysql:5.6


# 运行镜像并挂载相关文件
docker run -d -p 3310:3306 --name mysql1 -v /Users/aiyaowei/docker/docker1/mysql/conf:/etc/mysql/conf.d -v /Users/aiyaowei/docker/docker1/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6

docker run -p 9000:9000 --name php1 -v /Users/aiyaowei/docker/docker1/www/:/var/www/html --privileged=true -d --link mysql1 php:7.4-fpm


docker run -p 80:80 --name nginx1 -v /Users/aiyaowei/docker/docker1/www:/usr/share/nginx/html -v /Users/aiyaowei/docker/docker1/nginx/conf.d:/etc/nginx/conf.d --privileged=true --link php1 -d nginx

--name 名称
-p 本地端口:容器内端口
-v 本地路径:容器内路径
-d 后台运行


# 在相关挂载文件中配置
# 在/Users/aiyaowei/docker/docker1/nginx/conf.d中创建default.conf
server {
    listen  80 default_server;
    server_name localhost;
    root   /usr/share/nginx/html;
 
    location / {
        index index.php index.html index.htm;
        autoindex off;
    }
    location ~ \.php(.*)$ {
        root   /var/www/html/;
        fastcgi_pass php1:9000;
        fastcgi_index index.php;
        fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        include  fastcgi_params;
    }
}
# fastcgi_pass可以写php容器名称:端口名,也可以写ip:端口名,ip的获取方法:docker inspect --format='{{.NetworkSettings.IPAddress}}' php1 #php1是php的容器名
# 这里root /usr/share/nginx/html是nginx容器内的路径;location ~ \.php(.*)$的root /var/www/html/是php容器内的路径;
# 部署网站的时候,比如是laravel框架,php相关文件会通过location ~ \.php(.*)$去解析,静态文件,比如css/image/js等是去的usr/share/nginx/html中的文件的
# 所以,nginx和php的某个本地的挂载文件路径是一致的
# 这里的配置文件不能错,有错误会造成nginx启动失败
# 如果后期用虚拟域名,如www.test.com,nginx配置文件修改好之后,需要去宿主机的etc/hosts上直接添加127.0.0.1	www.test.com即可,不用在nginx容器或php容器中添加

# 创建运行的php文件,在/Users/aiyaowei/docker/docker1/www中创建info.php
<?php
	phpinfo();
?>


# 重启nginx,上面运行时将nginx容器命名为了nginx1
docker restart nginx1






# --------------------连接mysql--------------------
# 进入php的容器php1
docker exec -it php1 /bin/bash

# 进入/usr/local/bin目录
cd /usr/local/bin

# 安装mysql的相关扩展
./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysqli

# 进入/usr/local/etc/php,修改php.ini(如果没有php.ini文件,将php.ini-development或php.ini-production复制一下,把文件名改成php.ini即可)
cd /usr/local/etc/php
vim php.ini

# 如果容器内无vim命令,先更新下
apt-get update
# 然后安装
apt-get install vim

# 找到extension=mysqli与extension=pdo_mysql,取消前面的注释“;”
extension=mysqli
extension=pdo_mysql

# 重启php的容器,php1
docker restart php1


# 修改info.php
try {
    $conn = new mysqli('容器内mysql的IP:端口', '账号', '密码','数据库');
    echo "连接成功";
    $conn->query("SET NAMES 'UTF8'");
    $sql="SELECT * FROM ggw_user where id=1"; 
    $rs=$conn->query($sql);
    $row = $rs->fetch_array();
    echo "<pre>";
    print_r($row);
}catch(PDOException $e)
{
    echo $e->getMessage();
}

如果需要多个php版本,将php搭建好之后,再创建nginx,通过--link来连接多个php容器,例:

docker run -p 9001:9000 --name php2 -v /Users/aiyaowei/docker/docker1/www/:/var/www/html --privileged=true -d --link mysql1 php:5.6-fpm

docker run -p 80:80 --name nginx2 -v /Users/aiyaowei/docker/docker1/www:/usr/share/nginx/html -v /Users/aiyaowei/docker/docker2/nginx/conf.d:/etc/nginx/conf.d --privileged=true --link php1 --link php2 -d nginx

创建Redis

docker run -p 6379:6379 -p 16379:16379 --name redis1 -v /Users/aiyaowei/docker/docker1/redis/data:/data -v /Users/aiyaowei/docker/docker1/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
4b6d20beb8d84749070f997ac1eaa9ff8a25d5e4ad22d5e747881df72eba4ad3

Docker容器中运行mysql连接报错:

Fatal error: Uncaught Error: Class 'mysqli' not found in /var/www/html/index.php:2 Stack trace: #0 {main} thrown in /var/www/html/index.php on line 2

原因:纯净的php中缺少扩展

解决:

进入容器

docker exec -it php /bin/bash

切换目录到

cd /usr/local/bin

安装扩展

./docker-php-ext-install pdo_mysql

./docker-php-ext-install mysqli

修改php.ini,取消extension=mysqliextension=pdo_mysql前面的注释“;”

重启PHP容器

连接mysql测试:

try {
    $conn = new mysqli('容器内mysql的IP:端口', '账号', '密码','数据库');
    echo "连接成功";
    $conn->query("SET NAMES 'UTF8'");
    $sql="SELECT * FROM user where id=1"; 
    $rs=$conn->query($sql);
    $row = $rs->fetch_array();
    echo "<pre>";
    print_r($row);
}catch(PDOException $e)
{
    echo $e->getMessage();
}

容器内无vim命令:

在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时,提示:

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim

这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

 类似资料: