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


    (1)完成Docker-compose的安装

    安装命令如下:

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

    一开始我直接安装失败了,所以必须改在root权限下安装才可。

    查看安装的版本:
    docker-compose --version

    (2)Dockerfile编写

    要求:
    LNMP/LAMP选择一种;
    分别构建web、php应用、数据库等镜像服务,php镜像亦有提供php:-apache的变体;
    提示:php连接数据库需要安装必要的核心扩展部件(PHP Core Extensions)安装方法可参考官方镜像介绍。

    使用docker pull 下载php镜像

    docker pull php:7.4-fpm

    mysql

    #Dockerfile
    #基础镜像
    FROM mysql:5.7
    #维护者信息
    MAINTAINER qhh
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    ENV MYSQL_ROOT_PASSWORD=123456
    #不允许空密码登陆,设置初始密码
    

    nginx

    #Dockerfile
    FROM nginx
    #基础镜像
    MAINTAINER xmmm
    #维护者
    EXPOSE 2208
    #映射端口
    
    #default.conf
    server {
        listen       2208;  #修改映射端口
        server_name  localhost;
    
        location / {
            root   /www/web; #修改nginx工作目录
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
        location ~ .php$ {
            root           /www/web; # php容器web文件代码目录
            fastcgi_pass   php:9000; # 修改php服务器端口
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;# 修改为$document_root
            include        fastcgi_params;
        }
    }
    

    php

    FROM php:7.4-fpm
    #基础镜像
    MAINTAINER xmmm
    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
    

    web

    #index.html
    hello,welcome to mynginx
    
    #index.php
    <?php phpinfo();?>
    

    最终的tree文件树

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

    编写compose文件,完成上述LNMP/LAMP的微服务组合部署。
    参考资料:Get started with Docker Compose

    docker-compose.yml文件

    version: "3"
    services:
        #nginx服务
        nginx:
            image: nginx_image  #镜像名
            container_name: nginx_container  #容器名
            build: ./nginx
            ports:
                - "80:2208"     #暴露端口
            volumes:
                - ./web:/www/web   #磁盘映射,后者与default.conf中定义的一致             
                - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
        #php服务
        php:
            image: php_image 
            container_name: php_container 
            build: ./php
            environment:
                MYSQL_PASSWORD: 123456           
            volumes:
                - ./web:/www/web                
        #mysql服务
        mysql:
            image: mysql_image 
            container_name: mysql_container
            build: ./mysql
            ports:
                - "3306:3306"
            volumes:
                - ./mysql/data:/var/lib/mysql 
            environment:
                MYSQL_ROOT_PASSWORD : 123456    
    

    运行docker-compose

    sudo docker-compose up -d

    查看镜像

    sudo docker images

    查看容器

    sudo docker ps -a

    访问http://localhost/index.html

    访问http://localhost/index.php

    (4)服务测试

    要求和提示:
    包括但不限于测试数据库连接、数据库新建、表新建、表记录的插入修改和删除是否成功(pdo或mysqli均可);
    相关测试代码可直接参考PHP与MySQL的教程。

    测试数据库连接

    修改index.php连接数据库

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

    可以看到修改后的输出

    新建数据库docker-compose-db

    <?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 dockerComposeDB"; //修改数据库名
    
        // 使用 exec() ,因为没有结果返回 
        $conn->exec($sql); 
    
        echo "数据库创建成功<br>"; 
    } 
    catch(PDOException $e) 
    { 
        echo $sql . "<br>" . $e->getMessage(); 
    } 
    
    $conn = null; 
    ?>
    

    登录数据库查看数据库信息

    新建表

    建立student表,包含属性:学号sno,姓名sname,成绩grade

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="dockerComposeDB";       
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,$password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // 使用 sql 创建数据表
        $sql = "CREATE TABLE student(
                sno INT(8) UNSIGNED PRIMARY KEY,
                sname CHAR(30) NOT NULL,
                grade INT(3)
                )";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "数据表 student 创建成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    插入数据

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="dockerComposeDB";       
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         //开始事务
        $conn->beginTransaction();
        $conn->exec("INSERT INTO student (sno,sname, grade)
        VALUES ('10011','lihua','92')");
        $conn->exec("INSERT INTO student (sno,sname, grade)
        VALUES ('10012','wanglei','77')");
        $conn->exec("INSERT INTO student (sno,sname, grade)
        VALUES ('10013','lishuang','83')");
        $conn->exec("INSERT INTO student (sno,sname, grade)
        VALUES ('10014','yangminting','100')");
        // 提交事务
        $conn->commit();
        echo "插入数据成功!";
    }
    catch(PDOException $e)
    {
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    修改数据

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="dockerComposeDB";       
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         //开始事务
        $conn->beginTransaction();
        $conn->exec("UPDATE student SET grade=87 WHERE sname='lishuang'"); 
        $conn->exec("UPDATE student SET grade=80 WHERE sno='10012'"); 
        $conn->exec("UPDATE student SET grade=grade+2 WHERE sname='lihua'");
        $conn->exec("UPDATE student SET sname='ymt' WHERE sno='10014'");  
        // 提交事务
        $conn->commit();
        echo "修改数据成功!";
    }
    catch(PDOException $e)
    {
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    删除数据

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="dockerComposeDB";       
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         //开始事务
        $conn->beginTransaction();
        $conn->exec("DELETE FROM student WHERE sno='10012'");  
        $conn->exec("DELETE FROM student WHERE sname='lishuang'");  
    
        // 提交事务
        $conn->commit();
        echo "删除数据成功!";
    }
    catch(PDOException $e)
    {
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    (5)选做:增加一个phpmyadmin容器,实现web端的数据库管理。

    编写Dockerfile文件

    #基础镜像
    FROM phpmyadmin/phpmyadmin            
    #维护者信息
    MAINTAINER qhh
    #暴露端口
    EXPOSE 8080
    

    编辑yml文件

    在docker-compose.yml最后面加上:

    phpmyadmin:
        image: phpmyadmin_image
        container_name: myphpmyadmin_container
        build: ./phpmyadmin
        ports: 
            - "8080:80" 
        environment:
            PMA_HOST: mysql        
    

    重新启动docker-compose

    移除之前运行的docker-compose再建

    docker-compose down
    docker-compose up -d --build
    

    访问网址localhost:8080

    phpmyadmin数据库一系列操作

    (6)实验报告

    记录实验过程的主要问题和解决方法,分享经验和感想

    (1)下载docker和php老是到一半就停了,等了好久也不见有反应,解决方法是换源,尤其是国内的网站。
    (2)一开始我不知道怎么编写Dockerfile文件,然后参考其他同学,我花费了一些时间去想那个tree树时怎么来的,然后才想起来是文件的结构,然后就知道怎么编写Dockerfile文件了。
    (3)在第三步的时候,运行docker-compose时,网站地址响应很慢,有时候甚至是卡了几十分钟,弄得我心情很烦,然后忍不住又去取消重新运行,试了好几回也等了好长时间才能运行成功,但是又马上有新问题,就是我登录localhost/index.html和localhost/index.php连接建立失败,我又百度了一会儿,然后发现可能端口设置不对,我把端口改成别的了,然后就干脆设置成80。
    (4)在第三步运行docker-compose时,不知道为什么我的docker突然启动不了,然后再试了几次还不行,实在没招我就想着删除了重新下载算了,结果让我想不到的是,虽然卸载成功了,然而我想再安装docker-ce的时候却失败了,每次安装都失败,真的是让我抓狂,然后把错误的地方去百度,知道了就是docker的daemon.json文件配置出现了错误,然后我千辛万苦找到了这个配置文件,打开发现里面果然啥东西都没了,是不是什么时候被误删了(疑惑),然后又一顿百度怎么配置daemon.json文件,然后顺带学习怎么使用vim编译器(以前没用过这),经过揪心的历程,最后终于舒了一口气。

    记录完成作业所花的时间

    总计大约:12小时
    1、完成作业内容时间:大约7小时
    2、各种百度学习时间:大约2小时
    3、各种反复下载和运行时间,以及电脑卡顿卡机时间:大约3小时

    心得体会

    主要心得是我的耐心得到了训练,控制情绪,还有也又学到了一些知识。

  • 相关阅读:
    Windows下MySQL多实例运行
    Java中,什么时候用logger.debuge,info,error
    乒乓球(Table Tennis)
    [Delphi]Delphi学习
    [CALL]01
    [转自看雪]新手学习计划
    [JAVA]函数
    [1.1]
    [SQL]课堂记录
    [SYS]VS2010驱动开发配置
  • 原文地址:https://www.cnblogs.com/yangminting/p/12837848.html
Copyright © 2020-2023  润新知