• 第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小时

  • 相关阅读:
    09 shell脚本程序练习
    springboot整合vue03-创建springboot工程
    springboot整合vue02-创建前端页面
    springboot整合vue01-创建vue工程
    pe工具04-获取数据目录
    pe工具03-获取节表信息
    pe工具02-解析pe头信息
    pe工具01-获取进程和模块
    以挂起方式创建进程
    进程
  • 原文地址:https://www.cnblogs.com/xhongj/p/12817517.html
Copyright © 2020-2023  润新知