第3次系统综合实践

安装Docker-compose

  • 下载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

  • 创建指向/usr/bin目录的软链

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

  • 测试是否安装成功

docker-compose --version
第3次系统综合实践

Dockerfile编写(LNMP)

  • 目录结构
    第3次系统综合实践
    第3次系统综合实践

  • nginx Dockerfile

#first apache test
#FROM httpd:latest
FROM nginx:latest
LABEL Author=kingbob DATE=2020.4.18
#ENV mypath /kb/nginx
#WORKDIR $mypath
#COPY default.conf /etc/nginx/conf.d
#COPY index.html /kb/nginx
EXPOSE 7799
#CMD ["/bin/bash"]
#ENTRYPOINT ["zhi_ling","can_shu","xiangmu_wenjian"]
  • php Dockerfile
FROM php:7.4-fpm
LABEL Author=kingbob DATE=2020.5.2
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
  • mysql Dockerfile
FROM mysql:5.7
LABEL maintainer=kingbob DATE=2020.4.22

#设置密码登录
ENV MYSQL_ROOT_PASSWORD=123456
ENV MYSQL_ALLOW_EMPtY_PASSWORD no

#设置免密登录
#ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
#将所需文件放到容器中
#COPY setup.sh /mysql/setup.sh
#COPY schema.sql /mysql/schema.sql
#COPY privileges.sql /mysql/privileges.sql

#设置容器启动时执行的命令
#CMD ["sh", "/mysql/setup.sh"]
  • docker-compose.yml
version: ‘3‘
services:
        nginx:
               image: kbnginx_image #镜像名
               container_name: kbnginx #容器名
               build:
                       context: ./web_nginx #工作路径
                       dockerfile: df_nginx #指定dockerfile文件
               ports:
                - "10010:7799" #暴露端口
               volumes: 
                - ./web:/kb/nginx #磁盘映射,与default.conf中定义的一致,本地/容器内修改文件后,另一方都会同步更新
                - ./web_nginx/conf/default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件
        php:
                image: kbphp_image
                container_name: kbphp
                build:
                        context: ./web_php
                        dockerfile: df_php
                environment:
                        MYSQL_PASSWORD: 123456 #设置好环境变量,在php代码中使用变量名直接引用
                volumes:
                 - ./web:/kb/php
        mysql:
                image: kbsql_image
                container_name: mysql
                build:
                        context: ./mysql
                        dockerfile: df_mysql
                ports:
                 - "3306:3306"
                volumes:
                        - ./mysql/data:/var/lib/mysql
  • default.conf
server {
    listen       7799;#监听端口
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
#        root   /usr/share/nginx/html;
	root /kb/nginx; #与Docker-compose里的路径相同,定义服务器的默认网站根目录位置
        index  index.html index.htm;#定义首页索引文件名称
    }

    #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           /kb/php; #与Docker-compose里的路径相同
        fastcgi_pass   kbphp:9000; #与Docker-compose里的容器名相同
        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;
    #}
}
  • index.php
    第3次系统综合实践
  • index.html
hello world!

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

  • 目录
    第3次系统综合实践
    第3次系统综合实践

  • 运行docker-compose

sudo docker-compose up -d --build
第3次系统综合实践

  • 关闭docker-compose的容器

sudo docker-compose down
第3次系统综合实践

  • 查看容器及镜像
    第3次系统综合实践
    第3次系统综合实践

  • 浏览器查看
    第3次系统综合实践
    第3次系统综合实践
    第3次系统综合实践

服务测试

  • 这里使用PDO连接mysql
    第3次系统综合实践

  • 连接,修改index.php

<?php
$servername = "mysql";//dockercompose里的mysql容器名
$username = "root";
$password = "123456";//密码也可以直接使用dockercompose中的变量名
 
try {
    $conn = new PDO("mysql:host=$servername", $username, $password);
    echo "连接成功"; 
}
catch(PDOException $e)
{
    echo "faild:";
    echo $e->getMessage();
}
?>

第3次系统综合实践

  • 数据库创建
<?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 db_test";

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

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

第3次系统综合实践
第3次系统综合实践

  • 创建表
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="db_test";    

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 使用 sql 创建数据表
    $sql = "CREATE TABLE user (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    firstname VARCHAR(30) NOT NULL,
    lastname VARCHAR(30) NOT NULL,
    email VARCHAR(50),
    reg_date TIMESTAMP
    )";
    // 使用 exec() ,没有结果返回 
    $conn->exec($sql);
    echo "数据表 user 创建成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>

第3次系统综合实践
第3次系统综合实践

  • 插入数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="db_test";    

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 user (firstname, lastname, email) 
    VALUES (‘bao‘, ‘zihan‘, ‘‘)");
    $conn->exec("INSERT INTO user (firstname, lastname) 
    VALUES (‘king‘, ‘bob‘)");

    // 提交事务
    $conn->commit();
    echo "新记录插入成功";
}    
catch(PDOException $e)
{
    // 如果执行失败回滚
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>

第3次系统综合实践
第3次系统综合实践

  • 删除/修改数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="db_test";    

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 user SET lastname=‘kb‘ WHERE lastname=‘bob‘"); 
    $conn->exec("DELETE FROM user where firstname=‘bao‘");

    // 提交事务
    $conn->commit();
    echo "新记录!";
}    
catch(PDOException $e)
{
    // 如果执行失败回滚
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>

第3次系统综合实践
第3次系统综合实践

选做

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

  • docker-compose.yml文件中添加
phpmyadmin:
            image: kbphp_image
            container_name: kbphpmyadmin
            build: 
                context: ./web_phpmyadmin
                dockerfile: df_phpmyadmin
            ports: 
                - "8080:80" # phpmyadmin默认监听80
            environment:
                PMA_HOST: mysql   #指定mysql服务所在的host
  • 新增df_phpmyadmin的Dockerfile
#基础镜像
FROM phpmyadmin/phpmyadmin            
#作者信息
MAINTAINER kingbob
#声明暴露的端口
EXPOSE 8080
  • 运行docker-compose,完成
    第3次系统综合实践

  • 用浏览器访问localhost:8080

  • root登录
    第3次系统综合实践

  • 查看表
    第3次系统综合实践
    第3次系统综合实践

  • 插入
    第3次系统综合实践
    第3次系统综合实践

  • 删除修改只要在这个页面上点编辑和删除即可
    第3次系统综合实践
    第3次系统综合实践

问题

不得不说,这次问题还是有点多的,有些坑踩进去好久才跳出来

  • 一开始就是各种配置文件的问题了,各个参数一定要对应上,像上述的yml文件和default.conf的端口还有目录的对应关系,上面已经提及
    第3次系统综合实践
    第3次系统综合实践

  • 然后就是可以成功运行docker-compose以后死活在浏览器上进入端口看不到结果,从上午整到中午,搜了无数个网页,还是没查出啥问题,然后偶然用docker ps看容器时发现nginx和mysql没有出现在运行容器之列,然后尝试强行把nginx启动也没有办法启动,接着下午又开始尝试各种办法让nginx可以启动,在试了各种方法且检查了各种配置依旧没有结果后,去看了下其他人安装,按照他们的安装目录,我把index.html和index.php这两个文件单独放在一个文件夹下,再次运行,这时候终于。。nginx的容器启动了
    第3次系统综合实践
    第3次系统综合实践

  • 接下来再去浏览器上查阅index.html和index.php的时候死活连接不上,根本没法显示文件里的信息,接着又是一顿操作,第二天,在进行无数次的搜索后,终于在一个论坛上发现了一个人说的一句话“localhost不是在默认端口上要加上自己配置的端口号才能访问编制的文件”,修改了端口号终于能正确访问。
    第3次系统综合实践
    第3次系统综合实践
    第3次系统综合实践
    第3次系统综合实践

  • 还有就是在进行docker-compose down时出现了关闭错误,然后强制关闭容器也没办法关闭,后来看了网上的方法后才得以关闭
    第3次系统综合实践
    第3次系统综合实践

  • 这个问题是docker-compose里的格式问题,编写docker-compose尽量不要用tab键对齐,要不然容易出现这种错误
    第3次系统综合实践

  • 接下来就是在连接数据库的时候出现始终没办法连接上数据库的错误,在无数次检查了自己配置文件还有配置密码都没有问题后,也问了群里的一些同学还是没有结果,耗时将近一天经历无数次崩溃,最后,虚拟机死机了,然后重启虚拟机,再次访问,连接成功了。。它就这样成功了。。
    第3次系统综合实践

小结

这次作业的心路历程真的复杂,很多意想不到的坑,果然人生总要经历大起大落落落落落落落,不过还是学到很多东西,也感谢前面的大佬提供的方法,让我更快从坑里爬起来

相关推荐