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


    到目前为止,已经安排了两次实践作业,通过前两次的实践作业,我们已经完成了docker的入门和单个容器服务的定制,这是一个很好的开始。现在我们更进一步。
    一个最终的应用通常需要组装多个容器提供的多个服务。以web服务为例,需要完成web服务器、数据库、开发程序等服务的组装,典型的如LAMP(Linux+Apache+Mysql+PHP)或LNMP(Linux+Nginx+Mysql+PHP)。Docker compose是作为定义和运行多容器的工具,用户可以使用 YML 文件来配置应用程序需要的所有服务。本次作业需要各位实践Docker compose,各位可以在第二次实践作业的基础之上开展,要求如下:

    (1)完成Docker-compose的安装

    参考资料: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)Dockerfile编写

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

    搭建LNMP-nginx:latest、mysql:latest、php:7.4-fpm

    基于前两次实验已经下载了前两个镜像,现只需下载php:7.4-fpm

    sudo docker pull php:7.4-fpm
    

    *在主目录下构建一下配置文件和目录(部分配置文件可以在第二次实验配置文件的基础上 用cp命令复制过去,在进行修改,工作量会减少哦)

    编写配置文件

    *dockerfile_nginx

    #基于什么镜像
    FROM nginx
    #作者,联系方式
    MAINTAINER ruinzly <1511490721@qq.com>
    
    #COPY default.conf /etc/nginx/conf.d/
    #COPY web/ /usr/share/nginx/myweb/
    
    CMD ["nginx","-g","daemon off;"]
    #暴露端口2506
    EXPOSE 2506
    

    *dockerfile_php

    FROM php:7.4-fpm
    MAINTAINER ruinzly
    
    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
    

    *dockerfile_mysql

    FROM mysql
    MAINTAINER ruinzly
    #配置环境变量
    ENV USERNAME root                       #定义用户名称
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no       #设置不允许免密登录
    ENV MYSQL_ROOT_PASSWORD 123456          #设置root下mysql登录密码
    

    *default.conf

    #nginx的配置文件
    server {
        listen       2506;  #修改映射端口
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
    
     server_name  localhost;      
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {      
            root   /web/html;           #修改工作目录,访问自定义该目录下的文件(./web/html)            
            index index.html index.htm;
            autoindex on;
        }
    
        #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   /usr/share/nginx/html;
        }
    location ~ .php$ {
            root           /web/php;    ##修改工作目录,访问自定义该目录下的文件(./web/html)   
            fastcgi_pass   php:9000;   
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
          # include        fastcgi.conf;
         }
    }
    

    *docker-compose.yml

     php:
        image: compose_php:test
        container_name: compose_php
        build:
          context: .
          dockerfile: dockerfile_php
        environment:
          MYSQL_ROOT_PASSWORD: 123456
        volumes:
          - ./web:/web/php
    
     mysql:
        image: compose_sql:test
        container_name: compose_sql
        build:
          context: .
          dockerfile: dockerfile_mysql
        ports:
          - 3306:3306
          #   environment:
          # - MYSQL_ROOT_PASSWORD=123456        
        volumes:
          - ./data_mysql:/var/lib/mysql
    
    • index.html
    Welcome,you are sucessfully visit static html!
    
    • index.php
    <?php phpinfo();?>
    

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

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

    开启docker-conpose

    docker-compose up -d --build
    

    (执行成功的样子)

    查看镜像、正在运行的容器

    docker images
    docker ps
    

    保证三个容器正常运行的前提下,火狐访问localhost/index.html和localhost/inden.php

    4)服务测试

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

    测试数据库连接

    *修改index.php

    <?php
    $servername = "compose_sql";
    $username = "root";
    $password = "123456";
    
    try {
        $conn = new PDO("mysql:host=$servername;", $username, $password);
        echo "恭喜你终于连接成功!";
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
    ?>
    

    *创建数据库myDBPDO

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

    *进入容器查看是否真的生成了数据库

    *创建表格Ruin_table_2,往里面插入数据

    <?php
    $servername = "compose_sql";
    $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 Ruin_table_2 (
        id INT(10)  PRIMARY KEY,
        sex VARCHAR(20) NOT NULL,
        username VARCHAR(30) NOT NULL
        )";
    
        // 使用 exec() ,没有结果返回
        $conn->exec($sql);
        echo "数据表 Ruin_table_2 创建成功!";
    }
    catch(PDOException $e)
    echo $sql . "<br>" . $e->getMessage();
    
    
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "INSERT INTO Ruin_table_2 (id, sex, username)
        VALUES (031702506, 'female', 'Zhong Luying')";
        // 使用 exec() ,没有结果返回
        $conn->exec($sql);
        echo "新记录插入成功!";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
    
    
    $conn = null;
    
    ?>
    

    *进入compose_sql查看是否生成表格Ruin_table和插入数据

    #进入root权限
    sudo su
    mysql -u root -p
    use myDBPDO;
    show tables;
    select * from Ruin_table_2;
    

    *修改数据和删除数据
    再插入一条数据

     <?php
    $servername = "compose_sql";
    $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 Ruin_table_2 (id, sex, username)
        VALUES (031702504, 'female', 'LinRui')";
        // 使用 exec() ,没有结果返回
        $conn->exec($sql);
        echo "新记录插入成功!";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
    
    
    $conn = null;
    

    删除数据

    做完记得docker-compose down

    docker-compose down
    

    (5)总结

    途中遇到的问题

    • docker-compose up后查看容器nginx启动后立马关闭;
      解决方式:
      查看nginx的日志
    docker log compose_nginx
    

    查看完后发现相关的配置文件有错

    • 在访问localhost/index.php 出现file not found错误
      解决方式:
      查看cmpose_php日志
    docker log compose_php
    
    [error] 1507#0: *22 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: www.wordpress.com, request: "GET /info.p
    

    解决方式:修改php的配置文件参照该文

    感想

    这次实验大概花了24小时左右,中间因为滥用chmod导致很多文件的权限有问题,只能够恢复各种文件,重头来过。做的过程中有点不太顺利,因为不熟练造成的,但是做出来还是很开心的!

  • 相关阅读:
    [Windows Azure] How to Scale a SQL Database Solution
    [Windows Azure] Monitoring SQL Database Using Dynamic Management Views
    [Windows Azure] Managing SQL Database using SQL Server Management Studio
    [Windows Azure] How to Deploy a Database to Windows Azure
    [Windows Azure] How to Create and Configure SQL Database
    [Windows Azure] Guidelines for Connecting to Windows Azure SQL Database
    [Windows Azure] Development Considerations in Windows Azure SQL Database
    [Windows Azure] Management REST API Reference
    [Windows Azure] Windows Azure SQL Database library
    [Windows Azure] Getting Started with Windows Azure SQL Data Sync
  • 原文地址:https://www.cnblogs.com/ruinzly/p/12840212.html
Copyright © 2020-2023  润新知