docker-compose是用来将多个容器连接起来,并一次性执行一些命令,如端口转发,数据卷等的构建工具,可以代替docker run时加上的参数 主要配置文件
docker-compose.yml如下:
tomcat1:
build: ./tomcat1
expose:
- 8080
ports:
- "4444:8080"
tomcat2:
build: ./tomcat2
expose:
- 8080
ports:
- "5555:8080"
nginx:
build: ./nginx
# volumes:
# - ./confignginx:/etc/nginx
links:
- tomcat1:tomcat1
- tomcat2:tomcat2
ports:
- "8000:80"
expose:
- 80
tomcat1:tomcat1表示连接tomcat1容器并启别名为tomcat1 别名在后面负载均衡时会用到
tomcat容器的dockerfile放在tomcat1和tomcat2目录下 为了区分方便 我部署了两个不同的war包 但镜像构建是一样的
Dockerfile如下:
ubuntu-tomcat这个是我自己构建的镜像 已完成了jdk tomcat的安装 丢war部署即可 所以下面对应的方法被我注释掉了 自己add自己的jdk 才能保证编译和部署版本完全一致
FROM ubuntu-tomcat
#&& tar -zxvf jdk-8u91-linux-x64.tar.gz
#ADD jdk-8u91-linux-x64.tar.gz /usr/
ADD test.war /usr/apache-tomcat-7.0.77/webapps/
#ENV JAVA_HOME /usr/jdk1.8.0_91
#
#RUN apt-get install -y wget \
# && cd /usr \
# && wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.77/bin/apache-tomcat-7.0.77.tar.gz \
# && tar -zxvf apache-tomcat-7.0.77.tar.gz
#CMD ["/usr/apache-tomcat-7.0.77/bin/catalina.sh","run"]
#用catalina.sh不用startup.sh 刚才entrypoint不知怎么失败了 改成CMD还得把run拆开
#下面这句是开启调试端口 这样就可以在idea里断点调试docker里的java了 我设置的调试端口是9999
#ENV JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=9999,suspend=n,server=y
EXPOSE 8080
Nginx的Dockerfile:
ubuntu-nginx也是我用apt-get安装构建的镜像
FROM ubuntu-nginx
# 容器不是真正虚拟机 不可执行service和systemctl 需要CMD启动
ADD nginx.conf /etc/nginx/nginx.conf
#之前写80:8888 有问题,外部访问不了 改成这样就好了
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
添加了一个Nginx的配置文件到容器里 这样我们就可以在外部管理Nginx配置
nginx.conf如下:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
#worker_connections 768;
worker_connections 3000;
# multi_accept on;
}
http {
##
# Basic Settings
##
#test
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
#test
#隐藏版本信息
server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
#下面这句会加载一个默认的server进来 需要去掉 不然负载均衡会失败
#include /etc/nginx/sites-enabled/*;
upstream tomcats {
server tomcat1:8080 weight=1;
server tomcat2:8080 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://tomcats;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
一开始我总是转发失败 后来发现是include /etc/nginx/sites-enabled/*;引起的 这句会加载一个默认的server进来 需要去掉 不然负载均衡会失败
upstream配置了一个负载均衡 使用刚才我们link时指定的别名
转发到本地的tomcat8080端口里
upstream tomcats {
server tomcat1:8080 weight=1;
server tomcat2:8080 weight=1;
}
/ 表示将所有流量都转发给tomcats
server {
listen 80;
location / {
proxy_pass http://tomcats;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
最后在docker-compose.yml目录下输入命令
sudo docker-compose up --build
即可构建并启动这三个容器的组合
访问本地localhost:8000 刚才转发出来的端口 这是如果是tomcat的页面 而不是nginx的页面说明转发成功了~
然后再访问部署到tomcat里的war包的目录 不断F5刷新 可以看到负载均衡的情况
到这里就基本完成了~
在docker里使用nginx负载均衡到两个tomcat里 并可以看到对应的返回~