[TOC]html
Docker已經上市不少年,不是什麼新鮮事物了,不少企業或者開發同窗之前也很少很多有所接觸,可是有實操經驗的人很少,本系列教程主要偏重實戰,儘可能講乾貨,會根據本人理解去作闡述,具體官方概念能夠查閱官方教程,由於本系列教程對前一章節有必定依賴,建議先學習前面章節內容。java
本系列教程導航: Docker深刻淺出系列 | 容器初體驗 Docker深刻淺出系列 | Image實戰演練 Docker深刻淺出系列 | 單節點多容器網絡通訊 Docker深刻淺出系列 | 容器數據持久化mysql
教程目的:nginx
1.下載mysqlgit
docker pull mysql
2.下載nginxgithub
docker pull nginx
3.克隆credit-facility-service
做爲後面部署演示使用,使用docker
分支spring
git clone https://github.com/EvanLeung08/credit-facility-service.git
4.虛擬機、centos和docker環境安裝請查看第一章,本章默認已經安裝好centos和docker Docker深刻淺出系列 | 容器初體驗sql
168.18.0.0/24
總體架構 最終效果圖
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,後面進行測試須要頻繁用到
爲了方便後面重複使用,這裏會先建立一個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 root@192.168.101.23 root@192.168.101.23's password: Connected to root@192.168.101.23. 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 root@192.168.101.23 root@192.168.101.23's password: Connected to root@192.168.101.23. 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>
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-facility0一、credit-facility0二、credit-facility03,加入credit-facility-net
網絡,而且把ip分別指定爲168.18.0.十、168.18.0.11和168.18.0.12
9.經過docker logs credit-facility01
查看容器啓動日誌
10.經過在本機經過瀏覽器進行測試,能夠看到以下swagger界面
跟前面同樣,我經過容器名稱進行反向代理而不是容器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.執行後查看執行結果,看是否入庫成功 從上面執行結果能夠看出,額度服務已經成功處理請求,而且入庫成功,此時能夠到數據庫去查看下數據庫記錄
有興趣的朋友,歡迎加我公衆號一塊兒交流,有問題能夠留言,平時工做比較忙,我也抽時間儘可能回覆每位朋友的留言,謝謝!