(1)完成Docker-compose的安装

安装命令如下:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

一开始我直接安装失败了,所以必须改在root权限下安装才可。

查看安装的版本:
docker-compose --version

(2)Dockerfile编写

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

使用docker pull 下载php镜像

docker pull php:7.4-fpm

mysql

#Dockerfile
#基础镜像
FROM mysql:5.7
#维护者信息
MAINTAINER qhh
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD=123456
#不允许空密码登陆,设置初始密码

nginx

#Dockerfile
FROM nginx
#基础镜像
MAINTAINER xmmm
#维护者
EXPOSE 2208
#映射端口

#default.conf
server {
    listen       2208;  #修改映射端口
    server_name  localhost;

    location / {
        root   /www/web; #修改nginx工作目录
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        root           /www/web; # php容器web文件代码目录
        fastcgi_pass   php:9000; # 修改php服务器端口
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;# 修改为$document_root
        include        fastcgi_params;
    }
}

php

FROM php:7.4-fpm
#基础镜像
MAINTAINER xmmm
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

web

#index.html
hello,welcome to mynginx

#index.php
<?php phpinfo();?>

最终的tree文件树

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

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

docker-compose.yml文件

version: "3"
services:
    #nginx服务
    nginx:
        image: nginx_image  #镜像名
        container_name: nginx_container  #容器名
        build: ./nginx
        ports:
            - "80:2208"     #暴露端口
        volumes:
            - ./web:/www/web   #磁盘映射,后者与default.conf中定义的一致             
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    #php服务
    php:
        image: php_image 
        container_name: php_container 
        build: ./php
        environment:
            MYSQL_PASSWORD: 123456           
        volumes:
            - ./web:/www/web                
    #mysql服务
    mysql:
        image: mysql_image 
        container_name: mysql_container
        build: ./mysql
        ports:
            - "3306:3306"
        volumes:
            - ./mysql/data:/var/lib/mysql 
        environment:
            MYSQL_ROOT_PASSWORD : 123456    

运行docker-compose

sudo docker-compose up -d

查看镜像

sudo docker images

查看容器

sudo docker ps -a

访问http://localhost/index.html

访问http://localhost/index.php

(4)服务测试

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

测试数据库连接

修改index.php连接数据库

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
 
try {
    $conn = new PDO("mysql:host=$servername;", $username, $password);
    echo "mysql数据库已连接成功!"; 
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>

可以看到修改后的输出

新建数据库docker-compose-db

<?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 dockerComposeDB"; //修改数据库名

    // 使用 exec() ,因为没有结果返回 
    $conn->exec($sql); 

    echo "数据库创建成功<br>"; 
} 
catch(PDOException $e) 
{ 
    echo $sql . "<br>" . $e->getMessage(); 
} 

$conn = null; 
?>

登录数据库查看数据库信息

新建表

建立student表,包含属性:学号sno,姓名sname,成绩grade

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";       
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,$password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 使用 sql 创建数据表
    $sql = "CREATE TABLE student(
            sno INT(8) UNSIGNED PRIMARY KEY,
            sname CHAR(30) NOT NULL,
            grade INT(3)
            )";
    // 使用 exec() ,没有结果返回 
    $conn->exec($sql);
    echo "数据表 student 创建成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

插入数据

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";       
 
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 student (sno,sname, grade)
    VALUES ('10011','lihua','92')");
    $conn->exec("INSERT INTO student (sno,sname, grade)
    VALUES ('10012','wanglei','77')");
    $conn->exec("INSERT INTO student (sno,sname, grade)
    VALUES ('10013','lishuang','83')");
    $conn->exec("INSERT INTO student (sno,sname, grade)
    VALUES ('10014','yangminting','100')");
    // 提交事务
    $conn->commit();
    echo "插入数据成功!";
}
catch(PDOException $e)
{
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

修改数据

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";       
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     //开始事务
    $conn->beginTransaction();
    $conn->exec("UPDATE student SET grade=87 WHERE sname='lishuang'"); 
    $conn->exec("UPDATE student SET grade=80 WHERE sno='10012'"); 
    $conn->exec("UPDATE student SET grade=grade+2 WHERE sname='lihua'");
    $conn->exec("UPDATE student SET sname='ymt' WHERE sno='10014'");  
    // 提交事务
    $conn->commit();
    echo "修改数据成功!";
}
catch(PDOException $e)
{
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

删除数据

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";       
 
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 student WHERE sno='10012'");  
    $conn->exec("DELETE FROM student WHERE sname='lishuang'");  

    // 提交事务
    $conn->commit();
    echo "删除数据成功!";
}
catch(PDOException $e)
{
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

(5)选做:增加一个phpmyadmin容器,实现web端的数据库管理。

编写Dockerfile文件

#基础镜像
FROM phpmyadmin/phpmyadmin            
#维护者信息
MAINTAINER qhh
#暴露端口
EXPOSE 8080

编辑yml文件

在docker-compose.yml最后面加上:

phpmyadmin:
    image: phpmyadmin_image
    container_name: myphpmyadmin_container
    build: ./phpmyadmin
    ports: 
        - "8080:80" 
    environment:
        PMA_HOST: mysql        

重新启动docker-compose

移除之前运行的docker-compose再建

docker-compose down
docker-compose up -d --build

访问网址localhost:8080

phpmyadmin数据库一系列操作

(6)实验报告

记录实验过程的主要问题和解决方法,分享经验和感想

(1)下载docker和php老是到一半就停了,等了好久也不见有反应,解决方法是换源,尤其是国内的网站。
(2)一开始我不知道怎么编写Dockerfile文件,然后参考其他同学,我花费了一些时间去想那个tree树时怎么来的,然后才想起来是文件的结构,然后就知道怎么编写Dockerfile文件了。
(3)在第三步的时候,运行docker-compose时,网站地址响应很慢,有时候甚至是卡了几十分钟,弄得我心情很烦,然后忍不住又去取消重新运行,试了好几回也等了好长时间才能运行成功,但是又马上有新问题,就是我登录localhost/index.html和localhost/index.php连接建立失败,我又百度了一会儿,然后发现可能端口设置不对,我把端口改成别的了,然后就干脆设置成80。
(4)在第三步运行docker-compose时,不知道为什么我的docker突然启动不了,然后再试了几次还不行,实在没招我就想着删除了重新下载算了,结果让我想不到的是,虽然卸载成功了,然而我想再安装docker-ce的时候却失败了,每次安装都失败,真的是让我抓狂,然后把错误的地方去百度,知道了就是docker的daemon.json文件配置出现了错误,然后我千辛万苦找到了这个配置文件,打开发现里面果然啥东西都没了,是不是什么时候被误删了(疑惑),然后又一顿百度怎么配置daemon.json文件,然后顺带学习怎么使用vim编译器(以前没用过这),经过揪心的历程,最后终于舒了一口气。

记录完成作业所花的时间

总计大约:12小时
1、完成作业内容时间:大约7小时
2、各种百度学习时间:大约2小时
3、各种反复下载和运行时间,以及电脑卡顿卡机时间:大约3小时

心得体会

主要心得是我的耐心得到了训练,控制情绪,还有也又学到了一些知识。