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

    Docker Compose 安装

    从官方 Github Release 处直接下载编译好的二进制文件:

    $ sudo curl -L https://github.com/docker/compose/releases/download/1.26.0-rc4/docker-compose-Linux-x86_64 >> /usr/local/bin/docker-compose
    

    或者通过pip指令

    $ sudo pip install -U docker-compose
    

    为docker-compose添加可执行权限(ubuntu)

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

    检查安装是否成功

    $ docker-compose --version
    

    Ubuntu 可能出现权限不够问题通过 sudo -i ,输入密码进入 root 模式




    Dockerfile编写

    选择LNMP

    pull php 镜像

    sudo docker pull php:7.4-fpm


    目录结构

    dockerfile_nginx

    FROM nginx
    
    MAINTAINER gp
    
    EXPOSE 1998
    

    dockerfile_mysql

    FROM mysql
    MAINTAINER gp
    #设置root密码
    ENV MYSQL_ROOT_PASSWORD 123456
    #设置不可免密登录
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    

    dockerfile_php

    FROM php:7.4-fpm
    MAINTAINER gp
    FROM php:7.4-fpm
    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.html

    ……
    

    index.php

    <?php phpinfo();?>
    

    default.conf

    server {
        listen       1998;        #修改映射端口
        server_name  localhost;
    
        location / {
            root   /web;     #修改工作目录
            index  index.html index.htm;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        location ~ .php$ {
            root           /web;          #修改工作目录
            fastcgi_pass   myphp:9000;        #修改为容器名
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
            include        fastcgi_params;
        }
    }
    

    docker-compose.yml

    version: "3"
    services:
        nginx:
            image: mynginx_image                #指定镜像名
            container_name: mynginx             #指定容器名
            build:
                context: .
                dockerfile: dockerfile_nginx      #指定dockerfile文件
            ports:
                - "80:1998"                       #修改端口映射
            volumes:
                - ./web:/web/html                 #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;                
                - ./default.conf:/etc/nginx/conf.d/default.conf     #配置文件
        php:
            image: myphp_image 
            container_name: myphp 
            build:
                context: .
                dockerfile: dockerfile_php 
            environment:
                MYSQL_PASSWORD: 123456           
            volumes:
                - ./web:/web/php              #挂载工作目录到本机web目录   
    
        mysql:
            image: mysql_image 
            container_name: mysql
            build:
                context: .
                dockerfile: dockerfile_mysql
            ports:
                - "3306:3306"
            volumes:
                - ./mysql:/var/lib/mysql       
    



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

    运行docker-compose

    sudo docker-compose up -d --build
    

    查看容器和镜像

    访问localhost/index.html 、localhost/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();
    }
    

    数据库创建

    <?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 Nil"; 
    
        // 使用 exec() ,因为没有结果返回 
        $conn->exec($sql); 
    
        echo "数据库创建成功<br>"; 
    } catch (PDOException $e) { 
        echo $sql . "<br>" . $e->getMessage(); 
    } 
    
    $conn = null; 
    ?>
    

    表的创建

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="Nil";       
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);    #选择数据库
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // 使用 sql 创建数据表
        $sql = "CREATE TABLE nil(
            id int(4) not null primary key,
            name varchar(8) not null
        ); ";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "数据表 nil 创建成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    插入数据

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="Nil";       
     
    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 nil (id,name)
        VALUES ('0','no')");
        $conn->exec("INSERT INTO nil (id,name)
        VALUES ('1','none')");
        $conn->exec("INSERT INTO nil (id,name)
        VALUES ('2','nothing')");
    
        // 提交事务
        $conn->commit();
        echo "插入数据成功!";
    }
    catch(PDOException $e)
    {
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    删除数据

    <?php
    $servername = "mysql";
    $username = "root";
    $password = "123456";
    $dbname="Nil";       
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         //开始事务
        $conn->beginTransaction();
        $conn->exec("DELETE FROM nil WHERE id='2'");
    
        // 提交事务
        $conn->commit();
        echo "删除数据成功!";
    }
    catch(PDOException $e)
    {
        $conn->rollback();
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
    

    终端进入容器验证

    $ sudo docker exec -it  mysql /bin/bash
    mysql -u root -p
    show databases;
    use ...s;
    show tables;
    select * from ...;
    

    $ docker-compose down
    




    总结

    ​ 实验大概前前后后学习实践花了10多个小时,分别在Ubuntu、macos上实践了。

    ​ 在安装Docker Compose时,除了从 GitHub crul,后面了解到pip也可以实现安装(使用pip限定国内镜像能免去挺多麻烦,还挺快)。

    ​ 在Ubuntu上需要对Docker Compose添加可执行权限,mac上省去了这步。

    ​ 使用docker-compose up命令部署项目时,定制PHP出现总是下载不了的情况。卡在Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7907 kB]动不了。通过换源解决。

    ​ 在使用docker-compose up命令部署项目,出现了

    端口80被开机自启的apache2占用,使用service apache2 stop解决问题。

    ​ 实验结束顺手docker-compose down关闭删除容器,之前没这做,踩了几次雷,一个个把先前作业的容器rm。

  • 相关阅读:
    Windows Embedded CE 中断结构分析
    linux framebuff驱动总结
    Linux assemblers: A comparison of GAS and NASM
    使用C#编写ICE分布式应用程序
    makefile的写法
    在客户端中如何定位服务器(即如何寻找代理)
    番茄花园洪磊: 微软很早给我发过律师函
    利用ICE编写程序的几个注意点
    ICE架构
    AT&T汇编语言与GCC内嵌汇编简介
  • 原文地址:https://www.cnblogs.com/gp131415/p/12852842.html
Copyright © 2011-2022 走看看