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


    (1)完成Docker-compose的安装

        1、下载Docker-compose

         2、添加执行权限和测试

    参考资料:Install Docker Compose

    (2)Dockerfile编写

    • Dockerfile-nginx  
    //Dockerfile
    FROM nginx
    LABEL author=zxl
    #由于yml文件里面有配置文件的挂载,所以这里不用过多操作。
    
    //default.conf server { listen 80; server_name localhost; location / { root /var/www/html; # nginx容器中web文件存放目录,和yml对应 index index.html index.htm index.php; } location ~ .php$ { root /var/www/html; # php容器中web文件存放目录,和yml对应 fastcgi_pass zphp:9000; # php服务器默认端口9000 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 
    • Dockerfile-php
    FROM php:7.4-fpm
    LABEL author=zxl
    RUN apt-get update && apt-get install -y 
        libfreetype6-dev 
        libjpeg62-turbo-dev 
        libpng-dev 
        && docker-php-ext-install pdo pdo_mysql 
        && docker-php-ext-configure gd --with-freetype --with-jpeg 
        && docker-php-ext-install -j$(nproc) gd 
        && rm -rf /var/cache/apt/* 
        && rm -rf /var/lib/apt/lists/*
    • Dockerfile-mysql

                   由于mysql的配置不是很复杂,所以这里就放到yml文件里面

    •  index.php
    <?php
    $host = "zdb";
    $username = "root";
    $password = "123456";
    $dsn="mysql:host=$host;";
    try {
        $db = new PDO($dsn, $username, $password,array(PDO::ATTR_PERSISTENT=>true));
        echo "连接成功"; 
    }
    catch(PDOException $e)
    {
        echo "连接失败"; 
        echo $e->getMessage();
    }
    //创建数据库和表
    $db->exec("create database if not exists leilei;");
    echo "数据库创建成功!<br>";
    $db->exec("use leilei;");
    $db->exec("create table if not exists test1(name char(20));");
       echo "表格创建成功!<br>";
    //插入数据
     $sql2 = "INSERT INTO test1 (name) VALUES ('wg');";  
        $db->exec($sql2);
        echo "记录插入成功!<br>";
    //查看数据
        echo "查看数据:<br>";
        showdata($db);
    //修改数据
    $db->exec("update test1 set name='baozi' where name='wg';");
        echo "修改后的数据:<br>";
        showdata($db);
       
    //删除数据
    $db->exec("delete from test1;");
       echo "删除后的数据:<br>";
    showdata($db);
    
    function showdata($db){
        $sql = "select * from test1";
        $result = $db->query($sql);
        if(is_object($result)){
        while ($arr = $result->fetch()) {
            print_r($arr);
            }
            echo "<br/>";
        }
        else{
            print_r($db->errorinfo());
         echo "<br/>";
        }
    }
    ?>
    • 查看文件树结构(由于mysql_data里面文件过多,所以只看了两层)

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

    • 编写compose文件
    version: '3'
    services:
        nginx:
          container_name: zngx
          build:
              context: .
              dockerfile: Dockerfile-nginx
          ports:
              - "80:80"
          volumes:
              - ./web_dir/:/var/www/html/
              - ./default.conf:/etc/nginx/conf.d/default.conf
          networks:
              - front_end
        php:
          container_name: zphp
          build:
              context: .
              dockerfile: Dockerfile-php
          environment:
              MYSQL_PASSWORD: 123456
          volumes:
              - ./web_dir/:/var/www/html/
          networks:
              - front_end
              - back_end
          depends_on:
              - mysql
        mysql:
          image: mysql:5.7
          container_name: zdb
          restart: always
          volumes:
              - ./mysql_data:/var/lib/mysql
          ports:
              - "3306:3306"
          environment:
              TZ: 'Asia/Shanghai'
              MYSQL_ROOT_PASSWORD: 123456
          command: ['mysqld', '--character-set-server=utf8']
          networks:
              - back_end
        phpmyadmin:
          build:
              context: .
              dockerfile: Dockerfile-phpmyadmin
          container_name: phpmyadmin
          ports:
              - "8080:80"
          environment:
              PMA_HOST: zdb
          networks:
              - back_end
    networks:
       front_end:
       back_end:
    • 运行docker-compose.yml文件

     

    (4)服务测试

    • 验证index.html

    • 验证index.php

    (5)Phpmyadmin

    • 在yml文件里面添加phpmyadmin

    • 写一个Dockerfile-phpmyadmin

    • 浏览器输入8080端口进入首页登录

    •  登录进入并查看表信息(由于index.php最后执行delete操作,所以没有数据)

     

    •  修改index.php,向里面插入数据并验证

     六、小结

      1、由于在写yml文件时无意间加入了table,导致运行时报错。

      key:一行一行的去用backspace检验table的存在。唉,自己种下的恶果自己要尝。

       2、在build phpmyadmin时由于要访问mysql_data里面的文件,但恰恰里面的文件却都加锁了。

           key:一个个把需要用到的文件赋予读写权限

      3、在调用index.php时,报出空对象异常

       key:原因是我在index.php连接数据库时用的host时localhost,而实际上运行的容器zdb拥有自己独立的IP,这里将host改为zdb或容器IP。并且后面加上长连接!

  • 相关阅读:
    ElementUI Select下拉框定位问题!
    Vue2 中keyup.enter触发问题!
    Java编写1到100质数之和
    JSP过滤器、Session监听器、Servlet控制器的关系和执行顺序
    EL表达式读取属性不存在的异常,读取类的属性不存在,无法调用到该属性
    Servlet中使用request转发页面引发的500空指针异常
    JSP动态产生的代码,点击显示确认操作,根据操作跳转并传值。
    Linux常用命令大全
    FastAdmin
    Laravel入门
  • 原文地址:https://www.cnblogs.com/huckleberry/p/12771736.html
Copyright © 2020-2023  润新知