系统综合实践第三次作业博客
实践内容
(1)安装Dockercompose
$ curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /home/yqy/docker-compose
为docker-compose添加权限:$ sudo chmod +x /home/yqy/docker-compose
这里如果先前没有FROM所需的镜像,直接build镜像也能自动下载
(2)准备Dockerfile
---------------------------------------------------------Dockerfile_php---------------------------------------------------------
FROM php:7.4-fpm
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
---------------------------------------------------------Dockerfile_mysql---------------------------------------------------------
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD 777777
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
---------------------------------------------------------Dockerfile_nginx---------------------------------------------------------
FROM nginx:latest
EXPOSE 8010
---------------------------------------------------------Dockefile_phpmyadmin---------------------------------------------------------
FROM phpmyadmin/phpmyadmin
EXPOSE 8020
(2)其他配置文件
---------------------------------------------------------Docker-compose.yml---------------------------------------------------------
version: "3"
services:
nginx:
image: snginximage #指定镜像名
container_name: snginx #指定容器名
build:
context: .
dockerfile: Dockerfile_nginx #指定dockerfile文件
ports:
- "80:8010" #修改端口映射
volumes:
- ./web:/home/docker-web/html #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;
- ./default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件
php:
image: sphpimage
container_name: myphp
build:
context: .
dockerfile: Dockerfile_php
environment:
MYSQL_PASSWORD: 777777
volumes:
- ./web:/home/docker-web/php #挂载工作目录到本机web目录
mysql:
image: mysqlimage
container_name: mysql
build:
context: .
dockerfile: Dockerfile_mysql
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql #挂载容器卷
phpmyadmin:
image: myphpmyadminimage
container_name: myphpmyadmin
build:
context: .
dockerfile: Dockerfile_phpmyadmin
ports:
- "8020:80" # phpmyadmin默认监听80
environment:
PMA_HOST: mysql #指定mysql服务所在的host
---------------------------------------------------------default.conf---------------------------------------------------------
server {
listen 8010; #监听8010端口
server_name localhost; #定义使用www.xx.com访问
location / { #默认请求
root /home/docker-web/html; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件名称
}
#error_page 404 /404.html; #定义错误提示页面
# redirect server error pages to the static page /50x.html #重定向服务器错误页面
error_page 500 502 503 504 /50x.html; #定义错误提示页面
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .php$ { #通过PHP脚本sphp:9000的FastCGI服务器监听
root /home/docker-web/php; #修改工作目录
fastcgi_pass myphp:9000; #修改为容器名
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
(3)实现多容器运行
运行多容器 $ sudo docker-compose up -d --build
接下来等了很久很久……终于好了,但是mynginx却没有正常启动
查看mynginx启动日志:$ sudo docker logs mynginx
原来是default.conf文件出了问题,在进去看了一遍发现漏打了一个符号,修改完以后再次启动一下就启动成功了
(4)测试
基础测试
---------------------------------------------------------index.html---------------------------------------------------------
hello LNMP
---------------------------------------------------------index.php---------------------------------------------------------
<?php phpinfo();?> #显示php信息
<?php
$servername = "mysql"; #注意这里要用自己自定义的Mysql的容器名
$username = "root";
$password = "777777"; #密码也可以直接使用yml中的变量名
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
echo "连接成功";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
建立数据库
修改index.php文件新建一个数据库
<?php
$servername = "mysql";
$username = "root";
$password = "777777";
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE mynewsql";
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
进入mysql查看新建的数据库
建立表
新建数据表per
<?php
$servername = "mysql";
$username = "root";
$password = "777777";
$dbname = "mynewsql";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 使用 sql 创建数据表
$sql = "CREATE TABLE per (
NAME VARCHAR(30) NOT NULL,
age int NOT NULL
)";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "数据表 per 创建成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
往表中插入数据
往表中插入数据
<?php
$servername = "mysql";
$username = "root";
$password = "777777";
$dbname="mynewsql";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$conn->beginTransaction();
// SQL 语句
$conn->exec("INSERT INTO per (NAME, age)
VALUES ('yeqiyi',22)");
$conn->exec("INSERT INTO per (NAME, age)
VALUES ('yuki',22)");
// 提交事务
$conn->commit();
echo "插入成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
修改表中数据
修改表中数据
<?php
$servername = "mysql";
$username = "root";
$password = "777777";
$dbname="mynewsql";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL 语句
$conn->exec("UPDATE per SET age='20' WHERE NAME='yeqiyi' OR NAME='yuki'");
echo "记录修改成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
删除表中数据
删除表中数据
<?php
$servername = "mysql";
$username = "root";
$password = "777777";
$dbname="mynewsql";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL 语句
$conn->exec("DELETE FROM per where NAME='yuki'");
echo "记录删除成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
使用phpMyAdmin进行web端数据管理
通过phpMyAdmin登录mysql
插入数据
点击go以后,回到表中可以看到数据已经成功插入
接下来的操作都基本相同了
最后
所花时长:6小时左右
总结:这次实验学习了多容器之间的运行交互,通过挂载本地目录,在本地操作文件同时也能将操作同步到容器虚拟机中,方便且效率高,在实践的开始还是会不知所措无从下手,这时候就要善于利用网络资源,遇到问题学会分析报错信息来解决问题。