手把手 Docker 配置php和mysql

前文我们写了docker配置了nginx,今天我们把php和mysql一块配置了


image.png

一.配置公用网络

命令:docker network create my-network

我们使用单独的nginx,php和mysql容器,要想在容器之间相互访问,就需要使用一个公共网络,之前的--link也可以实现容器互联,但--link命令已经废弃,我们就使用network创建公共网络。

image.png

可以使用docker network ls 命令查看所有网络信息。

二.使用网络运行nginx容器

命令: docker run -d --name mynginx --network my-network -v /Users/lu/html/pro:/usr/share/nginx/html -v /Users/lu/html/config:/etc/nginx/conf.d -p 8089:80 nginx

--network 配置网络,后面带上网络名称即可

image.png

创建成功后可以使用docker inspect mynginx 命令查看容器的信息。
image.png

image.png

下面可以查看到容器的网络信息。

三.运行php容器

命令:docker run --name myphp -d --network my-network -v /Users/lu/html/pro:/var/www/html php:7.4-fpm

这里要注意::/var/www/html为php的工作目录,要挂载的路径要和nginx挂载的项目路径一致,否则找不到项目文件。


image.png

接下来要配置nginx的配置文件。在/Users/lu/html/config 目录下,就是nginx配置文件挂载的本地目录,创建default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    access_log  /var/log/nginx/host.access.log  main;

    root   /usr/share/nginx/html;
    index index.html index.php;
    location / {
            if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=/$1  last;
                break;
            }
    }

    location ~ \.php(.*)$ {
        root /var/www/html;   #注意这里是php的工作目录
        fastcgi_pass   myphp:9000;  #注意这里是myphp就是php容器的名称
        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;
    }   
}

在/Users/lu/html/pro下面新建index.php文件,测试代码

<?php
    echo "Hello, World!";
    $name = "John";
    echo "My name is " . $name;


    // 输出数组元素
    $arr = array("apple", "banana", "orange");
    echo $arr[0]; // 输出 apple
?>
image.png

访问页面就可以看到想要的结果了。
三:安装并运行mysql容器

命令: docker run --name mysql -p 3366:3306 -e MYSQL_ROOT_PASSWORD=123456 --network my-network -d mysql

参数: -e 指定环境变量 这里设置mysql的密码 root用户密码。


image.png

创建成功,可以本地连接,端口是映射的端口3366


image.png

在index.php中增加以下代码,连接mysql并测试
  $servername = "mysql:3306"; // 数据库服务器地址
    $username = "root"; // 数据库用户名
    $password = "123456"; // 数据库密码
    $database = "test"; // 数据库名

    
    try {
       $pdo = new PDO("mysql:host=" . $servername. ";dbname=" . $database, $username, $password);//创建一个pdo对象
        $pdo->exec("set names 'utf8'");
        echo "mysql连接成功"; 
    }
    catch(PDOException $e) {
        echo "mysql连接失败:error=> " . $e->getMessage();
    }
     
    $pdo = null;

但是访问页面,报错could not find driver 这是因为php中未安装mysql驱动。

image.png

我们进入php容器安装数据库驱动,docker exec -it myphp /bin/bash进入php容器,运行docker-php-ext-install pdo pdo_mysql命令安装驱动。安装在/usr/local/etc/php/conf.d下面可以看到docker-php-ext-pdo_mysql.ini的扩展配置。

image.png

退出容器,重启
image.png

再次访问:
image.png

这里有个问题,由于mysql没有挂载本地目录,导致mysql容器销毁后数据会消失,因此需要将mysql的数据文件挂载到本地目录。使用命令:
docker run --name newsql -p 3316:3306 -v /Users/lu/html/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --network my-network -d mysql
还有一种思路就是容器访问本地数据库。但是docker 不能同时使用自定义网络和原生网络。因此还需进一步研究。
image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容