高士涛-学习日报

姓名

高士涛

日期

2023/09/06

部门

云服务业务部

导师

王晓明

学习工作内容

Docker实现LNMP的部署(Linux + Nginx + MySQL + PHP

【学习目的】

1.  掌握 Docker 的基本操作

        docker 安装

        docker images

        docker run

        docker ps

        docker rm

        docker exec

2.  重点熟悉docker 端口映射和存储映射

3.  了解 PHP 程序的简单语法

4.  能够基于docker完成LNMP环境的部署

【参考连接】

使用Docker安装部署MySQL数据库-阿里云开发者社区 (aliyun.com)

fastcgi原理 及 fastcgi_param 详解_fastcgi_param script_filename_叫我峰兄的博客-CSDN博客

Docker 下安装php连接mysql报错:Uncaught Error: Class 'mysqli' not found in 解决方法_帅死人了的博客-CSDN博客

【实验内容】

1.    拉取实验相关docker镜像(Nginx+PHP+MySQL

1.1  拉取nginx镜像

docker pull nginx

 

1.2  拉取php镜像(php:fpm

docker pull php:fpm

 

1.3  拉取mysql镜像

docker pull mysql

 

1.4  查看已拉取到本地的镜像

docker images

 

2.  创建并配置MySQL容器

2.1  创建数据卷

MySQL作为数据库,其中通常存放我们的用户数据,都是很重要的,因此在容器化部署MySQL时,将MySQL的数据文件等等持久化是非常有必要的。

这里我们使用具名挂载的方式挂载MySQL容器的数据卷,方便管理。

先创建三个数据卷,分别用于挂载并持久化MySQL的数据文件、配置文件和日志这三个目录:

docker volume create mysql-data

docker volume create mysql-config

docker volume create mysql-log

 

2.2  创建MySQL容器

docker run -id --name=mysql -v mysql-config:/etc/mysql/conf.d -v mysql-log:/logs -v mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e LANG=C.UTF-8 mysql

-id MySQL容器挂在后台运行。

--name=mysql 将容器起名为mysql,大家可以自己起名,该参数可以省略。

-v mysql-config:/etc/mysql/conf.d MySQL容器中的配置文件目录挂载至上述创建的名为mysql-config的数据卷上面,还有两个-v挂载数据卷的参数同理。

-p 3306:3306 把容器的3306端口映射到宿主机的3306端口,这样才能从外网访问这台机器上的MySQL,若你的数据库只需要从本机访问,就可以去除这个参数。

-e MYSQL_ROOT_PASSWORD=123456 设置容器环境变量MYSQL_ROOT_PASSWORD的值为123456,这个环境变量表示MySQLroot用户的密码,一定要设置,这里设置了密码为123456,大家可以自定义。

-e LANG=C.UTF-8 设置容器的语言环境变量LANG值为C.UTF-8,这个必须要设置,否则容器内默认是英文环境,使得MySQL无法存放中文内容。

 

2.3  阿里云ECS安全组放通mysql相关端口(3306

 

2.4  先进入MySQL容器的shell,然后连接MySQL数据库

docker exec -it mysql bash

mysql -u root -p

 

2.5  新建一个自己的数据库,然后查看数据库是否新建成功

create database LMS;

show databases;

 

2.6  在自己新建的数据库中创建一个名为user的表

use LMS;

CREATE TABLE `user` (

  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',

  `username` varchar(60) NOT NULL COMMENT '用户名',

  `password` varchar(60) NOT NULL COMMENT '密码',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3;

 

2.7  查看自己新建的数据库中的表信息

show tables;

 

2.8  user表中插入几条测试数据

INSERT INTO `user` VALUES (1,'gst','1'),(5,'1','1'),(6,'22','22');

 

2.9  放通MySQL数据库root用户的所有远程连接权限

grant all on *.* to root@'%';

 

2.10  使用数据库管理软件进行MySQL远程连接测试

 

3.  创建Nginx容器

注意端口映射和存储映射。

docker run --name nginx -p 80:80 -v /root/nginx/:/usr/share/nginx/html nginx

 

4.  创建PHP容器

注意端口映射和存储映射。

docker run --name php-fpm -p 9000:9000 -v /root/nginx/:/var/www/html -d php:fpm

 

5.  查看已创建的MySQLNginxPHP容器的运行情况

docker ps -a

 

6.  配置LNMP各容器之间的关联

6.1  查看PHP容器的IP地址等信息

docker inspect e6b187d50cbb

 

6.2  修改Nginx配置文件

6.2.1  复制Nginx容器中的配置文件到宿主机。

docker cp d9a0fa167e73:/etc/nginx/conf.d/default.conf /root/nginx/default.conf

 

6.2.2  在宿主机中修改复制过来的Nginx配置文件。

vi /root/nginx/default.conf

 

6.2.3  Nginx配置文件中加入红框的内容。

其中,172.17.0.2:9000 PHP容器的IP地址和端口号,/var/www/html PHP容器的默认web目录。配置完成后保存配置文件。

 

6.2.4  将修改过的Nginx配置文件复制回Nginx容器中。

docker cp /root/nginx/default.conf d9a0fa167e73:/etc/nginx/conf.d/default.conf

 

6.2.5  进入Nginx容器shell,重新加载nginx服务,使新的配置文件生效。

docker exec -it nginx /bin/bash

nginx -s reload

 

7.  测试验证

7.1  测试 Nginx + PHP 服务的可用性

7.1.1  在与Nginx容器相映射的宿主机目录中,创建web测试页面文件“info.php”。

cd /root/nginx/

echo "<?php echo phpinfo();" > info.php

 

7.1.2  使用浏览器通过ECS公网地址访问info.php,访问成功返回如下图界面。

(如果访问显示找不到页面,请检查你的配置是否有误或info.php文件放置目录是否正确。)

 

7.1.3  访问info.php页面时,Nginx后台日志记录如下所示。

 

7.2  测试Nginx + PHP + MySQL 服务的可用性

7.2.1  进入PHP容器。

docker exec -it e6b187d50cbb bash

 

7.2.2  PHP容器中切换目录到 /usr/local/bin/ ,安装mysqli扩展。

(纯净的php镜像,没有 mysqli 扩展,php 请求mysql服务会报错。直接进入到 php 容器里面安装该扩展即可。)

cd /usr/local/bin/

docker-php-ext-install mysqli

 

7.2.3  重启 php 容器。

docker restart e6b187d50cbb

 

7.2.4  在宿主机 /root/nginx 目录下创建具有访问mysql数据库功能的web页面文件“t01.php”。

vim /root/nginx/t01.php

t01.php中的代码如下所示:

<?php

$servername = "ECS公网IP";

$username = "mysql登录用户名";

$password = "mysql登录密码";

$dbname = "LMS";

 

// 创建连接

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection

if ($conn->connect_error) {

    die("连接失败: " . $conn->connect_error);

}

$sql = "SELECT id, username, password FROM user";

$result = $conn->query($sql);

 

if ($result->num_rows > 0) {

    // 输出数据

    while($row = $result->fetch_assoc()) {

        echo "id: " . $row["id"]. " - Name: " . $row["username"]. " -password  " . $row["password"].   " <br>";

    }

} else {

    echo "0 结果";

}

$conn->close();

?>

 

7.2.5  使用浏览器通过ECS公网地址访问t01.php,访问成功返回如下图界面。

 

 

遗留问题

 

明日计划

继续深入学习