zoukankan      html  css  js  c++  java
  • 2020系统综合实践 第3次实践作业

    1.安装Docker-compose

    运行以下命令以下载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
    

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

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

    测试安装是否成功

    docker-compose --version
    

    2.编写配置文件和测试文件

    拉取一个PHP镜像

    sudo docker pull php:5.6-fpm
    

    在系统主目录下创建一个docker_compose文件夹,此文件夹用于存放实验中我们需要用到的各种配置文件,docker_compose中的具体配置文件如下所示:

    sudo get-apt install tree
    tree
    


    编写index.html并测试

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>dyssl's second webpage for Nginx</title>
    </head>
    <body>
        <h1>dyssl's second page for Nginx</h1>
        <p>Success</p>
    </body>
    </html>
    


    编写index.php

    <?php phpinfo();?>
    

    编写default.conf

    server {
            listen       5416;  # 修改监听端口
            server_name  localhost;
        
            location / {
                root   /dyssl/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           /dyssl/html; # 代码目录
                fastcgi_pass   phpfpm:9000;    # 修改为phpfpm容器
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; # 修改为$document_root
                include        fastcgi_params;
            }
        }
    
    

    编写Nginx的Dockerfile

    #基础镜像
    FROM nginx:latest
    
    #镜像作者
    MAINTAINER dyssl
    
    #暴露端口
    EXPOSE 80
    

    编写mysql的Dockerfile

    #基础镜像
    FROM mysql:5.7
    #镜像作者
    MAINTAINER dyssl
    #设置不允许免密登录并设置root密码
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    ENV MYSQL_ROOT_PASSWORD=123456
    

    编写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 
    

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

    编写docker-compose.yml

    version: "3"
    services:
     nginx:
       build: ./nginx
       ports:
         - "80:5416"
       links:
         - "phpfpm"
       volumes:
         - ./html/:/dyssl/html/
         - ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
     phpfpm:
       build: ./phpfpm
       ports:
         - "9000:9000"
       volumes:
         - ./html/:/dyssl/html/
       links:
         - "mysql"
     mysql:
       build: ./mysql
       ports:
         - "3306:3306"
       volumes:
         - ./mysql/data/:/var/lib/mysql/
       environment:
         MYSQL_ROOT_PASSWORD : 123456
    

    构建LNMP环境

    sudo docker-compose up -d --build
    

    访问index.html

    访问index.php

    4.服务测试

    连接数据库
    修改index.php

    <?php
    $servername = "compose-lnmp_mysql_1"; #填容器名
    $username = "root";
    $password = "123456";
     
    try {
        $conn = new PDO("mysql:host=$servername;", $username, $password);
        echo "连接成功"; 
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
    ?>= null;
    ?>
    

    (这里忘记截图了)

    在浏览器尝试连接数据库
    (这里忘记截图了)

    创建数据库
    修改index.php

    <?php
    $servername = "compose-lnmp_mysql_1";
    $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;
    ?>
    

    使用浏览器尝试创建数据库

    在命令行中输入以下命令,查看数据库

    sudo docker ps -a
    sudo docker exec -it 84a097a9f7af /bin/bash
     mysql -u root -p
    show databases;
    


    创建数据表
    修改index.php

    <?php
    $servername = "compose-lnmp_mysql_1";
    $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 MyGuests (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        firstname VARCHAR(30) NOT NULL,
        lastname VARCHAR(30) NOT NULL,
        email VARCHAR(50),
        reg_date TIMESTAMP
        )";
     
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "数据表 MyGuests 创建成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    

    使用浏览器尝试创建数据表

    在容器中查看

    use myDBPDO;
    SHOW TABLES;
    

    插入数据
    修改index.php

    <?php
    $servername = "compose-lnmp_mysql_1";
    $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 = "INSERT INTO MyGuests (firstname, lastname, email)
        VALUES ('John', 'Doe', 'john@example.com')";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "新记录插入成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    使用浏览器尝试插入数据

    进入容器查看

    select * from MyGuests;
    

    表记录的修改
    修改index.php

    <?php
    $servername = "compose-lnmp_mysql_1";
    $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 = "UPDATE MyGuests SET lastname= 'Tim' 
    		WHERE id= 1";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "记录修改成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    使用浏览器尝试修改数据

    进入容器查看

    select * from MyGuests;
    

    表记录的删除
    修改index.php

    <?php
    $servername = "compose-lnmp_mysql_1";
    $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 = "DELETE FROM MyGuests;";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "成功删除表记录";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    使用浏览器尝试删除数据

    进入容器看看

    5.增加phpmyadmin容器

    拉取镜像

    sudo docker pull phpmyadmin/phpmyadmin
    

    在docker-compose.yml中添加

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

    为phpmyadimin编辑Dockerfile

    FROM phpmyadmin/phpmyadmin:latest
    EXPOSE 8000
    

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

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


    在浏览器访问8080输入用户名和密码就可以登录

    6.遇到的问题

    构建LNMP环境的时候出现了问题

    换源即可解决

    7.经验和感想

    每次实验都没有一帆风顺,遇到问题分析问题,找百度,请教同学,每次都会有成长
    感谢在这次实验中带给我帮助的同学们

    8.花费时间

    8小时左右吧,卡在构建lnmp环境了很久,其他地方的小问题十几分钟就解决了,写博客也写了一个多小时

  • 相关阅读:
    Python str转化成数字
    MySQL之CONCAT()的用法
    MySQL之LIMIT用法
    MySQL中LOCATE用法
    设计模式-模版方法
    设计模式-单例模式
    设计模式-桥接模式
    UML图标含义及记忆方法
    redis-分布式锁-消除竞争条件
    redis-分布式锁-刷新信号量
  • 原文地址:https://www.cnblogs.com/dyssl/p/12850273.html
Copyright © 2011-2022 走看看