2020年系统综合实践 第四次作业 一、使用Docker-compose实现Tomcat+Nginx负载均衡 二、使用Docker-compose部署javaweb运行环境 三、使用Docker搭建大数据集群环境 四、问题&&解决办法&&心得&&时长

(一)项目结构

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(二)配置文件

  • docker-compose.yml
version: "3"
services:
  tomcat1:
    image: tomcat:latest
    volumes:
      - ./tomcat1/:/usr/local/tomcat/webapps/ROOT/
    restart: "always"
    container_name: tomcat1
  tomcat2:
    image: tomcat:latest
    volumes:
      - ./tomcat2/:/usr/local/tomcat/webapps/ROOT/
    container_name: tomcat2
    restart: "always"
  tomcat3:
    image: tomcat:latest
    volumes:    
      - ./tomcat3/:/usr/local/tomcat/webapps/ROOT/
    container_name: tomcat3
    restart: "always"
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    links:
      - tomcat1:t1
      - tomcat2:t2
      - tomcat3:t3
  • nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream tomcat_client {
         server tomcat1:8080 weight=1;
         server tomcat2:8080 weight=1;
	 server tomcat3:8080 weight=1;
    } 

    server {
        server_name "";
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        location / {
            proxy_pass http://tomcat_client;
            proxy_redirect default;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

(三)负载均衡测试

  • 轮询策略
    • 修改nginx.conf文件中的upstream
      2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    • 测试结果(依次访问每一个Tomcat服务器)
      2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
  • 权重策略
    • 修改nginx.conf文件中的upstream
      2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    • 测试结果(权重大的服务器被访问的次数大于权重小的服务器)
      2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

二、使用Docker-compose部署javaweb运行环境

(一)文件结构

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(二)配置文件

  • docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx:latest
    container_name: isNginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
    depends_on:
      - tomcat1
      - tomcat2
      - tomcat3
  tomcat1:
    image: tomcat:latest
    container_name: tomcat1
    depends_on:
      - mysql
    restart: always
    volumes:
      - ./webapp:/usr/local/tomcat/webapps # 挂载web目录
      - ./tomcat1/:/usr/local/tomcat/webapps/ROOT/
  tomcat2:
    image: tomcat:latest
    container_name: tomcat2
    depends_on:
      - mysql
    restart: always
    volumes:
      - ./webapp:/usr/local/tomcat/webapps # 挂载web目录
      - ./tomcat2/:/usr/local/tomcat/webapps/ROOT/
  tomcat3:
    image: tomcat:latest
    container_name: tomcat3
    depends_on:
      - mysql
    restart: always
    volumes:
      - ./webapp:/usr/local/tomcat/webapps # 挂载web目录
      - ./tomcat3/:/usr/local/tomcat/webapps/ROOT/
  mysql:
    build: ./mysql
    container_name: ismysql
    ports:
          - "3306:3306"
    restart: always
  • MySQL_Dockerfile
FROM mysql:latest
#作者信息
MAINTAINER ISLAND
#环境变量配置
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD 123456
COPY schema.sql /mysql/schema.sql
  • schema.sql
-- 创建数据库,数据库名为“test"
create database `school` default character set utf8 collate utf8_general_ci;
-- 切换到上一步所建的数据库中
use school;
-- 如果存在school表,则删除
DROP TABLE IF EXISTS `student`;
-- 建表
CREATE TABLE `student`(
	`id` varchar(9) NOT NULL,
	`name` varchar(20) NOT NULL,
	`age` varchar(20) NOT NULL,
	PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream tomcat_client {
         server tomcat1:8080 weight=1;
         server tomcat2:8080 weight=2;
	 server tomcat3:8080 weight=3;
    } 

    server {
        server_name "";
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        location / {
            proxy_pass http://tomcat_client;
            proxy_redirect default;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

(三)JavaWeb程序

  • JavaWeb项目结构
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    使用JSP写了简单的对数据库的增删改查的交互,然后将WAR包放在Tomcat的webapps目录下。
    在实际操作中,需要自己查看mysql容器里的IP地址,并且将IP地址写在JDBC连接语句中。或者自己手动将mysql容器的IP地址改成下列的:172.18.0.2
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(四)对数据库操作测试

  • 运行docker-compose,打开浏览器,输入:localhost:80/myWeb
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
  • 增加数据
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
  • 查询数据
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
  • 修改数据
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
  • 删除数据
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长
    2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(四)负载均衡测试(权重策略)

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

三、使用Docker搭建大数据集群环境

(一)环境准备

  • Hadoop版本:hadoop-3.2.1
  • Ubuntu版本:ubuntu:20.04
  • JDK版本:JDK8

(二)Ubuntu容器初始化

  • 本次实验使用阿里源
    • Dockerfile
FROM ubuntu
COPY sources.list /etc/apt/sources.list
  • 创建镜像
    docker build -t ubuntu .
  • 运行容器
    docker run -it -v /home/island/build:/root/build --name ubuntu ubuntu
  • 更新软件源
    apt-get update
  • 安装Vim和ssh
apt-get install vim
apt-get install ssh   
  • 开启ssh服务
    /etc/init.d/ssh start
  • 将自动开启ssh写入~/.bashrc
vim ~/.bashrc

末尾添加:/etc/init.d/ssh start

  • 配置免密登入
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
  • 安装JDK
apt install openjdk-8-jdk
  • 配置环境变量
    打开~./bashrc,加入以下两行
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
  • 保存配置好JDK的镜像
docker commit 容器ID ubuntu/jdk

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(三)安装Hadoop

  • 运行容器
docker run -it -v /home/island/build:/root/build --name ubuntu-jdkinstalled ubuntu/jdk
  • 解压下载好的Hadoop
cd /root/build
tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
  • 查看是否安装
cd /usr/hadoop-3.2.1
./bin/hadoop version

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(四)配置Hadoop集群

  • 配置adoop_env.sh文件
#当前目录为/usr/local/hadoop-3.2.1/etc/hadoop
vim hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # 在任意位置添加
  • 在以下四个文件中增加配置
    • core-site.xml
<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/usr/local/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
  </property>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
  </property>
</configuration>
  • hdfs-site.xml
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/namenode_dir</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/datanode_dir</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
  • mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
    </property>
</configuration>
  • yarn-site.xml
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
</configuration>
  • 修改启动和结束脚本(如果没修改,启动hadoop时会出现用户错误)
    • 进入目录:/usr/local/hadoop-3.2.1/sbin
    • start-dfs.sh和stop-dfs.sh文件加入下列内容
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
  • tart-yarn.sh和stop-yarn.sh加入下列内容
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
  • 保存镜像
docker commit 容器ID ubuntu/hadoopinstalled

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

(五)启动Hadoop并且测试实例

  • 启动三个节点(一个master节点,两个slave节点)
# 第一个终端
docker run -it -h master --name master ubuntu/hadoopinstalled
# 第二个终端
docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled
# 第三个终端
docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled
  • 配置master,slave01和slave02的地址信息
vim /etc/hosts

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

  • 在master节点上配置需要寻找的节点
vim /usr/local/hadoop-3.2.1/etc/hadoop/workers #将localhost改为 slave01、slave02
  • 启动集群,以下操作均在hadoop安装目录下
cd /usr/local/hadoop
bin/hdfs namenode -format  #第一次启动需要先格式化
sbin/start-all.sh

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

  • 在分布式文件系统中建立input文件,并将配置文件上传
bin/hdfs dfs -mkdir -p /user/root/input
bin/hdfs dfs -put etc/hadoop/*.xml input # 将xml复制到input下,作为示例程序输入
  • 运行实例
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

  • 查看结果
bin/hdfs dfs -cat output/*

2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
二、使用Docker-compose部署javaweb运行环境
三、使用Docker搭建大数据集群环境
四、问题&&解决办法&&心得&&时长

四、问题&&解决办法&&心得&&时长

问题&&解决办法

  • 容器中安装软件速度过慢
    换源,不过要找到和你ubuntu版本相对应的源,要不然一直会有依赖不满足。
  • docker-compose启动MySQL,MySQL会一直无法进入容器
    先别把脚本放进去,直接构造一个简单的容器,然后在进入这个容器里去创建数据库等等。

心得

这次感觉比前几次实验更加困难了,尤其是在部署JaveWeb,需要更多的时间才能完成。

时长

阅读资料:4h
动手实践:10h
博客编写:2h
合计:16h