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


    作业链接

    1.完成Docker-compose的安装

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

    .
    ├── default.conf		#nginx配置文件
    ├── docker-compose.yml
    ├── html			#网页的工作目录
    │   ├── index.html
    │   └── index.php
    ├── MySQL_Data		#空目录,MySQL数据库的内容将会被同步到此
    ├── MySQLDockerfile
    ├── NginxDockerfile
    └── phpDockerfile
    

    (1) default.conf

    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /usr/share/nginx/mydir;
            index  index.html index.htm 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   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ .php$ {
            root           /usr/share/nginx/mydir;
            fastcgi_pass   phpfpm:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }
    

    (2) html目录

    存放index.htmlindex.php

    (3)index.html

    随意

    (4)index.php

    <?php phpinfo();?>
    

    (5)MySQLDockerfile

    FROM mysql:5.7
    MAINTAINER by HRM
    #设置root密码
    ENV MYSQL_ROOT_PASSWORD 123456
    #设置不可免密登录
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    

    (6)NginxDockerfile

    FROM nginx
    #维护者信息
    MAINTAINER by HRM
    #暴露端口
    EXPOSE 80
    

    (7)phpDockerfile

    #基础镜像
    FROM  php:7.4-fpm
    #作者信息
    MAINTAINER HRM
    #更换镜像源
    RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    #安装扩展pdo
    RUN apt-get clean && 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 --with-jpeg 
    && docker-php-ext-install gd 
    
    

    (8)MySQL_Data

    新建这个空目录
    MySQL数据库的内容将会被同步到此

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

    docker-compose.yml

    version: "3"
    services:
     nginx:
       image: nginx_image #指定镜像名
       container_name: nginx_container #指定容器名
       build:
        context: .
        dockerfile: NginxDockerfile #指定dockerfile文件
       ports:
         - "80:80" #端口映射
       links:
         - "phpfpm"
       volumes:
         - ./html/:/usr/share/nginx/mydir/ #映射网页的工作目录
         - ./default.conf:/etc/nginx/conf.d/default.conf #映射nginx配置文件
     phpfpm:
       image: php_image #指定镜像名
       container_name: php_container #指定容器名
       build:
        context: .
        dockerfile: phpDockerfile
       ports:
         - "9000:9000" #端口映射
       volumes:
         - ./html/:/usr/share/nginx/mydir/ #映射网页的工作目录
       links:
         - "mysql"
     mysql:
       image: mysql_image #指定镜像名
       container_name: mysql_container #指定容器名
       build:
        context: .
        dockerfile: MySQLDockerfile
       ports:
         - "13306:3306" #端口映射
       volumes:
         - ./MySQL_Data/:/var/lib/mysql/ #映射服务数据卷路径
    

    进入工作目录

    执行 docker-compose up -d

    4.服务测试

    • 数据库连接

      教程: PHP与MySQL的教程

      直接修改 index.php内容为下

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

    • 数据库新建

      <?php
      $servername = "mysql_container";
      $username = "root";
      $password = "123456";
      
      try {
          $conn = new PDO("mysql:host=$servername", $username, $password);
          echo "连接成功";
          // 设置 PDO 错误模式为异常
          $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          $sql = "CREATE DATABASE SCHOOL";
      
          // 使用 exec() ,因为没有结果返回
          $conn->exec($sql);
      
          echo "数据库创建成功<br>";
      }
      catch(PDOException $e)
      {
          echo $sql . "<br>" . $e->getMessage();
      }
      
      $conn = null;
      ?> 
      

    • 新建表

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

    • 表记录的插入

      <?php
      $servername = "mysql_container";
      $username = "root";
      $password = "123456";
      $dbname = "SCHOOL";
       
      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 student (id, name, score) 
          VALUES ('031702142', 'HRM', 100)");
          $conn->exec("INSERT INTO student (id, name, score) 
          VALUES ('033333333', 'Trump', 60)");
          $conn->exec("INSERT INTO student (id, name, score) 
          VALUES ('233333333', 'XiaoMing', 80)");
       
          // 提交事务
          $conn->commit();
          echo "新记录插入成功";
      }
      catch(PDOException $e)
      {
          // 如果执行失败回滚
          $conn->rollback();
          echo $sql . "<br>" . $e->getMessage();
      }
       
      $conn = null;
      ?>
      

    • 表记录的修改和删除

      <?php
      $servername = "mysql_container";
      $username = "root";
      $password = "123456";
      $dbname = "SCHOOL";
       
      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("UPDATE student SET name='real_Trump' WHERE id='033333333'");
      
          $conn->exec("DELETE FROM student WHERE id='233333333'");
      
          // 提交事务
          $conn->commit();
          echo "更新数据成功";
      }
      catch(PDOException $e)
      {
          // 如果执行失败回滚
          $conn->rollback();
          echo $sql . "<br>" . $e->getMessage();
      }
       
      $conn = null;
      ?>
      
      

    5.选做

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

    这里需要修改下docker-compose.yml并添加一个phpmyadmindockerfile

    docker-compose.yml最后添加

     phpmyadmin:
        image: phpmyadmin_image
        container_name: phpmyadmin_container
        build: 
          context: .
          dockerfile: phpmyadminDockerfile
        ports: 
          - "8080:80" #phpmyadmin默认监听80
        environment:
          PMA_HOST: mysql_container  #指定mysql服务所在的host
    

    创建phpmyadminDockerfile文件

    #基础镜像
    FROM phpmyadmin/phpmyadmin:latest
    #作者信息
    MAINTAINER HRM
    #暴露端口
    EXPOSE 8080
    

    执行 docker-compose up -d命令

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

    查看数据库信息

    6.遇到的问题

    选做题时命令出错,原因是同步数据库的MySQL_Data目录会被锁

    解决方法

    sudo chown -R $USER MySQL_Data
    
  • 相关阅读:
    Windows 创建 Redis 和 zookeeper 系统服务
    mysql 5.7 非正常安装,无法启动 服务没有报告任何错误
    将整个 project 资源打包
    使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
    所有子模块都要执行的checkstyle检查
    把项目通过maven生产源码包和文档包并发布到自己的私服上
    C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
    C#.NET常见问题(FAQ)-无法直接启动带有类库输出类型的项目怎么办
    C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串
    C#.NET常见问题(FAQ)-如何在系统变量中加入新的环境变量
  • 原文地址:https://www.cnblogs.com/huaranmeng/p/12812217.html
Copyright © 2020-2023  润新知