系统结构综合实践-第三次作业

1.docker-compose的安装

在Linux中安装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和docker-compose.yml文件的编写

(1)Nginx

Dockerfile

FROM nginx:latest

修改default.conf文件

server {
        listen       80;
        server_name  localhost;
    
        location / {
            root   /var/www/html;    #与dockercompose中的路径相对应
            index  index.html index.htm index.php; # 增加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   /var/www/html;
        }
        location ~ .php$ {
            root           /var/www/html; # 代码目录
            fastcgi_pass   phpfpm:9000;    # 修改为phpfpm容器
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; # 修改为$document_root
            include        fastcgi_params;
        }
    }

(2)MySQL

Dockerfile

FROM mysql:5.7

(3)php

Dockerfile

这里额外安装了vim编辑器,便于在容器中修改文件。但是后面通过 volumes的挂载可以将宿主机中的文件映射到容器中,关键文件的修改在宿主机中进行就可以了,更方便。

FROM php:5.6-fpm

RUN 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-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
&& docker-php-ext-install gd 

(4)web文件

index.html

nginx build success!!!!

index.php

<?php 
phpinfo();

?>

(5)docker-compose.yml

docker-compose.yml的编写参考了博客
https://www.cnblogs.com/blogscc/p/9473123.html

整个实验过程最重要的一步。

个人认为最重要的是volumes和links这两个

volumes决定了宿主机到容器的文件映射

links决定了容器要连接到哪一个容器,让谁为我们提供服务,后面总结的时候会放一张图来解释这个links的过程。

version: "3"
services:
 nginx:
   build: ./nginx
   ports:
     - "80:80"
   links:
     - "phpfpm"
   volumes:
     - ./html/:/var/www/html/
     - ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
 phpfpm:
   build: ./phpfpm
   ports:
     - "9000:9000"
   volumes:
     - ./html/:/var/www/html/
   links:
     - "mysql"
 mysql:
   build: ./mysql
   ports:
     - "3306:3306"
   volumes:
     - ./mysql/data/:/var/lib/mysql/
   environment:
     MYSQL_ROOT_PASSWORD : 123456

文件目录的结构

最后运行sudo docker-compose up -d

查看一下各个容器的运行状态

4.服务测试

(1)首先查看一下index.html和index.php

(2)测试能否正常连接数据库

以下测试代码参考菜鸟教程
https://www.runoob.com/php/php-mysql-connect.html

通过修改index.php文件进行测试

<?php
$servername = "mysql";    #这里使用的servername要与yml文件中的links相匹配
$username = "root";
$password = "123456";    
 
try {
    $conn = new PDO("mysql:host=$servername", $username, $password);
    echo "connect success!"; 
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>

(3)测试新建数据库testDB

<?php
$servername = "mysql";   
$username = "root";
$password = "123456";     
 
try {
    $conn = new PDO("mysql:host=$servername", $username, $password); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "connect success";
    $sql = "CREATE DATABASE testDB";

    
    $conn->exec($sql);

    echo "create database success";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>

进入MySQL所在容器查看是否创建成功

(4)测试新建表Book

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="testDB";        
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);    #选择数据库
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 使用 sql 创建数据表
    $sql = "CREATE TABLE Book (
    id INT(9) UNSIGNED PRIMARY KEY, 
    name VARCHAR(30) NOT NULL
    )";
   
    $conn->exec($sql);
    echo "create table Book success";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

(5)测试在表中插入数据

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="testDB";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 开始事务
    $conn->beginTransaction();
    // SQL 语句
    $conn->exec("INSERT INTO Book (id,name) 
    VALUES (1001, 'java')");
    $conn->exec("INSERT INTO Book (id,name) 
    VALUES (1002, 'python')");
    $conn->exec("INSERT INTO Book (id,name) 
    VALUES (1003, 'network')");
 
    // 提交事务
    $conn->commit();
    echo "insert success";
}
catch(PDOException $e)
{
    // 如果执行失败回滚
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

(6)测试删除与修改数据

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="testDB";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 开始事务
    $conn->beginTransaction();
    // SQL UPDATE 语句
    $conn->exec("UPDATE Book SET name='Clanguage' WHERE id=1003");
    //SQL  DELETE语句
    $conn->exec("DELETE FROM Book where id=1001");
    // 提交事务
    $conn->commit();
    echo "updata and delete success";
}
catch(PDOException $e)
{
    // 如果执行失败回滚
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

5.选做

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

参考了博客
https://www.cnblogs.com/yin5th/p/9778685.html

只需要在原来的docker-compose.yml后面新增如下内容并且在新增一个建立phpmyadmin的Dockerfile

Dockerfile

FROM phpmyadmin/phpmyadmin:latest

然后在相应的目录下执行

docker-compose down
docker-compose up -d

查看以下重新执行完docker-compose的容器结构

接下来通过localhost的 9090端口即可访问phpmyadmin

可以看到我们在上个实验中新建的数据库testDB以及新建的表 Book

通过可视化的界面可以对后台数据库进行管理真的是非常的方便

碰到的问题

1.

在执行docker-compose up的时候卡在这里卡了好久。

尝试解决的办法:

参考了博客
https://www.cnblogs.com/PyKK2019/p/11062019.html

添加两行代码进行换源

RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN  apt-get clean

但我这里并没成功换源,下一次下载的时候还是官方的源,并不是阿里的源。。。。。。

但是第二天下载的时候速度却谜之快,也算解决了吧。。。。。

后来在群里看到别人由提到不同的换源方法,这里码一下,下次可以试试:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free

总结一哈

1.什么是docker-compose

这个问题在我开始做实验之前困扰了我很久。

后来我在B站上找到了这个视频教程,解释的简单明了,思路清晰,非常值得一看
https://www.bilibili.com/video/BV1Wt411w72h

这是一张比较简洁的原理图 ,可以帮助我们理解容器之间是怎样协同工作的 。

下面这张图就较为详细的展示了容器到宿主机,以及nginx如何充当反向代理的,对于我们理解docker-compose.yml文件该如何编写很有帮助。

简单来说,docker-compose是一个定义和运行docker多容器的工具。不需要我们再单独去创建一个个容器,可以一次通过yml文件创建并启动所有服务。

2.nginx的文件配置问题

这里还是还是参考了那位up对于nginx的 讲解(真是宝藏up

https://www.bilibili.com/video/BV1Bx411Z7Do

这里对于nginx匹配规则和负载均衡的讲解可以说对新人非常友好了

花费的时间

查阅资料+动手实验 +写博客大约用时9小时,比预计的久了一些

原文地址:https://www.cnblogs.com/WAYNEEZHONG/p/12837792.html