docker搭建nginx+php+mysql的容器,并挂载本机目录

原创
2021/09/05 00:14
阅读数 357

docker搭建nginx+php+mysql的容器

docker run 参数说明

docker run 命令为执行运行一个容器,参数如下

  • --name 为容器指定一个名称
  • --privileged 是否让docker 应用容器 获取宿主机root权限(特殊权限-)
  • -i 以交互模式运行容器,通常与-t同时使用
  • -t 为容器重新分配一个伪输入终端,通常与-i同时使用
  • -p 将容器的80端口映射到主机的8080端口
  • -v 将宿主机上的目录挂载到镜像里
  • --link 添加链接到另一个容器
  • -d 后台运行容器,并返回容器id
  • -m 设置容器使用内存最大值
  • -h 指定容器的hostname

运行mysql容器

docker run -p 3306:3306 --name dream.mysql \
-v C:/Users/tong/docker/data2/mysql/conf:/etc/mysql \
-v C:/Users/tong/docker/data2/mysql/logs:/logs \
-v C:/Users/tong/docker/data2/mysql/data:/mysql_data \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.6

上面命令创建了一个名为dream.mysql的容器,并且映射容器内的3306到本地3306端口,挂载了logs目录和mysql_data目录,设置登录密码为123456

运行php容器

docker run --name dream.php -d \
-v C:/Users/tong/docker/data2/nginx/html:/var/www/html:ro \
-v C:/Users/tong/docker/data2/php:/usr/local/etc/php \
php:5.6-fpm
  • -v挂载目录 C:/Users/tong/docker/data2/nginx/html 是本地 php 文件的存储目录,/var/www/html 是容器内 php 文件的存储目录,ro 表示只读。
  • php.ini位置 /usr/local/etc/php/php.ini
  • 安装pdo_mysql扩展,进入容器执行 /usr/local/bin/docker-php-ext-install pdo_mysql mysqli
  • 扩展目录 /usr/local/lib/php/extensions/no-debug-non-zts-20131226/

需要进容器内安装一下mysql扩展,然后改一下php.ini;修改extension_dir为上面的扩展目录,然后把mysqli、pdo_mysql扩展打开

运行nginx容器

docker run \
--name dream.nginx \
--privileged \
-it \
-p 8080:80 \
-v C:/Users/tong/docker/data2/nginx/conf.d:/etc/nginx/conf.d:ro \
-v C:/Users/tong/docker/data2/nginx/html:/usr/share/nginx/html:rw \
-v C:/Users/tong/docker/data2/nginx/logs:/var/log/nginx \
--link dream.php:php \
--link dream.mysql:db \
-d nginx
  • --link 添加链接到dream.php与dream.mysql容器
  • 注意:只能挂载目录,不能挂载文件,挂载目录应该为绝对路径,windows系统下必须为带盘符的绝对路径
  • 挂载的conf.d目录中新建一个default.conf文件,内容为容器里面/etc/nginx/conf.d/default.conf的内容
  • 需要修改 C:\Users\tong\docker\data2\nginx\conf.d\default.conf 中php的fastcgi_param
location ~ \.php$ {
    fastcgi_pass   php:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
    include        fastcgi_params;
}

测试一下

网站目录C:/Users/tong/docker/data2/nginx/html 中新建phpinfo.php、mysqli.php、pdo_mysql.php

  • phpinfo.php
<?php
	phpinfo();
?>

  • mysqli.php
<?php

$con = mysqli_connect("192.168.0.169","root","123456","blog",3306);
if (!$con){
    die('Could not connect: ' . mysqli_connect_error());
}

$sql = "set names utf8";

mysqli_query($con,$sql);

$sql = "select * from user";

$result = mysqli_query($con,$sql);
$list = array();
while ($row = mysqli_fetch_row($result)) {
    $list[]=$row;
}

var_dump($list);
?>

  • pdo_mysql.php
<?php
$dbms='mysql';     //数据库类型
$host='192.168.0.169'; //数据库主机名
$dbName='blog';    //使用的数据库
$user='root';      //数据库连接用户名
$pass='123456';          //对应的密码666
$dsn="$dbms:host=$host;dbname=$dbName";

try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
    $dbh->exec("set names 'utf8'");
    echo "连接成功<br/>";
    /*你还可以进行一次搜索操作*/
    foreach ($dbh->query('SELECT * from user') as $row) {
        print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
    }
    
    $dbh = null;
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
//$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

?>

  • 数据库主机名请使用本机ip地址,不能使用localhost127.0.0.1,否则可能连接不上mysql容器
  • 打开浏览器http://localhost:8080/mysqli.php
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部