Docker深入淺出系列 | 單機Nginx+Springboot實戰
目錄
- Nginx+Springboot實戰
- 前期準備
- 實戰目標
- 實戰步驟
- 建立Docker網路
- 搭建Mysql容器
- 搭建額度服務叢集
- 搭建Nginx服務
- 驗證額度服務
- 附錄
Nginx+Springboot實戰
Docker已經上市很多年,不是什麼新鮮事物了,很多企業或者開發同學以前也不多不少有所接觸,但是有實操經驗的人不多,本系列教程主要偏重實戰,儘量講乾貨,會根據本人理解去做闡述,具體官方概念可以查閱官方教程,因為本系列教程對前一章節有一定依賴,建議先學習前面章節內容。
本系列教程導航:
Docker深入淺出系列 | 容器初體驗
Docker深入淺出系列 | Image實戰演練
Docker深入淺出系列 | 單節點多容器網路通訊
Docker深入淺出系列 | 容器資料持久化
教程目的:
- 瞭解nginx容器搭建
- 瞭解springboot映象製作與dockerfile配置
- 瞭解docker容器網路配置
- 瞭解容器volume配置
- 瞭解nginx對容器名稱做反向代理
- 瞭解springboot額度服務專案搭建
前期準備
1.下載mysql
docker pull mysql
2.下載nginx
docker pull nginx
3.克隆credit-facility-service
docker
分支
git clone https://github.com/EvanLeung08/credit-facility-service.git
4.虛擬機器、centos和docker環境安裝請檢視第一章,本章預設已經安裝好centos和docker
Docker深入淺出系列 | 容器初體驗
實戰目標
- 建立docker網路,設定靜態子網ip
168.18.0.0/24
- 搭建額度服務叢集
- [額度服務]credit-facility01 - 168.18.0.10
- [額度服務]credit-facility02 - 168.18.0.11
- [額度服務]credit-facility03 - 168.18.0.12
- 搭建Mysql資料庫,並建立額度服務相關表
- [Mysql服務]credit-facility-db - 168.18.0.4
- 搭建Nginx服務,並配置負載均衡規則
- [Nginx服務]credit-facility-nginx - 168.18.0.5
- 利用docker內建DNS伺服器的特點,docker網路內容器之間通過容器名稱進行通訊
- 通過瀏覽器訪問swagger進行業務操作
整體架構
最終效果圖
***
實戰步驟
建立Docker網路
這裡先建立一個屬於這個專案的私有網路,後面對容器分別分配一個靜態子網IP,方便維護
1.通過docker network
建立網路
[root@localhost ~]# docker network create --subnet=168.18.0.0/24 credit-facility-net
fab1ac021f2f0d6acabd1fdfba10959fdd6797a5adc3fb15ebef85da922dc4b9
這裡建立了一個網路,命名為credit-facility-net
,並且指定了一個子網IP網段 168.18.0.0/24
2.檢視宿主機器Centos系統外網IP,用於後面在本機訪問虛擬機器應用使用
[root@localhost credit-facility]# ip add
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
inet 192.168.101.23/24 brd 192.168.101.255 scope global noprefixroute dynamic eth1
valid_lft 76364sec preferred_lft 76364sec
inet6 fe80::a00:27ff:feba:a28/64 scope link
valid_lft forever preferred_lft forever
這裡Centos系統ip是192.168.101.23
,需要記住你的宿主機器ip,後面進行測試需要頻繁用到
搭建Mysql容器
為了方便後面重複使用,這裡會先建立一個volume用於Mysql資料持久化
1.建立docker volume,命名為credit-facility-volume
docker volume create credit-facility-volume
2.建立Mysql容器
[root@localhost ~]# docker run -d --name credit-facility-db -v credit-facility-volume:/var/lib/mysql -p 3301:3306 -e MYSQL_ROOT_PASSWORD=evan123 --net=credit-facility-net --ip 168.18.0.4 mysql
9502bd3d4823cb61559647f60f20a5f7ce153b743701129544f1208b66d59d6a
這裡建立了一個credit-facility-db
容器,把Mysql的資料儲存路徑指定了宿主機credit-facility-volume
目錄,把3306埠對映到宿主機3301埠,把容器網路加入到credit-facility-net
,並且分配一個靜態ip 168.18.0.4
3.進入Mysql容器並建立資料庫例項
[root@localhost /]# docker exec -it credit-facility-db bash
root@9502bd3d4823:/# mysql -uroot -pevan123
mysql> create schema db_credit_facility collate utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use db_credit_facility;
Database changed
mysql> exit
Bye
這裡建立了一個數據庫例項,命名為db_credit_facility
4.建立應用關聯的表
相關表存放在credit-facility-service-infrastructure/resources/db/schema.sql,請按照前期準備指示從github下載credit-facility-service
專案
5.通過docker inspect
檢視下容器資訊
docker inspect credit-facility-db
"Mounts": [
{
"Type": "volume",
"Name": "credit-facility-volume",
"Source": "/var/lib/docker/volumes/credit-facility-volume/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
]
"NetworkSettings": {
"Bridge": "",
"SandboxID": "1ef5e3b28a7cb2c715aca8a122ce2caa50c41b29c53e04006885dd2114f34e8f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"3306/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "3301"
}
],
"33060/tcp": null
},
"SandboxKey": "/var/run/docker/netns/1ef5e3b28a7c",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"credit-facility-net": {
"IPAMConfig": {
"IPv4Address": "168.18.0.4"
},
"Links": null,
"Aliases": [
"9502bd3d4823"
],
"NetworkID": "fab1ac021f2f0d6acabd1fdfba10959fdd6797a5adc3fb15ebef85da922dc4b9",
"EndpointID": "af76ebce29de84dfb2e48d44e3baa8b42923e698714b7774407915b02e55e1b4",
"Gateway": "168.18.0.1",
"IPAddress": "168.18.0.4",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:a8:12:00:04",
"DriverOpts": null
}
}
從上面輸出結果可以看出,容器的儲存路徑已經成功掛載到宿主機目錄/var/lib/docker/volumes/credit-facility-volume/_data
,容器ip也成功設定成168.18.0.4
搭建額度服務叢集
額度服務是一個Springboot專案,其搭建過程跟普通Springboot專案一樣
1.搭建前,請先通過mvn clean -U install
對專案構建一次,確保可以構建成功,注意要切換到專案的docker分支
2.修改資料庫配置application.properties
,預設情況下,大家不需要修改,因為我這裡的資料庫host是通過容器名稱進行訪問,配置檔案路徑存放在start/resources
下
spring.datasource.url = jdbc:mysql://credit-facility-db:3306/db_credit_facility?useUnicode=true&characterEncoding=utf8
如果需要在本地執行,可以把資料庫host修改成<Centos ip>:3301
如:
spring.datasource.url = jdbc:mysql://192.168.101.23:3301/db_credit_facility?useUnicode=true&characterEncoding=utf8
3.在docker宿主機器Centos上建立一個名字為credit-facility
的資料夾
我的資料夾建立路徑如下:
[root@localhost credit-facility]# pwd
/usr/local/credit-facility
4.在credit-facility
的資料夾下建立一個Dockerfile檔案,用於後面額度服務映象建立使用
在credit-facility-sevice
專案裡有一個dockerfile
資料夾,只需要把裡面的Dockerfile
檔案複製到Centos系統credit-facility
的資料夾下即可
FROM openjdk:8-jre-alpine
MAINTAINER evan
LABEL name="credit-facility" version="1.0" author="evan"
COPY start-1.0.0-SNAPSHOT.jar credit-facility-service.jar
CMD ["java","-jar","credit-facility-service.jar"]
在我本機是通過sftp上傳到Centos系統指定目錄下,大家可以用一些工具直接上傳即可
evans-MacBook-Pro:target evan$ sftp [email protected]
[email protected]'s password:
Connected to [email protected].
sftp> put Dockerfile /usr/local/credit-facility
Uploading Dockerfile to /usr/local/credit-facility/Dockerfile
5.對額度服務打成jar包,並且上傳
通過
mvn clean package -Dmaven.test.skip=true
命令對專案進行打包,可以在start/target下找到start-1.0.0-SNAPSHOT.jar
上傳到Centos上的
credit-facility
的資料夾下
同上,我這裡也是通過sftp從本地上傳到伺服器上
evans-MacBook-Pro:target evan$ sftp [email protected]
[email protected]'s password:
Connected to [email protected].
sftp> put start-1.0.0-SNAPSHOT.jar /usr/local/credit-facility
Uploading start-1.0.0-SNAPSHOT.jar to /usr/local/credit-facility/start-1.0.0-SNAPSHOT.jar
start-1.0.0-SNAPSHOT.jar 100% 43MB 168.1MB/s 00:00
sftp>
- 此時,Centos系統上
credit-facility
的資料夾下應該存在兩個檔案
[root@localhost credit-facility]# ls
Dockerfile start-1.0.0-SNAPSHOT.jar
6.基於之前建立的Dockfile建立一個image
[root@localhost credit-facility]# docker build -t credit-facility-image .
7.檢視現有的映象
[root@localhost credit-facility]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
credit-facility-image latest d0536e7c7e78 3 hours ago 130MB
nginx latest a1523e859360 3 days ago 127MB
8.建立3個額度服務容器例項
[root@localhost credit-facility]# docker run -d --name credit-facility01 -p 8081:8080 --net=credit-facility-net --ip 168.18.0.10 credit-facility-image
4ffc98a8c73a4a7afe3737a8ace18d4d053cf8573ab61179963942f3b01104cb
[root@localhost credit-facility]# docker run -d --name credit-facility02 -p 8082:8080 --net=credit-facility-net --ip 168.18.0.11 credit-facility-image
a01e3613ac2a9e995fad644c29a5fd991e762008ff0dc8a3e5b1ab2e86d52924
[root@localhost credit-facility]# docker run -d --name credit-facility03 -p 8083:8080 --net=credit-facility-net --ip 168.18.0.12 credit-facility-image
9dc0ba15542ed29501a0d8540f0f226814e29ffb93c9ab9e06461c01b9f7c049
上面分別建立了3個例項credit-facility01、credit-facility02、credit-facility03,加入credit-facility-net
網路,並且把ip分別指定為168.18.0.10、168.18.0.11和168.18.0.12
9.通過docker logs credit-facility01
檢視容器啟動日誌
10.通過在本機通過瀏覽器進行測試,可以看到如下swagger介面
- http://192.168.101.23:8081/swagger-ui.html
- http://192.168.101.23:8082/swagger-ui.html
- http://192.168.101.23:8083/swagger-ui.html
搭建Nginx服務
跟前面一樣,我通過容器名稱進行反向代理而不是容器ip地址,因為docker對於自定義網路預設開啟內建DNS服務,通過容器名稱進行通訊,可以更加靈活,不需要繫結具體ip
1.在Contos系統credit-facility
的資料夾下,建立一個新資料夾,命名nginx
[root@localhost credit-facility]# mkdir nginx
[root@localhost credit-facility]# ls
Dockerfile nginx start-1.0.0-SNAPSHOT.jar
2.進入nginx資料夾,建立一個nginx.conf
檔案,內容如下
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
location / {
proxy_pass http://balance;
}
}
upstream balance{
server credit-facility01:8080;
server credit-facility02:8080 ;
server credit-facility03:8080;
}
include /etc/nginx/conf.d/*.conf;
}
這裡路由規則配置三個額度服務的容器名稱代替了IP地址
3.建立nginx容器
[root@localhost nginx]# docker run -d --name credit-facility-nginx -p 80:80 -v /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/ningx.conf --network=credit-facility-net --ip 168.18.0.5 nginx
60fc13c1a8d425263d6a90eb34a309ad5e5d3d5517598b8026d7326e9925b9f7
這裡建立了一個名為credit-facility-nginx
的nginx容器,指定了系統對映埠為80,這裡比較重要的是複製/usr/local/credit-facility/nginx/nginx.conf
到/etc/nginx/nginx.conf
,並且分配ip168.18.0.5
4.在瀏覽器驗證nginx服務,輸入192.168.101.23
這時候nginx已經搭建成功了
驗證額度服務
1.在瀏覽器輸入http://192.168.101.23/swagger-ui.html
,可以看到如下介面
2.選用第一個介面測試,輸入如下請求資料
{
"registrationLimitCO": {
"applicationId": "1111",
"userId": 1111,
"quotaLimit": 10000,
"productCode": "tb",
"expirationTime": "2030-01-01",
"accountType": 1
}
}
3.執行後檢視執行結果,看是否入庫成功
從上面執行結果可以看出,額度服務已經成功處理請求,並且入庫成功,此時可以到資料庫去檢視下資料庫記錄
附錄
- 測試專案Github地址:額度服務
- Docker官方文件:Docker教程