• 第四次系统综合实践


    一、使用Docker-compose实现Tomcat+Nginx负载均衡

    反向代理:代理服务器

    应用app部署在两个tomcat上,用户访问的是Nginx所在的机器,Nginx会将请求转发到Tomcat001或者Tomcat002上

    文件创建

    首先在docker-compose文件夹中创建以下文件

    配置文件编写

    在docker-compose.yml文件中编写

    version: "3.3"
    services:
        nginx:
            image: nginx
            container_name: docker-exam4
            ports:
                - 80:2537
            volumes:
                - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
            depends_on:
                - tomcat01
                - tomcat02
                - tomcat03
    
        tomcat01:
            image: tomcat
            container_name: ctc1
            volumes:
                - ./tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    
        tomcat02:
            image: tomcat
            container_name: ctc2
            volumes:
                - ./tomcat2:/usr/local/tomcat/webapps/ROOT
    
        tomcat03:
            image: tomcat
            container_name: ctc3
            volumes:
                - ./tomcat3:/usr/local/tomcat/webapps/ROOT
    

    nginx的default.conf文件编写

    upstream tomcats {
        server ctc1:8080 weight=1;
        server ctc2:8080 weight=1;
        server ctc3:8080 weight=1;
    }
    
    server {
        listen 2537;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats;
        }
    }
    

    index.html

    三个index.html直接编写from tomcat1from tomcat2from tomcat3以便于后续查看

    检验结果

    此处使用的python的repuest包,对http://localhost发送100次请求,可以看到,权重相同的情况下,三个index.html被访问到的次数相当

    改变权重

    对nginx/default.conf进行编写,更改其权重

    并输入docker restart docker-exam4对容器重新运行

    再次检验结果

    可以看到发送100次请求,三个index.html被访问到的次数比值相当于1:10:5

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

    这里用到了老师推荐博客中的web项目

    构建目录

    编辑配置文件

    docker-compose.yml

    version: "3"   #版本
    services:     #服务节点
      tomcat01:     #tomcat 服务,
        image: tomcat    #镜像
        hostname: hostname       #容器的主机名
        container_name: tomcat00   #容器名
        ports:      #端口
         - "5050:8080"
        volumes:  #数据卷
         - "./webapps:/usr/local/tomcat/webapps"
         - ./wait-for-it.sh:/wait-for-it.sh
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.15
      tomcat02:     #tomcat 服务
        image: tomcat    #镜像
        container_name: tomcat01   #容器名
        ports:      #端口
         - "5051:8080"
        volumes:  #数据卷
         - "./webapps:/usr/local/tomcat/webapps"
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.16
      mymysql:  #mymysql服务
        build: .   #通过MySQL的Dockerfile文件构建MySQL
        image: mymysql:test
        container_name: mymysql
        ports:
          - "3309:3306" 
    #红色的外部访问端口不修改的情况下,要把Linux的MySQL服务停掉
    #service mysql stop
    #反之,将3306换成其它的
        command: [
                '--character-set-server=utf8mb4',
                '--collation-server=utf8mb4_unicode_ci'
        ]
        environment:
          MYSQL_ROOT_PASSWORD: "123456"
        networks:
          webnet:
            ipv4_address: 15.22.0.6
      nginx:
          image: nginx
          container_name: "nginx-tomcat"
          ports:
              - 8080:8080
          volumes:
              - ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
          tty: true
          stdin_open: true
          networks:
           webnet:
            ipv4_address: 15.22.0.7
    networks:   #网络设置
     webnet:
       driver: bridge  #网桥模式
       ipam:
         config:
          - 
           subnet: 15.22.0.0/24   #子网
    

    default.conf

    upstream tomcat123 {
        server tomcat00:8080;      
        server tomcat01:8080;
    }
    
    server {
        listen 8080;      
        server_name localhost;
    
        location / {
            proxy_pass http://tomcat123;
        }
    }
    

    Dockerfile

    #  这个是构建MySQL的dockerfile
    
    FROM registry.saas.hand-china.com/tools/mysql:5.7.17
    
    # mysql的工作位置
    
    ENV WORK_PATH /usr/local/
    
    # 定义会被容器自动执行的目录
    
    ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
    
    #复制gropshop.sql到/usr/local 
    COPY grogshop.sql  /usr/local/
    #把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
    COPY docker-entrypoint.sh  $AUTO_RUN_DIR/
    
    #给执行文件增加可执行权限
    RUN chmod a+x $AUTO_RUN_DIR/docker-entrypoint.sh
    
    # 设置容器启动时执行的命令
    
    #CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]
    

    docker-entrypoint.sh

    #!/bin/bash
    mysql -uroot -p123456 << EOF
    source /usr/local/grogshop.sql;
    

    jdbc.properties

    根据路径找到/webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties
    并进行编辑,其中192.168.1.11应改为本机的ip地址,端口号不变

    创建容器

    输入docker-compose up -d --build创建容器

    检验结果

    访问http://主机ip地址:5051/ssmgrogshop_war
    或者访问http://127.0.0.1:5051/ssmgrogshop_war

    对数据库进行增加操作

    对数据库进行修改操作

    对数据库进行删除操作

    三、docker-compose与hadoop的史诗级联动

    拉取ubuntu镜像

    输入docker pull ubuntu来拉取ubuntu镜像

    运行ubuntu容器

    执行指令docker run -it -v ~/:/root/build --name ubuntu ubuntu

    这里的/home/usr/local/hadoop-3.1.3指本地目录,而/root/build指容器目录,-v 表示docker内部的ubuntu系统/root/build目录与本地/home/hadoop/build共享;

    更新系统软件源

    输入apt-get update,对系统软件源进行更新

    安装vim

    vim用以对文本文件进行编辑,输入apt-get install vim进行安装

    安装sshd

    输入apt-get install ssh进行安装

    并且输入vim ~/.bashrc对文件进行编辑,在文件最后一行插入以下内容,以便可以自动启动sshd服务:
    /etc/init.d/ssh start

    配置sshd

    输入ssh-keygen -t rsa获取密钥,运行过程中一直回车即可
    接着输入cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys将密钥导入文件,然后就可以无密码访问本地sshd服务了

    安装JDK

    把hadoop的安装包放在~/目录下,然后执行以下代码安装hadoop:

    cd /usr/lib/
    mkdir ./jvm
    tar -zxvf /root/build/jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm
    

    此处环境变量等安装完hadoop之后再一起配置

    保存镜像文件

    在网站注册账号之后,在终端输入docker login登录,输入docker ps查看容器id,并执行docker commit <容器id> ubuntu/jdkinstalled将其保存成镜像。可以图中可以看到,最后保存成功了

    安装hadoop

    把hadoop的安装包放在~/目录下,然后执行以下代码安装hadoop

    cd /root/build
    tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local
    

    输入vim ~/.bashrc,把以下内容加到文件末尾,以编辑环境变量:

    export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
    export JRE_HOME=$JAVA_HOME/jre
    export HADOOP_HOME=/usr/local/hadoop-3.1.3
    export CLASSPATH=.:$JAVA_HMOE/lib:$JRE_HOME/lib
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin
    

    并输入source ~/.bashrc使~/.bashrc生效

    在目录/usr/local/hadoop-3.1.3/etc/hadoop下,更改hadoop-env.sh文件,在其中新增export JAVA_HOME="/usr/lib/jvm/jdk1.8.0_162"(问题1)

    检验是否安装成功

    分别输入
    java -version

    cd /usr/local/hadoop-3.1.3
    ./bin/hadoop version
    

    检验是否安装成功

    配置文件编写

    以下内容均写在<configuration></configuration>之间

    core-site.xml

    	  <property>
              <name>hadoop.tmp.dir</name>
              <value>file:/usr/local/hadoop-3.1.3/tmp</value>
              <description>Abase for other temporary directories.</description>
          </property>
          <property>
              <name>fs.defaultFS</name>
              <value>hdfs://master:9000</value>
          </property>
    

    hdfs-site.xml

        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:/usr/local/hadoop-3.1.3/namenode_dir</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:/usr/local/hadoop-3.1.3/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.1.3</value>
    	    </property>
    	    <property>
    	        <name>mapreduce.map.env</name>
    	        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3</value>
    	    </property>
    	    <property>
    	        <name>mapreduce.reduce.env</name>
    	        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3</value>
    	    </property>
    	</configuration>
    

    yarn-site.xml

    	  <property>
    	          <name>yarn.nodemanager.aux-services</name>
    	          <value>mapreduce_shuffle</value>
    	      </property>
    	      <property>
    	          <name>yarn.resourcemanager.hostname</name>
    	          <value>master</value>
    	  </property>
    

    保存镜像

    在hadoop配置完成之后,再次保存容器的镜像

    查看三个容器系统的ip

    输入vim /ect/hosts查看本地IP
    172.17.0.3 master
    172.17.0.2 slave01
    172.17.0.4 slave02
    将这三个ip地址写入master的/etc/hosts里

    测试连通

    利用master输入ssh slave01ssh slave02,测试时候可以连接到两台slave机上

    配置workers文件

    hadoop集群配置的最后一步,就是在master目录/usr/local/hadoop-3.1.3/etc/hadoop/中输入vim workers编辑workers文件
    将其中的localhost替换为

    slave01
    slave02
    

    运行hadoop并检查其jps



    运行Hadoop实例程序grep

    在hdfs上创建一个目录

    输入./bin/hdfs dfs -mkdir -p /user/hadoop/input

    复制文件拷贝到hdfs上的目录

    查看是否成功

    执行程序

    输入./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'以执行程序

    查看结果

    参考博客

    实战docker,构建nginx反向代理tomcat,学习link和docker-compose
    2020系统综合实践 第4次实践作业

  • 相关阅读:
    Tomcat:-Djava.net.preferIPv4Stack=true只支持ipv4
    centos解决bash: service: command not found 错误
    centos8重启网络服务
    项目中使用的二维码图片无法展示,查看图片链接报错500
    ERROR: ld.so: object ‘/usr/local/lib/libs.so‘ from /etc/ld.so.preload cannot be preloaded: ignore
    设置好ftp后用xftp连接提示无法打开,无法显示远程文件夹
    Linux 查看登录日志及登录失败用户的ip
    accept4() failed (24: Too many open files)
    [Err] 2006
    webpack loader配置篇
  • 原文地址:https://www.cnblogs.com/J-J-1008/p/12895772.html
Copyright © 2020-2023  润新知