zoukankan      html  css  js  c++  java
  • Docker-compose实战之搭建LAMP环境

    Docker-compose的安装

    • 一开始利用命令pip install docker-compose安装docker-compose会发现在之后的build中一直出错
    • 只能先从github上下载完后移到虚拟机中/usr/local/bin的位置,然后利用docker-compose --version查询当前版本号,返回版本号说明安装成功

    Dockerfile编写搭建LAMP(Linux+Apache+MySQL+PHP)环境

    • 以下所有文件放置于/home/ubuntu/docker-compose-lamp目录下

    MySql_dockerfile

    FROM mysql:5.7
    
    #作者信息
    MAINTAINER by Ra9zer
    
    #设置不允许免密登录
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    
    
    
    

    Apach_dockerfile

    FROM httpd
    
    # 作者信息
    MAINTAINER Ra9zer
    
    # 最后暴露2422端口
    EXPOSE 2422
    # Dockerfile中开头为#号的为注释,至此Dockerfile编写完成
    

    php_dockerfile

    FROM php:7.4-fpm
    
    # 作者信息
    MAINTAINER Ra9zer
    
    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 
    

    phpmyadmin_dockerfile

    FROM phpmyadmin/phpmyadmin
    
    # 作者信息
    MAINTAINER Ra9zer
    
    EXPOSE 8080
    

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

    Docker-compose配置文件docker-compose.yml编写

    version: '3.7'
    
    services:
    
      #构建mysql服务
      mysql:
        image: mysql #镜像名
        container_name: LAMP_mysql #容器名
        build: 
          context: .
          dockerfile: MySql_dockerfile
        ports:
          - "3306:3306"  
    
      #构建php服务
      web:
        image: php
        container_name: LAMP_php
        build:
          context: .
          dockerfile: php_dockerfile
        depends_on:   #设置依赖的服务
          - mysql
        volumes:
          - ./web/:/home/ubuntu/docker-compose-lamp/web/ #将主机中的目录挂载到容器中的工作目录
        ports:
          - "8080:80" #映射端口,格式为 "主机端口:容器端口"
    
      #构建phpmyadmin服务
      phpmyadmin:
        image: phpmyadmin
        container_name: LAMP_phpmyadmin
        build:
          context: .
          dockerfile: phpmyadmin_dockerfile
        environment:
          PMA_HOST: LAMP_mysql #设置所连接的MySQL服务器名称
        depends_on:
          - mysql
          - web
        ports:
          - "8081:80"
    

    Index.php文件

    • 该文件放置于/home/ubuntu/docker-compose-lamp/web/目录下
    <html>
        <head>
            <title>phpinfo</title>
        </head>
    
        <body>
            <?php
                echo phpinfo(); #显示php信息
            ?>
        </body>
    </html>
    

    通过Compose运行多容器

    • 所有配置文件编写完后因在同一目录中

    • 在文件目录/home/ubuntu/docker-compose-lamp/下使用命令sudo docker-compose up --build运行多容器成功

    • sudo docker ps查看当前运行中容器,可以看到多容器都已同时上线

    • 访问http://0.0.0.0:8080/可以查看PHP信息来验证容器是否正确运行达到目标效果

      在这里有个坑:就是一开始我的docker-compose.yml里的web的文件目录配置错误./web/:/home/ubuntu/docker-compose-lamp/web/导致访问8080端口的时候会出现404的情况,后面百度查询了一下正确的挂载目录应该是./www/:/var/www/html/

    通过PHP访问MySql

    • 修改index.php文件内容
    <html>
        <head>
            <title>phpinfo</title>
        </head>
    
        <body>
            <?php
    $servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
    $username = "root";
    $password = "123456";     
    
    try {
        $conn = new PDO("mysql:host=$servername", $username, $password);
        echo "数据库连接成功";
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
    }
    ?>
        </body>
    </html>
    

    • 又一个坑:一定要在MySql_dockerfile或者docker-compose.yml中声明ENV MYSQL_ROOT_PASSWORD 123456 #设置root下mysql登录密码 不然修改PHP文件也一辈子连不上数据库 (太难了。。。

    通过PHP新建数据库

    • 修改index.php文件内容
    <html>
        <head>
            <title>phpinfo</title>
        </head>
    
        <body>
            <?php
    $servername = "LAMP_mysql";    #数据库服务器名称为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 myDBPDO";
    
        // 使用 exec() ,因为没有结果返回
        $conn->exec($sql);
    
        echo "数据库创建成功<br>";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
    
    $conn = null;
    ?>
        </body>
    </html>
    

    通过PHP新建数据表

    • 修改index.php文件内容
    <html>
        <head>
            <title>phpinfo</title>
        </head>
    
        <body>
            <?php
    $servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
    $username = "root";
    $password = "123456";     
    
    $dbname = "myDBPDO";
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
        // 使用 sql 创建数据表
        $sql = "CREATE TABLE test (
        `id` bigint(20) NOT NULL,
        `name` varchar(255),
        `score` int
        )";
     
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "数据表 test 创建成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
        </body>
    </html>
    

    通过PHP对表记录的插入修改和删除

    • 修改index.php文件内容
    <html>
        <head>
            <title>phpinfo</title>
        </head>
    
        <body>
            <?php
    $servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
    $username = "root";
    $password = "123456";     
    
    $dbname = "myDBPDO";
     
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // 设置 PDO 错误模式,用于抛出异常
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "INSERT INTO test (`id`, `name`, `score`)
    VALUES
      (2422,'Ra9zer','100');";
        // 使用 exec() ,没有结果返回 
        $conn->exec($sql);
        echo "新记录插入成功";
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
     
    $conn = null;
    ?>
        </body>
    </html>
    

    选做

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

    • phpmyadmin容器配置文件在前文已经给出,同时在docker-compose.yml中已完整配置服务。
    • 直接访问0.0.0.0:8081就可以登入

    小结

    • 实验3花费的时间大概在20个小时左右吧,相对前两个实验的皮毛操作。感觉实验3才算的上真正的入门。一开始看感觉还是挺懵的,不敢下手,到处百度百度的。感觉要编写的文件一大堆,然后compose.yml配置文件内容又很多的样子。到后面摸索摸索着渐渐就感觉其实也并不难,到最后也能都理解清楚。但是这应该才是锻炼(折磨)的开始趴
  • 相关阅读:
    nodejs + mongodb
    实习踩坑
    jQuery获取点击对象的父级
    python正则表达式
    python文件基础IO,OS
    python模块
    python时间和日期
    python number
    python循环
    Vue2.0 【第一季】第6节 v-model指令
  • 原文地址:https://www.cnblogs.com/fzu-Z9h/p/12854295.html
Copyright © 2011-2022 走看看