• Docker深入淺出系列 | 單機Nginx+Springboot實戰

    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網絡,設置靜態子網ip168.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 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> 
    • 此時,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.執行后查看執行結果,看是否入庫成功

    從上面執行結果可以看出,額度服務已經成功處理請求,并且入庫成功,此時可以到數據庫去查看下數據庫記錄


    附錄

    posted @ 2020-03-01 16:14  EvanLeung  閱讀(...)  評論(...編輯  收藏
    贵州快三平台贵州快三主页贵州快三网站贵州快三官网贵州快三娱乐贵州快三开户贵州快三注册贵州快三是真的吗贵州快三登入贵州快三快三贵州快三时时彩贵州快三手机app下载贵州快三开奖 延川县 | 阆中市 | 雷山县 | 谢通门县 | 武宣县 | 安福县 | 新乐市 | 江永县 | 怀安县 | 库车县 | 义乌市 | 马尔康县 | 南乐县 | 扶风县 | 葫芦岛市 | 余干县 | 绿春县 | 托克逊县 | 泗阳县 | 宜黄县 | 江永县 | 乐安县 | 舞钢市 | 盐城市 | 通州市 | 呼和浩特市 | 锡林郭勒盟 | 瑞金市 | 霍州市 | 砚山县 | 黄梅县 | 延寿县 | 黄龙县 | 明水县 | 白玉县 | 阿拉善盟 | 北碚区 | 卢龙县 | 衡南县 | 革吉县 | 方山县 | 惠安县 | 仁寿县 | 西充县 | 乌鲁木齐市 | 陵川县 | 闻喜县 | 安国市 | 台东市 | 都匀市 | 洞口县 | 布拖县 | 綦江县 | 全椒县 | 伊通 | 济宁市 | 当涂县 | 呼图壁县 | 新宁县 | 康保县 | 古丈县 | 桃园市 | 娄底市 | 肃宁县 | 孟州市 | 鲁甸县 | 江城 | 双鸭山市 | 东平县 | 田阳县 | 吉木萨尔县 | 射阳县 | 砀山县 | 邹平县 | 南阳市 | 阜阳市 | 新沂市 | 北京市 | 罗城 | 安岳县 | 咸宁市 | 衢州市 | 博乐市 | 北碚区 | 海盐县 | 图木舒克市 | 册亨县 | 武平县 | 丘北县 | 临西县 | 睢宁县 | 威远县 | 清水河县 | 鹤峰县 | 比如县 | 旺苍县 | 云南省 | 台江县 | 东乡族自治县 | 万全县 | 瓦房店市 | 灌南县 | 高阳县 | 屏东县 | 永昌县 | 安龙县 | 蒙阴县 | 兴和县 | 喜德县 | 武宁县 | 屏边 | 汝城县 | 柏乡县 | 加查县 | 高淳县 | 井研县 | 汉阴县 | 行唐县 | 浠水县 | 独山县 | 吉木乃县 | 龙游县 | 偃师市 | 金堂县 | 六盘水市 | 潞城市 | 满城县 | 太保市 | 革吉县 | 仁怀市 | 京山县 | 开化县 | 武乡县 | 五峰 | 新龙县 | 如东县 | 康乐县 | 延津县 | 唐海县 | 淮阳县 | 肃宁县 | 平顶山市 | 永清县 | 利川市 | 申扎县 | 万荣县 | 德清县 | 新泰市 | 修文县 | 理塘县 | 会理县 | 三亚市 | 天等县 | 五华县 | 平阴县 | 潜江市 | 赣榆县 | 东平县 | 鄂托克旗 | 博野县 | 宾川县 | 云梦县 | 棋牌 | 镇雄县 | 嫩江县 | 都兰县 | 如皋市 | 甘谷县 | 乌拉特前旗 | 攀枝花市 | 泽州县 | 临泉县 | 云浮市 | 阿瓦提县 | 扬中市 | 惠东县 | 大新县 | 澄迈县 | 化隆 | 汉寿县 | 临颍县 | 周口市 | 柘荣县 | 西丰县 | 洪洞县 | 灵台县 | 河源市 | 霍林郭勒市 | 喀喇 | 鹤壁市 | 潜山县 | 谢通门县 | 永定县 | 区。 | 嵊泗县 | 炉霍县 | 石景山区 | 章丘市 | 万州区 | 托克逊县 | 吉林省 | 彭泽县 | 钟祥市 | 延津县 | 三门县 | 拜泉县 | 库尔勒市 |