本文將講解在CentOS中使用Docker 去部署兩個Springboot程序,並用Ngix去做負載均衡
1. Docker的安裝
安裝Docker
yum install -y docker
設置開機啟動
systemctl enable docker
啟動Docker
systemctl start docker
2. 制作springboot程序的Docker鏡像
2.1 springboot程序打包
將需要發布的程序通過mvn package打包成一個可執行的jar,並上傳到CentOS上
alipay_demo-0.0.1-SNAPSHOT.jar
2.2 Dockerfile文件
在jar包所在目錄,新建Dockerfile文件,內容如下
1 # 基礎鏡像使用java 2 FROM java:8 3 # VOLUME 指定了臨時文件目錄為/tmp 4 # 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,並鏈接到容器的/tmp 5 VOLUME /tmp 6 # 將jar包添加到容器中並更名為app.jar 7 ADD alipay_demo-0.0.1-SNAPSHOT.jar /app.jar 8 # 運行jar包 9 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
文件結構如下:
2.3 生成鏡像
進入到Dockerfile所在目錄,運行如下命令
docker build -t myapp/springboot .
其中 myapp/springboot 為鏡像的名稱
ps: 注意命令后面有個點,表示當前目錄,也可以寫當前的完整路徑
運行后通過如下命令就可以看到我們生成的鏡像
docker images
3. 啟動springboot的docker容器
我們的springboot程序啟動后的端口為10086,
下面的命令表示啟動2個docker容器,並分別將容器內的10086端口映射到服務器的8080和8088端口
docker run -d -h myapphost -p 8080:10086 --name myapp myapp/springboot docker run -d -h myapphost2 -p 8088:10086 --name myapp2 myapp/springboot -d 表示后台運行 -h 容器的主機名 -p port1:port2 port1服務器的端口 port2 容器內端口 -name 容器名稱 最后一個參數為鏡像名稱
啟動后可以通過如下命令查看到正在運行的容器
docker ps
此時可以通過服務器IP+映射出來的端口訪問我們的程序,說明springboot程序已經啟動成功
http://192.168.0.187:8080/order/goPay
http://192.168.0.187:8080/order/goPay
4. Nginx配置
4.1 拉取Nginx鏡像
docker pull nginx:latest
拉取后可以通過 docker images 查看下載的鏡像
4.2 在本地配置nginx配置
因為docker容器里面的文件會隨着容器的刪除而丟失,所以我們做下配置文件的映射,讓nginx從容器外的服務器上讀取配置文件
在服務器上新建目錄 /home/docker_nginx
在目錄中新建 conf html log 目錄,結構如下:
在config目錄中新建 nginx.conf 文件
nginx.conf 中定義了負載均衡,分別向后台兩個springboot程序轉發,其中myapp和myapp2為應用程序的docker名稱
具體內容如下:
1 user nginx; 2 worker_processes 1; 3 4 error_log /var/log/nginx/error.log warn; 5 pid /var/run/nginx.pid; 6 7 8 events { 9 worker_connections 1024; 10 } 11 12 13 http { 14 include /etc/nginx/mime.types; 15 default_type application/octet-stream; 16 17 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 '$status $body_bytes_sent "$http_referer" ' 19 '"$http_user_agent" "$http_x_forwarded_for"'; 20 21 access_log /var/log/nginx/access.log main; 22 23 sendfile on; 24 #tcp_nopush on; 25 26 keepalive_timeout 65; 27 28 add_header Access-Control-Allow-Origin *; 29 add_header Access-Control-Allow-Headers X-Requested-With; 30 add_header Access-Control-Allow-Methods GET,POST,OPTIONS; 31 32 upstream myapp.com { 33 server myapp:10086; 34 server myapp2:10086; 35 } 36 server { 37 listen 80 default_server; 38 listen [::]:80 default_server; 39 server_name localhost; 40 41 # Load configuration files for the default server block. 42 include /etc/nginx/default.d/*.conf; 43 44 location / { 45 proxy_pass http://myapp.com; 46 index order/goPay; 47 client_max_body_size 10m; } 48 } 49 gzip on; 50 include /etc/nginx/conf.d/*.conf; 51 }
另外兩個目錄中,內容為空即可,后續nginx運行起來后,日志會自動到logs目錄中
4.3 啟動Nginx
docker run --name mynginx --privileged=true --link myapp:myapp --link myapp2:myapp2 -d -p 80:80 -v /home/docker_nginx/html:/usr/share/nginx/html -v /home/docker_nginx/logs:/var/log/nginx -v /home/docker_nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx
--name nginx的名稱
--priviledged 當使用外部配置文件時,必須設置為true,否則會報沒有權限讀取配置文件
--link 連接2個容器,使兩個容器可以通信
-v 目錄映射,將服務器上的目錄映射到docker容器內的目錄
-d 端口映射
啟動后訪問 http://192.168.0.187/order/goPay 可以看到,nginx已經正常啟動,並已經對后台兩個應用實例做了負載均衡
至此,基於docker做springboot程序的負載均衡部署到此結束。
ps:一些常用的docker命令:
查看鏡像 docker images
查看容器 docker ps
停止容器 docker stop myapp
刪除容器 docker rm myapp
重啟容器 docker restart myapp
進入容器 docker exec -it myapp bash
查看日志 docker logs myapp
拉取鏡像 docker pull nginx:latest