第三次实践作业

一.完成Docker-compose的安装

  • 下载Docker Compose的当前稳定版本

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/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

二.Dockerfile编写

要求:

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

1.前期工作

建立docker_compose文件夹;在docker_compose文件夹里分别建立web文件夹作为nginx,php的工作目录和挂载容器卷的目录,建立mysql_data作为mysql挂载容器卷的目录,建好的文件目录如下:

2.编写dockerfile

  • dockerfile_nginx

    #基础镜像
    FROM nginx
    #作者信息
    MAINTAINER weng<669765291@qq.com>
    #声明暴露的端口
    EXPOSE 2020
    
  • dockerfile_mysql

    #基础镜像
    FROM mysql
    #作者信息
    MAINTAINER weng<669765291@qq.com>
    #设置root密码
    ENV MYSQL_ROOT_PASSWORD 123456
    #设置不可免密登录
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    
  • dockerfile_php

    #基础镜像
    FROM php:7.4-fpm
    #作者信息
    MAINTAINER weng<669765291@qq.com>
    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

    hahahahaha!!!
    
  • index.php

    <?php phpinfo();?>
    

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

1.修改配置文件

将配置文件default.conf从运行的nginx容器中复制到本机

  • 首先运行一个nginx容器 docker run -it nginx /bin/bash

  • 查看正在运行的容器 docker ps -a

  • 复制配置文件 docker cp 4da6c0756043:/etc/nginx/conf.d/default.conf .

  • 可以在当前目录下看到default.conf这个文件

修改配置文件

  • default.conf

    修改server部分

    server {
        listen       2020;        #修改映射端口
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /web/html;     #修改工作目录
            index  index.html index.htm;
        }
    

    修改配置文件中PHP部分,注意将其原先每行前的注释符号“#”去掉

    location ~ \.php$ {
            root           /web/php;          #修改工作目录
            fastcgi_pass   myphp:9000;        #修改为容器名
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;    # 修改为$document_root
            include        fastcgi_params;
        }
    

2.编写dockerfile-compose.yml文件

version: "3"
services:
 nginx:
    image: mynginx_image                #指定镜像名
    container_name: mynginx             #指定容器名
    build:
      context: .
      dockerfile: dockerfile_nginx      #指定dockerfile文件
    ports:
      - "80:2020"                       #修改端口映射
    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            #设置好环境变量,在php代码中使用变量名直接引用
    volumes:
      - ./web:/web/php                  #挂载工作目录到本机web目录

 mysql:
   image: mysql_image 
   container_name: mysql
   build:
      context: .
      dockerfile: dockerfile_mysql
   ports:
     - "3306:3306"
   volumes:
     - ./mysql_data:/var/lib/mysql       #挂载容器卷,实现数据同步,防止数据丢失

 phpmyadmin:
    image: myphpmyadmin_image
    container_name: myphpmyadmin
    build: 
      context: .
      dockerfile: dockerfile_phpmyadmin
    ports: 
      - "8080:80" # phpmyadmin默认监听80
    environment:
      PMA_HOST: mysql                     #指定mysql服务所在的host

3.执行与检验

(1)查看docker_compose文件夹的树状结构

(2)执行docker-compose文件

docker-compose up -d --build

(3)查看镜像和容器

docker images
docker ps -a

(4)访问localhost/index.html(或者localhost:80)和localhost/index.php

四.服务测试

1.检测PHP是否能够成功连接Mysql数据库,参考菜鸟教程

修改宿主机~/docker_compose/web目录下的index.php文件

<?php
$servername = "mysql";    #注意这里要用自己自定义的Mysql的容器名
$username = "root";
$password = "123456";     #密码也可以直接使用yml中的变量名
 
try {
    $conn = new PDO("mysql:host=$servername", $username, $password);
    echo "连接成功"; 
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

访问localhost/index.php

2.在index.php文件中创建数据库,参考菜鸟教程

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
 
try {
    $conn = new PDO("mysql:host=$servername", $username, $password);
    echo "连接成功"; 

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "CREATE DATABASE myDBPDO";

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

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

进入mysql容器,利用root身份进入数据库,查询数据库可以发现已经创建了 myDBPDO数据库

sudo docker exec -it  mysql /bin/bash
mysql -u root -p
show databases;

3.在myDBPDO数据库中创建Student表,参考菜鸟教程

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO";        #变量设置
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);    #选择数据库
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 使用 sql 创建数据表
    $sql = "CREATE TABLE Student (
    id INT(9) UNSIGNED PRIMARY KEY, 
    name VARCHAR(30) NOT NULL
    )";
    // 使用 exec() ,没有结果返回 
    $conn->exec($sql);
    echo "数据表 Student 创建成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

访问localhost/index.php

在mysql容器中,选中myDBPDO数据库,先后两次查看table

use myDBPDO
show tables;

4.向表中插入数据,参考菜鸟教程

<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO";
 
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 Student (id,name) 
    VALUES (031702336, 'Lin TongXue')");
    $conn->exec("INSERT INTO Student (id,name) 
    VALUES (031702340, 'zhang Tongxue')");
    $conn->exec("INSERT INTO Student (id,name) 
    VALUES (031702341, 'Huang Tongxue')");
 
    // 提交事务
    $conn->commit();
    echo "新记录插入成功";
}
catch(PDOException $e)
{
    // 如果执行失败回滚
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

去数据库中查询

select * from Student

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

1.访问localhost:8080/index.php;端口号跟yml文件中映射一致

2.在这里可以看到所有的Database,选择myDBPDO数据库

3.选择Student表,进入后可以看到表里的数据

六.问题与总结

在参考了几个很早就做完的大神的博客下,实验过程很顺利。在此要特别提一下这位大神:“Monster--”,博客确实写的很好,我就是照着他的一步步做下来的,基本没出现什么问题,通用性很强。

  • 遇到的一个问题是在执行docker-compose文件时,输入docker-compose up -d --build ,结果在执行过程中遇到如下错误:

    一开始不知道错在哪,后来在仔细查看了报错信息后,发现是容器名已经被使用了。在dockers-compose文件中修改了容器名后再次执行就可以了。

  • 花费的时间:大概做了六七个小时吧。昨天晚上做了两三个小时后卡住了,就直接跑去睡觉,睡到三点半醒了,洗漱一下,做到七点就做完了。早上的好处就是注意力比较集中,精神好。

posted @ 2020-05-08 06:54  Boketto  阅读(188)  评论(0编辑  收藏  举报