前文我们写了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