zoukankan      html  css  js  c++  java
  • 第3次实践作业

    一、Docker-compose的安装

    参考资料:Install Docker Compose

    (1)运行以下命令以下载Docker Compose的当前稳定版本

    sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    安装的时候遇到了如下问题,解决方法记录在后面了

    curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104
    

    (2)将可执行权限应用于二进制文件

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

    (3)测试安装

    sudo docker-compose --version
    

    二、Dockerfile编写

    选择LNMP(Linux+Nginx+Mysql+PHP)
    参考资料:Docker docker-compose 配置lnmp开发环境
    参考这里面的dockerfile-compose.yml文档的时候要注意一下volumes的设置,我参考以后遇到了一些小问题

    (1)Nginx

    Dockerfile:

    FROM nginx:latest
    

    default.conf:

    server {
            listen       80;
            server_name  localhost;
        
            location / {
                root   /var/www/html;
                index  index.html index.htm index.php; # 增加index.php
            }
        
            #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   /var/www/html;
            }
            location ~ .php$ {
                root           /var/www/html; # 代码目录
                fastcgi_pass   phpfpm:9000;    # 修改为phpfpm容器
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; # 修改为$document_root
                include        fastcgi_params;
            }
        }
    

    (2)Mysql

    Dockerfile:

    FROM mysql:5.7
    

    (3)PHP

    Dockerfile:

    FROM  php:5.6-fpm
     RUN apt-get update && apt-get install -y 
     libfreetype6-dev 
     libjpeg62-turbo-dev 
     libpng12*-dev 
     vim 
     && docker-php-ext-install pdo_mysql 
     && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
     && docker-php-ext-install gd 
    

    (4)创建index.html

    (5)创建index.php

    <?php phpinfo();?>
    

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

    (1)文档结构如下:


    前面写的时候漏了index.php文档,html部分的结构应为是如下这样:

    (因为先执行了docker-compose.yml文件才发现漏了,文档结构变得比较复杂,就没再截执行之后的文档结构了)

    (2)编写compose文件

    docker-compose.yml:

    nginx:
      build: ./nginx
      ports:
        - "80:80"
      links:
        - "phpfpm"
      volumes:
        - ./html/:/var/www/html/
        - ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
    phpfpm:
      build: ./phpfpm
      ports:
        - "9000:9000"
      volumes:
        - ./html/:/var/www/html/
      links:
        - "mysql"
    mysql:
      build: ./mysql
      ports:
        - "13306:3306"
      volumes:
        - ./mysql/data/:/var/lib/mysql/
      environment:
        MYSQL_ROOT_PASSWORD : 123456
    

    (3)执行docker-compose

    1.因为之前遇到了一些错误,需要停止并移除已运行的部分

    sudo docker-compose down
    

    2.执行

    sudo docker-compose up -d --build
    

    第一次执行耗费的时间比较长,大概1个小时左右,要耐心耐心。

    但是出现了问题,记录在后面啦。

    解决之后就成功啦!

    四、服务测试

    参考资料:PHP 连接 MySQL

    (1)nginx测试

    (2)php+nginx测试

    (3)数据库连接

    1.编辑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();
    }
    

    2.在浏览器查看一下

    (4)创建数据库

    1.编辑index.php文档

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

    2.在浏览器查看一下

    3.查看数据库

    sudo docker exec -it compose-lnmp_mysql_1 /bin/bash
    
    mysql -u root -p
    

    查看已经存在的数据库

    show databases;
    

    (5) 创建数据表

    1.编辑index.php文档

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

    2.在浏览器查看一下

    3.进入数据库并查表

    use myDBPDO
    
    show tables;
    

    (6)表记录的插入

    1.编辑index.php文档

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="myDBPDO";    
    
    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 stu (ID, NAME, MAJOR) 
        VALUES ('171709030', 'Cathy', 'Industrial Design')");
        $conn->exec("INSERT INTO stu (ID, NAME, MAJOR) 
        VALUES ('031702000', 'Zero', 'Computer Science')");
        $conn->exec("INSERT INTO stu (ID, NAME, MAJOR) 
        VALUES ('031702001', 'One', 'Computer Science')");
        // 提交事务
        $conn->commit();
        echo "新记录插入成功";
    }    
    catch(PDOException $e)
    {
        // 如果执行失败回滚
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
    
    $conn = null;
    ?>
    

    2.在浏览器查看一下

    3.查询

    select * from stu;
    

    (7)表记录的修改

    1.编辑index.php文档

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="myDBPDO";    
    
    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 stu SET MAJOR='Computer Science' WHERE ID=171709030");
        echo "记录修改成功";
    }    
    catch(PDOException $e)
    {
        // 如果执行失败回滚
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
    
    $conn = null;
    ?>
    

    2.在浏览器查看一下

    3.查询

    select * from stu;
    


    可以看到表记录已被修改

    (8)表记录的删除

    1.编辑index.php文档

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="myDBPDO";    
    
    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 stu where ID=031702000");
        echo "记录删除成功";
    }    
    catch(PDOException $e)
    {
        // 如果执行失败回滚
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
    
    $conn = null;
    ?>
    

    2.在浏览器查看一下

    3.查询

    select * from stu;
    


    可以看到此时相应记录已被删除

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

    (1)编辑docker-compose.yml文档

    在文档中增加

    phpmyadmin:
        build: ./phpmyadimin
        container_name: "phpmyadmin"
        ports: 
            - "8080:80"
        links:
            - "mysql"
        environment:
            - PMA_ABRITRARY=1     
            - PMA_HOST=mysql         
    

    (2)编写phpmyadmin的Dockerfile

    #基础镜像
    FROM phpmyadmin/phpmyadmin:latest
    #声明暴露的端口
    EXPOSE 8080
    

    (3)用浏览器访问https://localhost:8080/


    输入用户名和密码执行
    这边遇到了无法登陆的问题,解决方法写在后面了

    成功!

    (4)点击数据库可以看到所有已存在的数据库

    (5)查看myDBPDO数据库中的stu表

    (6)表记录的插入,修改和删除

    插入:


    可以看到已经插入了NAME为Zero学生的记录

    修改:


    可以看到将NAME为Zero学生的MAJOR修改为English

    删除:


    可以看到已经将NAME为Zero学生的记录删除

    六、遇到的问题及解决方法

    (1)按照官方教程安装Docker-compose时出现如下问题:

    原因:主要原因是安全设置的问题

    解决方法:

    执行如下命令:

    git config http.sslVerify "false"
    

    若出现如下错误:

    fatal: not in a git directory  
    

    再继续执行:

    git config  --globle   http.sslVerify "false" 
    

    问题就解决啦


    (2)执行docker-compose时出现如下问题:

    问题一:


    将docker-compose.yml文档中如下部分中的3306:3306改成13306:3306就解决了

    mysql:
      build: ./mysql
      ports:
        - "13306:3306"
    

    做期末大作业的时候也遇到了这个问题,又查找了一些资料
    发现其实原因是本地mysql服务自动打开了,与docker的冲突,使docker的mysql服务无法映射到本地
    解决方法是把本地的mysql服务关闭

    service mysql stop
    

    但是又有了新的问题

    问题二:


    翻阅了其他博客发现是文档中的三个volumes设置都有问题
    举其中一个为例子,剩下的也是这样修改

     volumes:
        - /home/compose-lnmp/html/:/var/www/html/
        - /home/compose-lnmp/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
    

    修改为

     volumes:
        - ./html/:/var/www/html/
        - ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
    

    就解决啦


    (3)增加phpmyadmin容器,在web端登录的时候遇到了如下问题:


    在docker-compose.yml文档中phpmyadmin部分的environment内增加了一行

    - PMA_HOST=mysql
    

    结果登录的时候显示

    mysqli_real_connect(): (HY000/2002): Connection refused
    

    原因是数据库没有启动

    service mysql start
    

    这样就可以登录啦!


    七、花费时间

    作业名称 耗时(小时)
    Docker-compose的安装 0.5
    Dockerfile编写以及使用Compose实现多容器运行机制 12
    服务测试 4
    增加phpmyadmin容器 4
    博客编写 1.5
    总计 22

    八、小结

      我怎么也没想到步步是坑,第一步就遇到了问题,好不容易完成了前三个部分,本以为服务测试部分遇到的问题会少一些,结果还是有很细的一些小问题,比如servername设置错误,还有因为粗心漏看一个字母导致数据库一直打不开等等,说起来其实还是不够细心,选做部分也遇到了一个问题,其实两个步骤就能解决,但是由于两个解决方法的博客是分开的,第一步做对了我还在怀疑是不是我哪里弄错了,折腾了很久。这样零零散散也做了两个白天,终于做完了!!!解决问题看到结果真的很有成就感!!!
      小结其实是做完每个部分之后记录下来的感受,在解决完第一步的时候我还洋洋洒洒写下“经历过第一次实践,以及之前的SDN课和LINUX课,我已经有了比较好的心态面对这些坑:)(给一个朴实无华的微笑),毕竟办法总比困难多,与其抵触它们,不如耐心地去解决它们,解决之后就会很开心。”这样的话,做到第三部分的时候我默默删除了它哈哈哈哈,抵触是不抵触,耐心是真的没了,心态崩也是真的崩了,主要是解决方案都要尝试过才知道能不能成功,有的方案很零散,要东拼西凑才能凑出一个能解决我遇到的问题的方案,而且有时候修改了小小的一个部分,结果都会很离谱。做这个实践真的要很有耐心而且要有很好的心态!!
      总之这次实验很波折,但是也收获了很多,学会了web服务器、数据库、开发程序等服务的组装,进行了一些数据库的操作,同时在选做部分学会了增加phpmyadmin容器,实现web端的数据库管理,对docker有了进一步的熟悉,最后希望自己下一次心态能更好,耶。

  • 相关阅读:
    Spark随机深林扩展—OOB错误评估和变量权重
    Spark随机森林实现学习
    RDD分区2GB限制
    Spark使用总结与分享
    Spark核心—RDD初探
    机器学习技法--学习笔记04--Soft SVM
    机器学习技法--学习笔记03--Kernel技巧
    机器学习基石--学习笔记02--Hard Dual SVM
    机器学习基石--学习笔记01--linear hard SVM
    特征工程(Feature Enginnering)学习记要
  • 原文地址:https://www.cnblogs.com/cathyccathy/p/12801124.html
Copyright © 2011-2022 走看看