内容简介:实战docker,构建nginx反向代理tomcat,学习link和docker-compose
上一次我们学习了制作Dockerfile构建定制的tomcat镜像文件,今天我们学习构建一个nginx镜像文件,然后通过docker-compse将nginx和tomcat一起启动,最终达到的效果如下图所示,应用app部署在两个tomcat上,用户访问的是Nginx所在的机器,Nginx会将请求转发到Tomcat001或者Tomcat002上:
Nginx实现负载均衡是通过配置nginx.conf来实现的,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 t01:8080 weight=1;
server t02: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;
}
}
}
可以看到,通过server节点的配置实现了监听80端口,“proxy_pass http://tomcat_client ;“表示对请求的处理交给了tomcat_client,而tomcat_client的具体配置:
upstream tomcat_client {
server t01:8080 weight=1;
server t02:8080 weight=1;
} 即交给了url为t01:8080和t02:8080这两个server,并且每个server处理的权重都是1。(t01:8080和t02:8080究竟是什么?其实这是个别名,和link参数中的别名对应,这个咱们后面用到link的时候再讲)
nginx的配置就这些了,接下来我们看看如何制作nginx的镜像文件,也就是Dockerfile的具体内容:
# First docker file from bolingcavalry # VERSION 0.0.1 # Author: bolingcavalry #基础镜像 FROM nginx:stable #作者 MAINTAINER BolingCavalry <zq2599@gmail.com> #定义工作目录 ENV WORK_PATH /etc/nginx #定义conf文件名 ENV CONF_FILE_NAME nginx.conf #删除原有配置文件 RUN rm $WORK_PATH/$CONF_FILE_NAME #复制新的配置文件 COPY ./$CONF_FILE_NAME $WORK_PATH/ #给 shell 文件赋读权限 RUN chmod a+r $WORK_PATH/$CONF_FILE_NAME
如上所示,Dockerfile文件非常简单,就是把原有系统中的nginx.conf文件删掉,换成我们刚才自己做的文件就行了。
现在我们新建个目录image_nginx,这个目录下只有两个文件,nginx.conf和Dockerfile,如下图:
打开终端,进入此目录,执行命令行:
docker build -t bolingcavalrynginx:0.0.1 .
执行完毕后,再执行docker images,就能看到新的镜像文件了,如下图:
对于tomcat的镜像,请直接使用上一篇文章 《 实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》 中通过Makefile定制的tomcat镜像,这个镜像的好处是:部署完毕后验证负载均衡能力时,可以通过maven插件直接给tomcat容器部署应用包。
ok,现在我们有了nginx和tomcat的镜像,接下来要做的就是run一个nginx容器,再run两个tomcat容器,来实现负载均衡,run这三个容器可以有如下两种方式来实现:
1. 执行三个docker run命令,启动三个容器;
2. 使用docker compose来实现批量启动多个容器;
我们先来试试第一种方式吧:
1. 启动第一个tomcat容器,起名tomcat001,在终端输入:
docker run --name=tomcat001 -p 8081:8080 -e TOMCAT_SERVER_ID=tomcat_server_001 -idt bolingcavalrytomcat:0.0.1
- 启动第二个tomcat容器,起名tomcat002,在终端输入:
docker run --name=tomcat002 -p 8082:8080 -e TOMCAT_SERVER_ID=tomcat_server_002 -idt bolingcavalrytomcat:0.0.1
-
这时候执行docker ps就能看到已经有两个容器启动了,如下图:
两个tomcat容器各自暴露了自己的8080端口,然后分别映射到了当前电脑的8081和8082两个端口,也就是说我们访问localhost:8081以及localhost:8082就能访问到两个容器上的tomcat了,打开浏览器试试,如下图:
- 《 实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》
还记得上一篇文章 《 实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》 中提到的,通过maven部署war包到tomcat上去的方法么?请按照文章中的步骤,从git上下载代码,然后修改pom.xml中的参数,如下图:
将上图红框中的端口改为8081后,在pom.xml所在目录下执行:
mvn clean package -U -Dmaven.test.skip=true tomcat7:redeploy
然后再将端口改为8082再执行同样的命令,这样就能把war包分别部署到两个tomcat容器上了,这时候用浏览器访问 http://localhost:8081/loadbalancedemo/hello 就能看到下图效果:
访问 http://localhost:8082/loadbalancedemo/hello 的效果如下:
- 在终端输入以下命令,启动nginx:
docker run --name=ngx001 --link=tomcat001:t01 --link=tomcat002:t02 -p 80:80 -idt bolingcavalrynginx:0.0.1
这里重点看一下参数–link=tomcat001:t01,–link表示当前命令启动的容器ngx001要和另一个名叫tomcat001的容器建立连接,“tomcat001:t01“中的“t01“表示t01是连接建立后tomcat001的别名,或者可以理解为:ngx001启动后,/etc/host文件中加入了一条记录,ip是tomcat001的ip,name是t01。
我们输入docke exec -it ngx001 /bin/bash登录ngx001,再输入cat /etc/hosts即可看到如下图:
也就是说,在ngx001容器内部,所有访问t01的地方,实际上都访问的是tomcat001对应的ip,搞清楚了这一点,再看看之前配置的nginx的nginx.conf文件:
upstream tomcat_client {
server t01:8080 weight=1;
server t02:8080 weight=1;
}
这里面的t01,t02和link参数中的t01,t02对应,这样nginx在用t01做为域名做请求转发的时候,请求就能到tomcat001和tomcat002上了。
进行到这里,我们已经实现了nginx+tomcat实现负载均衡的效果,但是启动三个容器要执行三次命令似乎挺麻烦,有没有什么批量执行的方法呢?自己写shell,把所有命令都放在里面?呃,这么做也行,但是其他的批量操作呢?比如停止,恢复,构建镜像,查看信息等,所以使用compose是个更好的选择,compose是用于定义和运行复杂 Docker 应用的工具,可以批量的处理多个容器,这里我们仅做一次小小的尝试,不做深入探讨了。
直接上代码了,新建一个docker-compose.yml文件,内容如下:
version: '2'
services:
nginx001:
image: bolingcavalrynginx:0.0.1
links:
- tomcat001:t01
- tomcat002:t02
ports:
- "80:80"
restart: always
tomcat001:
image: bolingcavalrytomcat:0.0.1
ports:
- "8081:8080"
environment:
TOMCAT_SERVER_ID: tomcat_server_001
restart: always
tomcat002:
image: bolingcavalrytomcat:0.0.1
ports:
- "8082:8080"
environment:
TOMCAT_SERVER_ID: tomcat_server_002
restart: always
每个容器都定义成一个节点,节点内有具体的参数键值对,我们之前docker run带上的那些参数都在里面了。
现在可以尝试一下执行docker-compose.yml了,在执行之前请先执行如下的命令,将我们前面启动的三个容器先停止再删除:
docker stop tomcat001 tomcat002 ngx001;docker rm tomcat001 tomcat002 ngx001
然后进入docker-compose.yml文件所在的目录,执行如下命令:
docker-compose up -d
执行完毕后,再执行docker ps查看当前容器信息:
容器已经一次性启动起来了,不过名字似乎变了,被加了前缀,这个前缀的具体内容和当前目录有关,现在浏览器里面输入localhost试试,顺利打开tomcat的欢迎页:
请大家参照之前的方式通过”mvn clean package -U -Dmaven.test.skip=true tomcat7:redeploy”命令将war包分别部署在两个tomcat上,再访问“ http://localhost/loadbalancedemo/hello “来验证nginx是否将请求分发到了不同的tomcat上。
以上就是利用link和docker compose部署server负载均衡的实战了,有一点问题大家可能发现了,就是每次部署war包很麻烦,其实除了这种方式,我们还可以制作tomcat的镜像的时候,在Dockerfile中写命令将war包复制到镜像中去,也可以Docker run的时候通过-v参数挂载当前电脑的实际目录到tomcat的webapps目录上,这两种方法实现起来都很简单,大家有兴趣的话可以试试。
以上所述就是小编给大家介绍的《实战docker,构建nginx反向代理tomcat,学习link和docker-compose》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 《高性能linux服务器构建实战》
- Istio实战系列-Envoy Proxy构建分析
- Java并发编程实战笔记3:基础构建模块
- [译] 项目实战:使用 Go 构建 GraphQL API
- Pytext实战-构建一个文本分类器有多快
- 大牛带你从 0 到 1 构建数据仓库实战
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cyberwar
Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96
The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!