第3次实践作业

1.安装docker-compose

常规curl的方法下载速度太慢,这次我使用pip方法安装docker-compose

  • 安装python-pip工具
sudo apt install python-pip
  • 安装docker-compose
pip install docker-compose
  • 查看版本号,检测是否安装成功
docker-compose version

 2.Dockerfile编写

2.1web应用

  •  dockerfile内容
from nginx
expose 7890
maintainer xuxuxu

 

 

2.2php应用

  • dockerfile内容
# 从官方PHP镜像构建
FROM       php:7.4-fpm
# 将index.php复制到容器内的/var/www目录下
ADD        index.php /var/www
# 对外暴露8080端口
EXPOSE     8080
# 设置容器默认工作目录为/var/www
WORKDIR    /var/www
# 容器运行后默认执行的指令
ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]
  • index.php内容
<?php 

echo "Hello World!"; 

?> 
  • 创建、执行、显示运行结果
docker build -t myphp .
docker run -d -p 8080:8080 myphp
curl localhost:8080

  • 制作php-extension镜像为连接数据库做准备(dockerfile内容如下)
FROM php:7.4-fpm
RUN apt-get update  
&& docker-php-ext-install pdo pdo_mysql

 2.3mysql试运行

dockerfile内容

#基础镜像
FROM mysql:5.7
#作者信息
MAINTAINER xuxuxu
#设置root密码
ENV MYSQL_ROOT_PASSWORD 123456
#设置不可免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD no

3.使用Compose实现多容器运行机制

  • docker-compose.yml内容
version: "3"
services:
  web:
    image: nginx
    ports:
      - "7890:7890"
    volumes:         
      - /docker/project:/var/www/html/project
      - /docker/default.conf:/etc/nginx/conf.d/default.conf
      - /docker/log:/var/log/nginx
    networks:
      - webnet
  php:
    image: php-extension
    volumes:
      - /docker/project:/var/www/html/project
    networks:
      - webnet
  mysql: # 添加 mysql 服务
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes: # 挂载数据卷
     - /docker/mysql:/var/lib/mysql
    environment:
      - TZ=Asia/Shanghai # 设置时区
      - MYSQL_ROOT_PASSWORD=123456 # 设置 root 用户密码
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置编码
    networks:
      - webnet
networks:
  webnet:
  • default.conf内容
server {

    listen          7890;

    index           index.php index.html;

    server_name     localhost;

    root            /var/www/html/project;

    

    access_log      /var/log/nginx/access.log;

    error_log       /var/log/nginx/error.log;



    location ~ .php$ {

        try_files $uri =404;

        fastcgi_split_path_info ^(.+.php)(/.+)$;

        fastcgi_pass php:9000;

        fastcgi_index index.php;

        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_param PATH_INFO $fastcgi_path_info;

    }

}
  • 最终的文件树如下

  • 运行
docker-compose up -d

4.服务测试

直接修改project下的index.php文件

  • 连接测试
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
 
try {
    $conn = new PDO("mysql:host=$servername;", $username, $password);
    echo "连接成功"; 
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>
  • 创建数据库
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
 
try {
    $conn = new PDO("mysql:host=$servername", $username, $password);

    // 设置 PDO 错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "CREATE DATABASE Student";

    // 使用 exec() ,因为没有结果返回
    $conn->exec($sql);

    echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>

  • 新建表
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname = "Student";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    // 使用 sql 创建数据表
    $sql = "CREATE TABLE Basedata (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(30) NOT NULL
    )";
 
    // 使用 exec() ,没有结果返回 
    $conn->exec($sql);
    echo "数据表 Basedata 创建成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;

?>

插入/删除/修改数据

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname = "Student";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO Basedata (name) VALUES ('dididi')"; 
//删除数据时将这一段修改为"DELETE FROM Basedata WHERE name = 'dididi'"    //修改数据时这一段修改为"UPDATE Basedata SET name = 'bili' WHERE name = 'dididi'" // 使用 exec() ,没有结果返回    $conn->exec($sql); echo "新记录插入成功"; } catch(PDOException $e) {    echo $sql . "<br>" . $e->getMessage();   } $conn = null; ?>

 查询数据

<?php

echo "<table style='border: solid 1px black;'>";
echo "<tr><th>id</th><th>name</th></tr>";
 
class TableRows extends RecursiveIteratorIterator {
    function __construct($it) { 
        parent::__construct($it, self::LEAVES_ONLY); 
    }
 
    function current() {
        return "<td style='150px;border:1px solid black;'>" . parent::current(). "</td>";
    }
 
    function beginChildren() { 
        echo "<tr>"; 
    } 
 
    function endChildren() { 
        echo "</tr>" . "
";
    } 
} 

$servername = "mysql";
$username = "root";
$password = "123456";
$dbname = "Student";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT id,name FROM Basedata"); 
    $stmt->execute();
 
    // 设置结果集为关联数组
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
    foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
        echo $v;
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";

?>

5.选做

直接在命令行输入

docker run --name myadmin -d -e PMA_HOST=mysql --net docker_webnet -p 6654:80 phpmyadmin/phpmyadmin

 6.遇到的问题及解决方法

  • 问题一:

 

解决方法:这个问题是因为原生的php自带的pdo不支持mysql数据库所以制作新的镜像一个新的镜像即可,具体的dockerfile代码在第二个部分有介绍。

  • 问题二:

问题描述:数据库拒绝连接

解决方法:我在index.php中错误的将servername的值赋为localhost,刚开始以为是dockercompose创建容器是没有按nginx、mysql、php这样的顺序创建。但是最后发现并不是那个原因,查找很多资料也没有找到原因,最后发现随便尝试,发现是servername的原因只要将servername的值改为容器名即可。

7.完成作业所花的时间

学习docker-compose:2小时

配置文件:3小时

查找资料及解决问题:6小时

撰写博客:1小时

共计12小时

原文地址:https://www.cnblogs.com/xhongj/p/12817517.html