html测试数据库是否连接成功,系统综合实践 第3次实践作业

系统综合实践 第3次实践作业

一、安装Docker-compose

(1)换源下载

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

620b2b3f73ce18d719321b47f52b774a.png

(2)将可执行权限应用于二进制文件并测试是否安装成功

sudo chmod +x /usr/local/bin/docker-compose

sudo docker-compose --version

604b31f223d675458bf5125b4b90487e.png

二、Dockerfile编写

(1)拉取nginx镜像、php镜像、mysql镜像

拉取nginx镜像

sudo docker pull nginx:latest

b044951c8ad0e29cd691051b8240d4e4.png

拉取mysql镜像

sudo docker pull mysql

e60a5d3aad013ce16ce981723fb1b9d3.png

拉取php镜像

sudo docker pull php:7.4-fpm

e257e8cdda01b9e78676966adcb66918.png

查看镜像

sudo docker images

ce70f03a959eb6df71567266ac22073d.png

(2)Dockfile文件的编写

创建docker_compose文件夹,包含web文件夹、mysql_data文件夹

6e9421c0c709350c538e1407c467bf15.png

index.html

build successfully!

index.php

nginx_dockerfile

#基础镜像

FROM nginx

#声明暴露的端口

EXPOSE 3456

mysql_dockerfile

#基础镜像

FROM mysql

#设置root密码

ENV MYSQL_ROOT_PASSWORD=123456

#设置不可免密登录

ENV MYSQL_ALLOW_EMPTY_PASSWORD no

php_dockerfile

#基础镜像

FROM php:7.4-fpm

COPY sources.list /etc/apt

RUN apt-get update && apt-get install -y

libfreetype6-dev

libjpeg62-turbo-dev

libpng-dev

&& docker-php-ext-install pdo_mysql

&& docker-php-ext-configure gd --with-freetype --with-jpeg

&& docker-php-ext-install -j$(nproc) gd

default.conf

server {

listen 3456; #修改映射端口

server_name localhost;

location / {

root /web/html; #修改工作目录

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /usr/share/nginx/html;

}

location ~ .php$ {

root /web/php; #修改工作目录

fastcgi_pass php:9000; #修改为容器名

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

docker-compose.yml

version: "3"

services:

nginx:

image: nginx_image #指定镜像名

container_name: nginx_container #指定容器名

build:

context: .

dockerfile: nginx_dockerfile #指定dockerfile文件

ports:

- "80:3456" #修改端口映射

volumes:

- ./web:/web/html #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;

- ./default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件

php:

image: php_image

container_name: php_container

build:

context: .

dockerfile: php_dockerfile

environment:

MYSQL_PASSWORD: 123456 #设置好环境变量,在php代码中使用变量名直接引用

volumes:

- ./web:/web/php #挂载工作目录到本机web目录

mysql:

image: mysql_image

container_name: mysql_container

build:

context: .

dockerfile: mysql_dockerfile

ports:

- "3306:3306"

volumes:

- ./mysql_data:/var/lib/mysql #挂载容器卷,实现数据同步,防止数据丢失

三、使用Compose实现多容器运行机制

(1)查看docker_compose文件夹的树状结构

tree

3952b0c8c002dac0bd717637e3a60071.png

(2)执行docker-compose文件

sudo docker-compose up -d --build

91a5e0cc2bf8c3e28bfe510fe7535b97.png

(3)查看镜像

sudo docker images

8312ba361e4d0c242d4c1b09c3625845.png

(4)查看容器

sudo docker ps -a

b21ec803d9f254a5204d9c23f0269090.png

(5)访问localhost/index.html

7e30a42968fae8dfdc55c1e8d488aef4.png

(6)访问localhost/index.php

8af273a35c9d7248b54022f0a08c4abf.png

四、服务测试

(1)检测PHP是否能够成功连接Mysql数据库

修改/docker_compose/web目录下的index.php文件

$servername = "mysql";

$username = "root";

$password = "123456";

try {

$conn = new PDO("mysql:host=$servername", $username, $password);

echo "连接成功!";

}

catch(PDOException $e)

{

echo $e->getMessage();

}

访问localhost/index.php

a2b309d67625375592d52939d5a5ac3a.png

(2)数据库相关操作

创建数据库

$servername = "mysql";

$username = "root";

$password = "123456";

try {

$conn = new PDO("mysql:host=$servername", $username, $password);

echo "连接成功!";

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "CREATE DATABASE myDB";

// 使用 exec() ,因为没有结果返回

$conn->exec($sql);

echo "数据库创建成功!
";

}

catch(PDOException $e)

{

echo $sql . "
" . $e->getMessage();

}

$conn = null;

?>

访问网页

b93b41671ec00b7daa73106ec3c2effd.png

进入mysql容器,进入数据库并查询数据库myDB是否存在

sudo docker exec -it mysql_container /bin/bash

mysql -u root -p

show databases;

5a6f0c69824aa494df0b7919396be817.png

创建数据表

$servername = "mysql";

$username = "root";

$password = "123456";

$dbname="myDB"; #变量设置

try {

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); #选择数据库

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 使用 sql 创建数据表

$sql = "CREATE TABLE user(

id INT(8) UNSIGNED PRIMARY KEY,

name VARCHAR(30) NOT NULL,

age INT DEFAULT NULL

)";

// 使用 exec() ,没有结果返回

$conn->exec($sql);

echo "user表创建成功";

}

catch(PDOException $e)

{

echo $sql . "
" . $e->getMessage();

}

$conn = null;

?>

访问网页

a31c9decb34c23c92f46f013c6204dc8.png

使用myDB数据库并查询数据表

use myDB

show tables;

c1fb1ab15a918af3430aca42fc532bb9.png

向数据表中插入数据

$servername = "mysql";

$username = "root";

$password = "123456";

$dbname="myDB";

try {

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 开始事务

$conn->beginTransaction();

// SQL 语句

$conn->exec("INSERT INTO user (id,name,age)

VALUES (031702444, 'LSJ',21)");

$conn->exec("INSERT INTO user (id,name,age)

VALUES (031702443, 'GYL',22)");

$conn->exec("INSERT INTO user (id,name,age)

VALUES (031702446, 'LHH',20)");

// 提交事务

$conn->commit();

echo "新记录插入成功!";

}

catch(PDOException $e)

{

// 如果执行失败回滚

$conn->rollback();

echo $sql . "
" . $e->getMessage();

}

$conn = null;

?>

访问网页

d857583f7d9081cddcbdf81445965aa1.png

查询数据库

select * from user;

5ae096a783f869869ade4e39bf10778a.png

修改数据

$servername = "mysql";

$username = "root";

$password = "123456";

$dbname="myDB";

try {

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 开始事务

$conn->beginTransaction();

// SQL UPDATE语句

$conn->exec("UPDATE user SET name='LHH' WHERE age='19'");

// 提交事务

$conn->commit();

echo "记录修改成功!";

}

catch(PDOException $e)

{

// 如果执行失败回滚

$conn->rollback();

echo $sql . "
" . $e->getMessage();

}

$conn = null;

?>

访问网页

225d11b8398a6e945c71d031ee262d04.png

查询数据库

select * from user;

c98e70152b0b0e4fb013ca50befb9f1e.png

删除数据

$servername = "mysql";

$username = "root";

$password = "123456";

$dbname="myDB";

try {

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 开始事务

$conn->beginTransaction();

// SQL DELETE语句

$conn->exec("DELETE FROM user where id=031702446");

// 提交事务

$conn->commit();

echo "记录删除成功!";

}

catch(PDOException $e)

{

// 如果执行失败回滚

$conn->rollback();

echo $sql . "
" . $e->getMessage();

}

$conn = null;

?>

访问网页

859e5bb46ba39624ee0f69d143478036.png

查询数据库

select * from user;

7da779a40d7112547626fbeda681f911.png

五、增加一个phpmyadmin容器,实现web端的数据库管理

(1)在docker-compose.yml文件中添加以下代码

phpmyadmin:

image: myphpmyadmin_image

container_name: myphpmyadmin

build:

context: .

dockerfile: dockerfile_phpmyadmin

ports:

- "8080:80" # phpmyadmin默认监听80

environment:

PMA_HOST: mysql #指定mysql服务所在的host

(2)在docker_compose文件夹中创建并编写phpmyadmin_dockerfile文件

#基础镜像

FROM phpmyadmin/phpmyadmin

#声明暴露的端口

EXPOSE 8080

(3)查看文件夹的树状结构

tree

3bf07ee4eb787fb754322bacad3eda31.png

009ac0af224e83cdd0c5873999909ab9.png

(4)停止之前docker-compose并重新运行新的docker-compose

a27c007134708237b607450b6a48e32d.png

8971bfd52e14c1880ae0a9f61c749459.png

(5) 访问localhost:8080/index.php

登录

1313228c1a9413a207e7cf83d598cfa1.png

选择myDB数据库,查看user表数据

82c7659b8f78a6c35b27383da229b117.png

ee54472a9f20eb40ff60c763a2038ac6.png

可以对数据库进行增删改查等一系列操作

在user表中插入数据

7c4a7643d63d936685d29c0011b8e690.png

29c81c76eca7a74a80a9e9c2e8f5bd47.png

在user表中修改数据

10c244db3b96dacbb61222b073fd9cae.png

2abed37661c081a5353ea604506505ba.png

在user表中删除数据

18f671769214bfacf032fb38f01f7e86.png

3d6df9f0b28ff8a31ba942ed85715100.png

六、出现的问题及解决方案

问题1:在docker-compose构建过程中出现警告

54ba929abb219b9ff233a11bca9e126d.png

问题2:构建完新的镜像并且运行容器的时候,网页端打开发现连接被重置

524704f689a285e1e60c273796beefab.png

问题3:在运行docker-compose时发现php_dockerfile加载过慢而且出现一些error

8f25c37714dad89f1e3f5c6becfc03f4.png

2bda478cd90d48316ae73d449a895f9e.png

参考了一些同学的博客之后发现了解决方法

在php_dockerfile中添加

# 更改镜像源

COPY sources.list /etc/apt

添加一个文件sources.list

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free

# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free

# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free

# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free

# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free

总结

这次实验大概花了一天多,前前后后有10个小时左右。大部分时间是花在修改配置文件上,有些小错误导致运行错误,没有成功构建新的镜像和容器。在参考了一些同学的博客还有和同学们相互交流之后,有些坑总算跨了过去,总体而言比较顺利。通过这次实验,熟悉了web服务器、数据库、开发程序等服务的组装(LNMP(Linux+Nginx+Mysql+PHP)),学会了利用增加phpmyadmin容器来实现web端的数据库管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值