系统实践第三次作业

第3次实践作业:基于 Docker compose 的多容器协同

计算机3班 041801516 李伟

  相关文件见文末下载地址

  1. Docker-compose的安装

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    • 给文件授权
    sudo chmod +x /usr/local/bin/docker-compose
    
    • 创建软链
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    • 测试安装是否成功
    docker-compose --version
    
    • 文件编写
      创建 compose_lnmp 文件夹,该文件夹结构如下,使用如下命令可查看
    cd compose_lnmp
    tree
    # 如果未安装 tree 工具,需要先使用以下命令安装
    # sudo apt-get install tree
    
    • 各个镜像的 DockerFile

      • dockerfile_nginx
      #基础镜像
      FROM nginx
      #作者
      MAINTAINER Wei Li
      #暴露端口
      EXPOSE 8021
      #可以选择不装 vim
      RUN apt-get update && apt-get install -y vim
      
      • dockerfile_mysql
      #基础镜像
      FROM mysql
      MAINTAINER Wei Li
      ENV MYSQL_ROOT_PASSWORD mysql
      ENV MYSQL_ALLOW_EMPTY_PASSWORD no  #不允许免密登录
      
      • dockerfile_php
      FROM php:7.4-fpm
      MAINTAINER Wei Li
      
      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
      
    • docker-compose.yml

      version: "3"
      services:
      nginx:
          image: nginx_img           #指定镜像名
          container_name: nginx        #指定容器名
          build:
          context: .
          dockerfile: dockerfile_nginx          #指定dockerfile文件
          ports:
          - "2021:8021"                  #修改映射端口
          volumes:
          - ./web/html:/web/html            #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新
          - ./nginx/default.conf:/etc/nginx/conf.d/default.conf         #挂载配置文件
      
      php:
          image: php_img
          container_name: php
          build:
              context: .
              dockerfile: dockerfile_php
          environment:
              MYSQL_PASSWORD: mysql          #root登录密码
          volumes:
              - ./web/php:/web/php
      
      mysql:
          image: sql_img
          container_name: sql
          build:
              context: .
              dockerfile: dockerfile_mysql
          ports:
              - "3306:3306"              #映射端口
          volumes:
              - ./mysql:/var/lib/mysql
      
    • nginx 配置文件

      server {
          listen        8021;
          server_name   localhost;
      
          location / {
              root    /web/html;
              index   index.html index.htm;
              
          }
          
          location ~ \.php$ {
              root            /web/php;  #代码目录
              fastcgi_pass    php:9000;    #一定要修改为自己php容器的名字
              fastcgi_index   index.php;
              fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;   #修改为$document_root
              include         fastcgi_params;
          }
      }
      
    • 使用 Compose 实现多容器运行机制

    docker-compose up -d --build
    
    • 查看当前镜像和容器信息
    • 连接服务结果测试
      • 在 compose_lnmp/web 目录添加check_connect.php 文件:

        <?php
        $servername = "sql";    #注意这里要用自己自定义的Mysql的容器名
        $username = "root";
        $password = "mysql";
        
        try {
            $conn = new PDO("mysql:host=$servername", $username, $password);
            echo "连接成功"; 
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
        ?>
        
      • 在 compose_lnmp/web 目录添加check_sql.php 文件:

        <?php
            $servername = "sql";    #注意这里要用自己自定义的Mysql的容器名
            $username = "root";
            $password = "mysql";
            
            try {
                $conn = new PDO("mysql:host=$servername", $username, $password);
                echo "连接成功"; 
            }
            catch(PDOException $e)
            {
                echo $e->getMessage();
            }
            ?>
        
      • 在 compose_lnmp/web 目录添加check_sql.php 文件:

        <?php
        $servername = "sql";
        $username = "root";
        $password = "mysql";
        
        try {
            $conn = new PDO("mysql:host=$servername", $username, $password);
            
            //设置PDO错误模式异常
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "CREATE DATABASE mydb";
            
            //使用exec(),因为没有结果返回
            $conn->exec($sql);
            echo "数据库创建成功<br>"; 
        }
        catch(PDOException $e)
        {
            echo $sql . "<br>" . $e->getMessage();
        }
        
        $conn = null;
        ?>
        
      • 进入 mysql 容器检查数据库是否成功创建


  1. Tomcat + Nginx 负载均衡

    • 文件编写
      创建 tomcat 文件夹,该文件夹结构如下,使用如下命令可查看

      cd tomcat
      tree
      # 如果未安装 tree 工具,需要先使用以下命令安装
      # sudo apt-get install tree
      # 结构如下
          .
      ├── docker-compose.yml
      ├── nginx
      │   └── default.conf
      ├── tomcat1
      │   └── index.html
      ├── tomcat2
      │   └── index.html
      └── tomcat3
          └── index.html
      
    • 运行

      docker-compose up -d --build
      
    • 查看当前镜像和容器信息
    • python 脚本测试 (也可以用浏览器刷新检验)
      • 轮询策略(默认策略)
        每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

        import requests
        
        url='http://localhost:2022/hello.html'
        for i in range(0,6):
            response=requests.get(url)
            print(response.text)
        
      • weight策略(权重策略)
        指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
        需要修改 default.conf 配置文件:

        upstream tomcats {
                server tct1:8080 weight=1;
                server tct2:8080 weight=2;
                server tct3:8080 weight=3;
        }
        

  1. 实践时间:
    • 估计共 12h ,主要花在处理一些很突然的 bug 和 php 的了解、yml 文件的学习上

  1. 难度
    • 比较困难

  1. 针对本次实践任务中遇到的各类问题和解决办法进行总结(不少于3条)
    • nginx 容器在构建完之后马上关闭,原因在于 nginx 配置文件写错,就是 php 部分那里要改成自己本地 php 容器的名字,这里花了特别多的时间。所以以后 nginx 容器出现闪退的问题,建议优先排查配置文件
    • compose 之后,可以用 docker-compose down 来快速结束服务
    • 注意多个文件的对应端口映射要保证一致,否则连问题出在哪里都不知道
    • 由于容器使用了挂载,所以在本地修改了 web 中的 html 或 php 之后不需要重启服务
    • 有时候可以在脚本中加入输出语句来帮助排错,使用 docker logs containerID 来输出日志

参考资料

【官方文档】Docker Compose
【个人博客相关地址】
【相关文件下载】

posted @ 2021-04-27 22:09  物转星移几度秋  阅读(70)  评论(0编辑  收藏  举报