Docker配置1台Nginx+3台Tomcat做负载均衡
时间:2022-07-22
本文章向大家介绍Docker配置1台Nginx+3台Tomcat做负载均衡,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
环境&结构
1台Nginx最新版本的Docker容器,3台Tomcat8的Docker容器
准备Docker环境
如果不是最新版的Docker的话,如果版本差别太大的话,可能会出问题,所以大家要把Docker升级到最新版,或者直接安装最新版。 可以参考:Centos7-Docker卸载旧的更新到新版本
拉取相应的镜像
准备镜像:
1、tomcat
2、nginx
拉取相应的对象:
[root@zh ~]# docker pull tomcat:jdk8-adoptopenjdk-hotspot
[root@zh ~]# docker pull nginx:latest
[root@zh ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.29 d5cea958d330 40 hours ago 440MB
tomcat jdk8-adoptopenjdk-hotspot ae9ec2a81228 10 days ago 324MB
nginx latest 2073e0bcb60e 2 weeks ago 127MB
[root@zh ~]#
启动容器
启动Tomcat:
[root@zh ~]# docker run -d -p 8081:8080 --name myt1 --privileged=true ae9ec2a81228
[root@zh ~]# docker run -d -p 8082:8080 --name myt2 --privileged=true ae9ec2a81228
[root@zh ~]# docker run -d -p 8083:8080 --name myt3 --privileged=true ae9ec2a81228
正在运行的结果:
[root@zh ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c33dde60b4ac ae9ec2a81228 "catalina.sh run" 7 hours ago Up 7 hours 0.0.0.0:8083->8080/tcp myt3
9397416d13b0 ae9ec2a81228 "catalina.sh run" 7 hours ago Up 7 hours 0.0.0.0:8082->8080/tcp myt2
bf6b880e1398 ae9ec2a81228 "catalina.sh run" 7 hours ago Up 7 hours 0.0.0.0:8081->8080/tcp myt1
[root@zh ~]#
启动Nginx:
在启动之前呢有必要跟大家说一下:
因为后来咱们需要编辑nginx的配置文件,也为了后来咱们好看日志文件,咱们可以做一个配置文件的映射
首先呢,准备文件:
[root@zh ~]# mkdir /data/nginx/
[root@zh ~]# mkdir /data/nginx/conf/
[root@zh ~]# mkdir /data/nginx/logs/
[root@zh ~]# touch /data/nginx/conf/nginx.conf
然后我们先把配置文件nginx.conf配置好:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
"/data/nginx/conf/nginx.conf" 68L, 1836C
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 182.254.161.54;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://pic;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
upstream pic{
server sdgzs.net:8081 weight=5;
server sdgzs.net:8082 weight=5;
server sdgzs.net:8083 weight=5;
}
}
重点是修改:
upstream pic{
server ip:port weight=5;
server ip:port weight=5;
server ip:port weight=5;
}
如果不知道ip的话,可以利用下面的命令查看:
查看所有的ip地址
[root@zh ~]# docker inspect $(docker ps -qa) | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.5",
"IPAddress": "172.17.0.5",
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "",
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "",
You have mail in /var/spool/mail/root
[root@zh ~]# docker inspect $(docker ps -qa) | grep Name
"Name": "/myng3",
"Name": "no",
"Name": "overlay2"
"Name": "/myng1",
"Name": "no",
"Name": "overlay2"
"Name": "/myt3",
"Name": "no",
"Name": "overlay2"
"Name": "/myt2",
"Name": "no",
"Name": "overlay2"
"Name": "/myt1",
"Name": "no",
"Name": "overlay2"
"Name": "/vigilant_lamarr",
"Name": "no",
"Name": "overlay2"
[root@zh ~]#
启动nginx
[root@zh ~]# docker run --name myng3 -d -p 8889:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx -d 2073e0bcb60e
把准备好的war包拷贝到tomcat容器下的webapps目录下:
[root@zh ~]# docker cp ~/test.war myt1:/usr/local/tomcat/webapps/
[root@zh ~]# docker cp ~/test.war myt2:/usr/local/tomcat/webapps/
[root@zh ~]# docker cp ~/test.war myt3:/usr/local/tomcat/webapps/
注意:test.war是我创建的一个javaweb的项目,利用maven然后打包成
测试结果
- finecms如何调用多个指定栏目的内容
- finecms同时调用子栏目和子栏目的文章怎么操作
- 群体智能算法-黏菌寻找食物最优路线行为模拟 2
- thinkcmf安装教程与目录结构详解 快速上手版
- finecms如何批量替换文章中的关键词?
- dedecms批量修改文章为待审核稿件怎么操作
- 群体智能算法-黏菌寻找食物最优路线行为模拟
- finecms设置伪静态后分享到微信不能访问怎么处理
- composer安装其实可以很简单 两行命令就解决了
- 章神的私房菜之数据预处理
- 如何调用finecms指定栏目的描述关键词
- finecms栏目文章页seo设置
- Logistic回归实战篇之预测病马死亡率(一)
- DedeCMS后台500错误一种原因是不支持PHP5.3、5.4及以上版本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyTorch 最佳实践:模型保存和加载
- 突击并发编程JUC系列-启航篇
- 拜托!别再问我多线程的这些问题了
- Tomcat 架构原理解析到架构设计借鉴
- C++核心准则T.65:使用标签分发提供函数的不同实现
- Java开发中Websocket的技术选型参考
- Java 15正式发布,腾讯做出了突出贡献
- Mybatis是如何向Spring注册Mapper的
- 打卡群刷题总结0917——买卖股票的最佳时机
- Fiddler对安卓App抓包(逍遥模拟器APP)
- 为何Android 7.0 以上Charles和Fiddler无法抓取HTTPS包?
- 快速上手百度大脑EasyDL专业版·物体检测模型(附代码)
- 极端情况下收缩 Go 进程的线程数
- C++核心准则T.60:最小化模板对上下文的依赖
- C++核心准则T.61:不要过度参数化成员(SCARY)