• 系统综合实践 第3次实践作业——学习使用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
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    

    这里安装有点玄学,安装了三遍,第二行下载项都安装一半断掉,本来都打算找个国内镜像什么的,但再下一次又好了

    测试是否安装成功

    docker-compose --version
    

    (二)Dockerfile编写

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

    • 目录结构
      先展示一下目录结构,如图是做完实验后的目录结构,其中我画红色下划线部分是要自己配置的,其中data文件只要建立一个文件夹就好了,里面的文件是做完实验后自己生成的。
      然后phpyadmin文件夹内是选做部分需要配置的dockerfile文件,具体文件内容会在下面选做部分写出,建议一开始就写好,这样后面选做部分做起来很快。
    • mysql
    FROM mysql:5.7
    #基础镜像
    
    MAINTAINER yezi
    #镜像作者
    
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    ENV MYSQL_ROOT_PASSWORD=123456
    #不允许空密码登陆,设置初始密码
    
    
    • php
    FROM php:7.4-fpm
    #基础镜像
    MAINTAINER yezi
    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
    
    • index.php
    <?php phpinfo();?>
    
    • index.html
      这个可以看心情随便写内容
    • nginx
    FROM nginx
    #基础镜像
    MAINTAINER yezi
    #维护者
    EXPOSE 2208
    #映射端口
    
    • negix配置文件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;
        }
    }
    
    

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

    编写compose文件,完成上述LNMP/LAMP的微服务组合部署。

    • 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     
    
    
    • 运行docker-compose
    sudo docker-compose up -d --build
    

    • 查看镜像
    sudo docker images
    

    • 查看容器
    sudo docker ps -a
    

    • 访问http://localhost/index.html

    • 访问http://localhost/index.php

    (四)服务测试

    要求和提示:
    包括但不限于测试数据库连接、数据库新建、表新建、表记录的插入修改和删除是否成功(pdo或mysqli均可);

    参考:PHP连接MySQL

    • 测试数据库连接

    修改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();
    }
    ?>
    

    可以在http://localhost/index.php看到反馈信息

    • 新建数据库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; 
    ?>
    

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

    • 新建表
      建立foods_list表,包含属性订单号id、食物名name,食物价格price
    <?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 foods_list(
        id INT(8) UNSIGNED PRIMARY KEY, 
        name VARCHAR(30) NOT NULL,
        price DOUBLE(30) NOT NULL
    )";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "数据表 foods_list 创建成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    这里foodslist是之前建成但是忘记修改echo信息了,所以又建了一个

    • 插入数据
    <?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 foods_list (id,name, price)
        VALUES ('1','egg','2')");
        $conn->exec("INSERT INTO foods_list (id,name, price)
        VALUES ('2','potato', '3')");
        $conn->exec("INSERT INTO foods_list (id,name, price)
        VALUES ('3','salad', '6')");
    
        // 提交事务
        $conn->commit();
        echo "插入数据成功";
    }
    catch(PDOException $e)
    {
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    • 修改数据

    修改数据和删除数据只需修改替换index.php中的事务内容

     $conn->exec("UPDATE foods_list SET price='8' WHERE name='salad'"); 
    

    这里本来以为http://localhost/index.php只用于看反馈信息就没有刷新,直接查数据库后发现数据没有变化,不知道是不是有一定时延,但是刷新网站后就可以看到变化了。

    • 删除数据
      $conn->exec("DELETE FROM foods_list WHERE id='1'"); 
    

    (五)实验选做

    增加一个phpmyadmin容器,实现web端的数据库管理。

    • 编写Dockerfile文件
    #基础镜像
    FROM phpmyadmin/phpmyadmin            
    #维护者信息
    MAINTAINER yezi
    #暴露端口
    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再建(如果在之前就已经写好phpmyadmin相关dockfile和yml文件则无需这一步)
    docker-compose down
    ocker-compose up -d --build
    

    • 访问网址localhost:8080
      用root用户和yml中设置密码登录

    登录成功

    • 数据库操作

    查看表

    更新表

    将name=“egg”的价格price改为“3”

    删除数据

    看到id=2的行已删除

    实验完成

    (六)错误及解决方案

    • 1.忘记pull php

    实现多容器运行时,bulid之后,执行到php服务一直出错。
    看了很多前面交作业的大佬的php的dockerfile文档,发现竟然什么样的都有,一个个尝试都不行后直到看到,要pull php镜像才想到其余镜像都已经pull过了所以忘记拉取php镜像了

    2.无法建表
    原因在于,order是mysql的关键字,之前把表名取为order了
    这个是在http://localhost/index.php看到反馈的信息

    • 3.重新构建docker-compose失败

    因为做附加实验要在yml文件中添加内容,就docker-compose down移除了之前运行的,然后重新运行出现如下错误

    解决方案:在shell下删除data文件夹就好了

    • 4.使用phpmyadmin容器web端无法建表

    解决方案:未解决

    (七)实验心得

    这次实验内容不难,主要是要配置的文件有点多,文件中要修改的地方要与yml文件中对应,然后就还是以前那样,了解怎么做、做什么,花的时间比实验本身多。
    实验共耗时9小时45分,实验与文档同步,大概做文档耗时两个小时。最后附加实验做了1个半小时左右因为是down了之前的再运行的然后数据库没了,本来想直接在那个网站线上建的,但是建表的时候一直有问题,看了别人的攻略好像要填的都填了,不知道哪里有问题,最后还是在index.php文档中完成建数据库建表再在网站上完成数据更新等操作的。

  • 相关阅读:
    jQuery层级选择器
    jQuery基本选择器
    What is the difference between try/except and assert?
    glove 安装错误
    Windows10+anaconda,python3.5, 安装glove-python
    GloVe:另一种Word Embedding方法
    PyTorch在NLP任务中使用预训练词向量
    理解GloVe模型(Global vectors for word representation)
    word2vec 中的数学原理详解(二)预备知识
    Python zip() 函数
  • 原文地址:https://www.cnblogs.com/-yyl/p/12832629.html
Copyright © 2020-2023  润新知