1)使用Docker-compose实现Tomcat+Nginx负载均衡
a.理解nginx反向代理原理;
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!nginx扮演了反向代理服务器的角色.
b.nginx代理tomcat集群,代理2个以上tomcat;
upstream Tomcatweb{
server ruinTom1:8080 max_fails=3 fail_timeout=60s; #允许失败三次,失败60s后再来
server ruinTom2:8080 max_fails=3 fail_timeout=60s;
server ruinTom3:8080 max_fails=3 fail_timeout=60s;
}
server {
listen 2506;
server_name localhost;
location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
proxy_pass http://Tomcatweb; #访问nginx,实在访问代理服务器,
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
docker-compose.yml:
`version: "3.1"`
`services:`
`nginx:`
`image: nginx`
`container_name: ng1`
`ports:`
`\- 80:2508`
`volumes:`
`\- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件`
`depends_on:`
`\- tomcat01`
`\- tomcat02`
`\- tomcat03`
`tomcat01:`
`image: tomcat`
`container_name: tt1`
`volumes:`
`\- ./tomcat/tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录`
`tomcat02:`
`image: tomcat`
`container_name: tt2`
`volumes:`
`\- ./tomcat/tomcat2:/usr/local/tomcat/webapps/ROOT`
`tomcat03:`
`image: tomcat`
`container_name: tt3`
`volumes:`
`\- ./tomcat/tomcat3:/usr/local/tomcat/webapps/ROOT`
c.了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;
2) 使用Docker-compose部署javaweb运行环境
要求:
a.分别构建tomcat、数据库等镜像服务;
b.成功部署Javaweb程序,包含简单的数据库操作;
- 编写配置文件:
- default.conf
server ruintomcat:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://tomweb;
}
}
- docker-compose.yml
services:
tomcat:
image: tomcat
hostname: hostname
container_name: ruintomcat
ports:
- "5050:8080"
volumes:
- "$PWD/webapps:/usr/local/tomcat/webapps"
networks:
webnet:
ipv4_address: 15.22.0.15
mymysql:
build: .
image: mymysql:test
container_name: mymysql
ports:
- "3306:3306"
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
environment:
MYSQL_ROOT_PASSWORD: "123456"
networks:
webnet:
ipv4_address: 15.22.0.6
networks:
webnet:
driver: bridge
ipam:
config:
- subnet: 15.22.0.0/24
gateway: 15.22.0.2
- docker-entrypoint.sh
mysql -uroot -p123456 << EOF
source /usr/local/grogshop.sql;
-
在 /webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties 修改ip和端口,并且用指令docker-compose up启动容器。
c.为上述环境添加nginx反向代理服务,实现负载均衡。
- 修改nginx配置文件
upstream tomcats {
server tomcat00:5050;
server tomcat00:5051;
server tomcat00:5052;
}
- 修改yml文件
tomcat01:
image: tomcat
hostname: hostname
container_name: tomcat01
ports:
- "5051:8080" #后面访问网页的时候要选择对应的端口号5050
volumes: #数据卷
- "./webapps:/usr/local/tomcat/webapps"
- ./wait-for-it.sh:/wait-for-it.sh
networks: #网络设置静态IP
webnet:
ipv4_address: 15.22.0.16
tomcat02:
image: tomcat
hostname: hostname
container_name: tomcat02
ports:
- "5052:8080" #后面访问网页的时候要选择对应的端口号5050
volumes: #数据卷
- "./webapps:/usr/local/tomcat/webapps"
- ./wait-for-it.sh:/wait-for-it.sh
networks: #网络设置静态IP
webnet:
ipv4_address: 15.22.0.17
nginx:
depends_on:
- tomcat00
- tomcat01
- tomcat02
3)使用Docker搭建大数据集群环境
直接用机器搭建Hadoop集群,会因为不同机器配置等的差异,遇到各种各样的问题;也可以尝试用多个虚拟机搭建,但是这样对计算机的性能要求比较高,通常无法负载足够的节点数;使用Docker搭建Hadoop集群,将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。
要求:
a.完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave);
b.成功运行hadoop 自带的测试实例。
-
1.拉取ubuntu镜像
创建目录,用于向Docker内部的Ubuntu系统传输文件
docker pull ubuntu
cd ~
mkdir build
sudo docker run -it -v /home/ubuntu/build:/root/build --name ubuntu ubuntu
创建并运行容器
- 2.更新软件源以及安装vim 和安装sshd
```cpp
apt-get update
apt-get install vim
apt-get install ssh
/etc/init.d/ssh start
vim ~/.bashrc
添加 /etc/init.d/ssh start
添加vim后,换源
Dockerfile
FROM ubuntu
COPY ./sources.list /etc/apt/sources.list
sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
- 3.配置sshd
cd ~/.ssh
ssh-keygen -t rsa #一直按回车
cat id_rsa.pub >> authorized_keys
安装JDK
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
ssh localhost #测试免密登录
vim ~/.bashrc
#在文件末尾添加以下两行,配置Java环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc #使.bashrc生效
java -version #验证java
- 4.保存镜像文件
docker ps
docker commit 容器id hadoop_ubuntu:jdk8
cd /usr/local/hadoop-3.1.3/etc/hadoop
vim hadoop-env.sh #把下面一行代码加入文件
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
修改/usr/local/hadoop/etc/hadoop下的文件
core-site.xml:
hadoop.tmp.dir
file:/usr/local/hadoop-3.1.3/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://master:9000
hdfs-site.xml
dfs.replication
1
dfs.namenode.name.dir
file:/usr/local/hadoop-3.1.3/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop-3.1.3/tmp/dfs/data
dfs.permissions.enabled
false
mapred-site.xml:
mapreduce.framework.name
yarn
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3
mapreduce.map.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3
mapreduce.reduce.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3
yarn-site.xml:
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
Master
yarn.nodemanager.vmem-pmem-ratio
2.5
映射得到镜像
sudo docker commit 容器id ubuntu/hadoop
修改文件:
进入脚本文件存放目录:cd /usr/local/hadoop-3.1.3/sbin
为start-dfs.sh和stop-dfs.sh添加以下参数:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
为start-yarn.sh和stop-yarn.sh添加以下参数:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
- 5.运行Hadoop集群
保存镜像
sudo docker commit 850572f6a724 ubuntu/hadoopinstal
从三个终端分别开启三个容器运行ubuntu/hadoop镜像
# 第一个终端
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
三个终端分别打开/etc/hosts,根据各自ip修改
172.17.0.5 master
172.17.0.6 slave01
172.17.0.7 slave02
在master节点测试ssh
ssh slave01
ssh slave02
exit 退出
master上的worker文件内容修改为
slave01
slave02
- 6.测试Hadoop集群
cd /usr/local/hadoop-3.1.3
bin/hdfs namenode -format # 格式化文件系统
sbin/start-dfs.sh # 开启NameNode和DataNode服务
sbin/start-yarn.sh # 开启ResourceManager和NodeManager服务
jps # 查看服务状态
4)总结
救命,终于要和这次实验说再见了,每一次这门课的实验做得都呕心沥血,心力交瘁,几乎每三步出一次错,总是在崩溃边缘疯狂试探。
在拿到实验的刚开始很迷茫,后来看了同学的博客,了解了大致思路,然后按着思路,学习实验要用到的理论知识,,,通过做实验学习到了很多新知识,了解到反向代理原理、javaweb的简单部署、hadoop等。
学习知识花了2小时左右,做实验花了10小时左右吧,博客2小时。