docker安裝nginx實(shí)現(xiàn)對springboot項(xiàng)目的負(fù)載均衡的操作方法
前言:
本文采用比較經(jīng)典的方式來集成,如果想了解docker-compse方式的,請移步我的下篇文章。
一、安裝docker
請參考我的這篇文章:Docker之路(一)–安裝Docker
二、安裝nginx
docker pull nginx
這個等同于docker pull nginx:latest,都是拉取最新的鏡像版本。這里我們先不著急啟動nginx,先把準(zhǔn)備好的三個springboot項(xiàng)目準(zhǔn)備好。
三、準(zhǔn)備好我們的springboot項(xiàng)目
這里我用了同一個springboot項(xiàng)目,然后分了三個端口來打包,端口分別是8181,8182,8183,測試接口也是用的默認(rèn)的,現(xiàn)在創(chuàng)建一個最新的springboot項(xiàng)目,會自動生成一個BaseController測試類。這里我們就用它這個默認(rèn)的接口:/hello
@Controller public class BasicController { // http://127.0.0.1:8181/hello?name=lisi @RequestMapping("/hello") @ResponseBody public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) { return "Hello " + name; } }
然后,我們分別將這個接口的返回值改一下,根據(jù)端口一一對應(yīng),這樣后面nginx負(fù)載均衡的時(shí)候,我們就容易判斷是否成功,具體負(fù)載到哪一個端口去了。
- 8181–> return "Hello " + name;
- 8182–> return “Hello 2” + name;
- 8183–> return “Hello 3” + name;
四、將springboot項(xiàng)目分別build成docker鏡像
修改項(xiàng)目為三個不同的端口分別打包,然后上傳的linux,目錄如下:
drwxr-xr-x. 2 root root 54 5月 29 10:36 config -rw-r--r--. 1 root root 133 5月 29 10:36 Dockerfile -rw-r--r--. 1 root root 7172 6月 5 2024 jenkinsTest8182.jar -rw-r--r--. 1 root root 7172 6月 5 2024 jenkinsTest8183.jar -rw-r--r--. 1 root root 7145 5月 7 17:11 jenkinsTest.jar drwxr-xr-x. 2 root root 4096 5月 7 16:49 lib
我這里用的是maven-jar-plugin而不是springboot的maven打包插件,所以目錄會有所不同,springboot的會整體打包,沒有l(wèi)ib和config這個,這里按照你自己需要來就行。如何將jar包build成docker鏡像,參考我這篇文章:Docker之路(二)–用Docker部署一個Web項(xiàng)目。
在本篇文章,我的Dockerfile是這樣寫的:如果你是springboot的打包插件,那么就只需要copy jar包為app.jar就行,不需要copy lib和config這個目錄文件。
FROM openjdk:11 VOLUME /tmp #這一步需要修改jenkinsTest.jar為三個不同的jar包名稱 COPY jenkinsTest.jar app.jar #這里每次build我都會修改config下application.properties里面的端口 COPY config config COPY lib lib ENTRYPOINT ["java","-jar","/app.jar"]
build成功后看看我們的鏡像:
[root@localhost docker-nginx]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 8183demo latest 483ecd3a7fff 49 minutes ago 714MB 8182demo latest c1fe57a09bc0 49 minutes ago 714MB 8181demo latest 3b76435d0f75 31 hours ago 714MB
運(yùn)行這三個項(xiàng)目的鏡像
docker run --name 8181demo -d -p 8181:8181 8181demo docker run --name 8182demo -d -p 8182:8182 8182demo docker run --name 8183demo -d -p 8183:8183 8183demo
然后看看瀏覽器能否訪問
這里是看到是OK了的,然后就可以操作我們的nginx了。
五、配置nginx并且啟動
1.啟動前,需要將nginx的配置掛載一份到宿主機(jī)上,這樣方便我們修改,而不用每次都進(jìn)入容器去修改,因?yàn)槿萜骼锩鎣im這些指令是沒有的。掛載的參數(shù)是-v(簡易版)或者-mount(復(fù)雜版),這兩個參數(shù)都可已實(shí)現(xiàn)掛載,我們后面再討論,這里使用的是-v。
2.-v格式: -v [宿主機(jī)絕對路徑]:[容器路徑],
(1)這里我們在宿主機(jī)新建目錄/home/docker-nginx,然后在將nginx默認(rèn)的配置文件:nginx.conf和default.conf復(fù)制一份到/home/docker-nginx下面(這個目錄最好新建,雖然可以自動生成,但是有時(shí)候會出麻煩,還有這兩個文件,一定不能是空文件,不是你nginx容器啟動不起來)。
(2)從容器中copy文件:docker cp [容器名字或者id]:容器路徑 宿主機(jī)路徑
docker cp mynginx:/etc/nginx/nginx.conf /home/docker-nginx/nginx.conf docker cp mynginx:/etc/nginx/conf.d/default.conf /home/docker-nginx/default.conf
注意,這里容器啟動才能copy,所以要不你先不掛載啟動一個容器copy,要不就去搜一下默認(rèn)的文件是啥(文章后面我會貼出來)。
3.ngnix完整的啟動命令:掛載兩個conf文件和一個log日志目錄,然后映射ngnix端口為:30001
docker run --name mynginx \ -v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /home/docker-nginx/log:/var/log/nginx \ -v /home/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf \ -d -p 30001:80 nginx
4.訪問nginx看是否成功
5.修改nginx配置文件。
這里有兩個文件,一個是nginx.conf和default.conf,這兩者的關(guān)系是:nginx.conf包含了default.conf,這個很關(guān)鍵。
(1)修改nginx.conf:因?yàn)槲覀冇玫氖侨齻€項(xiàng)目的集群,這里我們先將集群配置加到nginx.conf里面,使用upstream標(biāo)簽,后面名字隨便取,我這里是demo1。上面都有注釋
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; #nginx默認(rèn)配置文件,本文本案例只添加了如下配置 upstream demo1 { server 172.16.72.128:8181; server 172.16.72.128:8182; server 172.16.72.128:8183; } #這行就是上面所說的,這兩個文件的包含關(guān)系,在這里引用 include /etc/nginx/conf.d/*.conf; }
(2)修改default.conf,將我們定義的upstream demo1添加進(jìn)location 標(biāo)簽里面去。
server { listen 80; listen [::]:80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { #這行就是我們作的唯一修改 proxy_pass http://demo1; # root /usr/share/nginx/html; # index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
負(fù)載均衡策略:我們什么都沒有配置,用的是nginx默認(rèn)的輪詢策略,關(guān)于這點(diǎn),我們會在后面詳細(xì)講解。
6.重啟nginx容器查看是否實(shí)現(xiàn)了負(fù)載均衡
docker container restart mynginx
瀏覽器訪問同一個URL,看看是否會負(fù)載均衡
這里可以看到,我請求了三次,分別返回了三個結(jié)果,然后再請求又從第一個返回,證明了我們的輪詢策略是成功了的。
六、nginx的負(fù)載均衡策略
以下配置均采用本文的集群案例,介紹三種常用的。
輪詢策略
默認(rèn)的策略,不需要額外配置,本文就使用默認(rèn)的配置。權(quán)重策略
可以為某些服務(wù)器添加權(quán)重,讓該服務(wù)器更多的為用戶提供服務(wù),后面添加weight字段就行。
upstream demo1 { server 172.16.72.128:8181 weight=6; server 172.16.72.128:8182 weight=3; server 172.16.72.128:8183 weight=1; }
IPHASH策略
同一個ip一只訪問同一個服務(wù)器,缺點(diǎn)就是服務(wù)器炸了就沒法分發(fā)請求。
upstream demo1 { ip_hash; server 172.16.72.128:8181 weight=6; server 172.16.72.128:8182 weight=3; server 172.16.72.128:8183 weight=1; }
七、nginx的常用屬性
down屬性,標(biāo)記不可用,這樣就不會像這個服務(wù)器分發(fā)請求。
upstream demo1 { server 172.16.72.128:8181 down; server 172.16.72.128:8182; server 172.16.72.128:8183; }
BACKUP 備用機(jī)設(shè)置,正常情況下該服務(wù)器不會被訪問.當(dāng)主機(jī)全部宕機(jī)或者主機(jī)遇忙時(shí),該服務(wù)器才會訪問.
upstream demo1 { server 172.16.72.128:8181 down; server 172.16.72.128:8182 backup; server 172.16.72.128:8183; }
宕機(jī)服務(wù)器高可用實(shí)現(xiàn)
當(dāng)服務(wù)器宕機(jī)時(shí),如果訪問的失敗達(dá)到最大失敗次數(shù),則自動標(biāo)識為down,在一定的周期之內(nèi),如果服務(wù)器恢復(fù)正常,則還會嘗試訪問故障機(jī)。
max_fails=10 最大的失敗次數(shù)
fail_timeout=60s; 設(shè)定周期為60秒
upstream demo1 { server 172.16.72.128:8181 max_fails=10 fail_timeout=60s; server 172.16.72.128:8182 max_fails=10 fail_timeout=60s; server 172.16.72.128:8183 max_fails=10 fail_timeout=60s; }
八、總結(jié)
以上就是本次文章全部內(nèi)容了,都是比較簡單和基礎(chǔ)的操作,但是一些細(xì)節(jié)沒注意還是容易出現(xiàn)問題,歡迎評論區(qū)討論和錯誤糾正,我們Docker之路第四期見。
到此這篇關(guān)于docker安裝nginx實(shí)現(xiàn)對springboot項(xiàng)目的負(fù)載均衡的文章就介紹到這了,更多相關(guān)springboot項(xiàng)目負(fù)載均衡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker swam集群如何實(shí)現(xiàn)負(fù)載均衡
- Docker安裝Nacos容器并根據(jù)Nginx實(shí)現(xiàn)負(fù)載均衡
- docker搭建nginx實(shí)現(xiàn)負(fù)載均衡的示例代碼
- 基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)
- docker swarm外部驗(yàn)證負(fù)載均衡時(shí)不生效的解決方案
- Docker Nginx容器和Tomcat容器實(shí)現(xiàn)負(fù)載均衡與動靜分離操作
- 使用Docker Compose 實(shí)現(xiàn)nginx負(fù)載均衡的方法步驟
- 詳解Docker Swarm服務(wù)發(fā)現(xiàn)和負(fù)載均衡原理
- 詳解利用nginx和docker實(shí)現(xiàn)一個簡易的負(fù)載均衡
- Docker部署tenine實(shí)現(xiàn)后端應(yīng)用的高可用與負(fù)載均衡(推薦)
相關(guān)文章
Docker for windows pull鏡像文件的安裝位置改變的方法
這篇文章主要介紹了Docker for windows pull鏡像文件的安裝位置改變的方法的相關(guān)資料,需要的朋友可以參考下2016-12-12docker for windonws之Windows 10 家庭中文版安裝cl
這篇文章主要介紹了docker for windonws之Windows 10 家庭中文版安裝clickhouse 22.3版本及配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08Docker部署RocketMQ的實(shí)現(xiàn)示例
本文主要介紹了Docker部署RocketMQ的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10Docker 容器日志查看和清理的實(shí)現(xiàn)步驟
在處理Docker容器的過程中,經(jīng)常需要查看容器的日志輸出來排查問題或者進(jìn)行系統(tǒng)監(jiān)控,本文主要介紹了Docker容器日志查看和清理的實(shí)現(xiàn)步驟,感興趣的可以了解一下2023-11-11docker離線部署docker,部署業(yè)務(wù)方式
這篇文章主要介紹了docker離線部署docker,部署業(yè)務(wù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01