首页 > 技术文章 > 2017级系统综合实践 第3次实践作业

huaranmeng 2020-05-01 00:09 原文

作业链接

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

推荐阅读