应用容器化
应用容器化,不去看网络上通篇八股,笔者个人认为就是将一个应用放到一个能支撑它正常运行的环境中,这个环境可移植,可重复利用。则这个环境就可以理解为容器。
应用容器化的意义在于可以使应用在不同型号,不同内存大小,不同处理器的计算机上完美移植。无需再考虑繁复的环境配置以及应用部署。制作好镜像后,只需要运行一个容器即可,搭配镜像仓库,则只需要登录镜像仓库,即可方便快捷地将自己的应用部署在计算机上。
关于容器化的妙用不再赘述,笔者在此处也不过多叙述容器化的原理。此处引用docker容器技术,docker的妙处无以言表,不过多嘴一句,尽量上虚拟机的docker应用,docker的桌面级应用docker desktop只能说又大又烂,慎用。此处笔者电脑为m1芯片,安装不了centos7,因此使用docker desktop。
应用构建镜像并运行容器
dockerfile文件
#
# Package stage
#
FROM tomcat:8-jre8-alpine
WORKDIR /ssfServerDev
COPY /ssfServerDev /usr/local/tomcat/webapps/ssfServerDev
EXPOSE 8080
CMD ["catalina.sh", "run"]
非maven项目,直接将整个应用包放到容器内的tomcat下的webapps下即可。
而后在同层目录下直接使用docker build命令构建镜像即可
docker build -t ssfserver .
此为构建好的镜像,通过docker启动容器即可:
docker run --name ssfserver1 -p 8071:8080 -d ssfserver
访问0.0.0.0:8071/ssfServerDev/或127.0.0.1:8071/ssfServerDev/或/localhost:8071/ssfServerDev/或192.168.0.107:8071/ssfServerDev/(192.168.0.107亦为本机ip)
这里的首页笔者调过,是为后面nginx做负载均衡方便查看。
nginx做负载均衡
负载均衡在此处的出现,牵扯到另一个业务场景。笔者所在的项目偶有发生这样的情况,某时改的代码未经充分测试,就升级到生产环境,致使生产环境出现短暂不可用的情况,如此一来就会造成生产系统短暂的不可用。
另一方面,我所在的项目尚未遇到,但也迟早会遇见,即随着项目推广的进行,访问量日益增加,单台应用亦或是单台容器已难以为继,但如果部署另外的应用,对用户来说也不友好,这时nginx的作用就体现出来了。
nginx的反向代理和负载均衡,可以使用户先行访问nginx服务器,再按照策略分配到各应用上,这样一来,单台应用的不可用,也不会造成应用大面积不可用。
nginx的安装不做赘述。这里只提及一点,nginx较常见的做法是将配置文件从容器中挂载出来,笔者为保证容器的隔离性,采用现将容器内配置文件复制出来,编辑完成后再复制回容器的做法。具体命令为
#将宿主机文件复制到容器内
docker cp [宿主机文件路径] [CONTAINER ID]:[容器内目标目录路径]
#将容器内文件复制到宿主机
docker cp [CONTAINER ID]:[容器内目标目录路径] [宿主机文件路径]
我的nginx.conf为
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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 ssfServer{
# hash &request_uri;
server 192.168.0.107:8071 weight=6;
server 192.168.0.107:8081 weight=2;
server 192.168.0.107:8091 weight=2;
}
server {
listen 80 ;
server_name 10.88.116.145;
location / {
proxy_pass http://ssfServer;
}
}
}
将配置文件复制到容器内部启动nginx,由于刚启动ssfserver1,因此会直接转发到改tomcat上
另外启动几台容器
docker run --name ssfserver2 -p 8081:8080 -d ssfserver
docker run --name ssfserver3 -p 8091:8080 -d ssfserver
一般来说,一个集群的容器以三台为最佳,因为当其中某一台机子挂掉之后。
2/3的可用性是高于1/2的,至于3/4,则又需要从成本角度考虑。因而这里部署三台。
另外,我刚才在nginx的配置文件中是配置了策略的,大致意思是10次访问server1中6次,server2和server3各中2次,当然还有其他诸多策略,不做赘述。
此处放置五次访问的截图。
访问路径为统一为:http://192.168.0.107/ssfServerDev/
1.
2.
3.
4.
5.
基本符合负载配重。
停掉一台应用
用户无感,仍可正常访问