8天入門docker系列 —— 第四天 使用aspnetcore小案例熟悉埠映射和掛載目錄

来源:https://www.cnblogs.com/huangxincheng/archive/2019/02/20/10405856.html
-Advertisement-
Play Games

到目前為止大家應該對鏡像和容器有了一個大概認知,而且也用了docker進行了一個簡單化的部署,但仔細一看問題還有很多,所以這篇我們繼續完善。 一:如何讓外網訪問到容器內應用 我們知道容器內擁有自己的子網,和你的主機ip不在一個網段內,所以宿主之外的機器是無法訪問的,要實現的話你只能通過nat轉發,在 ...


   到目前為止大家應該對鏡像和容器有了一個大概認知,而且也用了docker進行了一個簡單化的部署,但仔細一看問題還有很多,所以這篇我們繼續完善。

 

一:如何讓外網訪問到容器內應用

        我們知道容器內擁有自己的子網,和你的主機ip不在一個網段內,所以宿主之外的機器是無法訪問的,要實現的話你只能通過nat轉發,在docker上實現起

來很簡單,通過 -p 將容器埠映射到宿主機埠即可。

 

1. 在Dockerfile中,容器會自動監聽8080埠,而且我的程式也是開啟了這個埠號。

FROM microsoft/dotnet:2.2-aspnetcore-runtime
LABEL author [email protected]
RUN mkdir /data
COPY ./ /data
WORKDIR /data
VOLUME /data/log
EXPOSE 8080
CMD [ "dotnet","WebNotebook.dll" ]
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://*:8080")
                .UseStartup<Startup>();
    }

 

2. 接下來通過 -p 埠映射,將宿主機的8080埠和容器的8080埠進行一個映射,前面是宿主機埠,後面是容器的,你也可以寫成 hostip:8080:8080

[root@localhost ~]# docker run -d --name webnotebook -p 8080:8080 huangxincheng520/webnotebook:v4
82cf45e8fb7281fda7d1b22bf6ef1a5156a75f04b4ef29873d44f161b0238cfb
[root@localhost ~]# 
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS              PORTS                    NAMES
82cf45e8fb72        huangxincheng520/webnotebook:v4   "dotnet WebNotebook.…"   3 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   webnotebook

 

3.  然後我就可以在windows上輸入網址訪問了,可以看到一點問題都沒有。

4.  有些人可能會很好奇的去問,這個是怎麼做到的呢? 剛纔也說到了是通過nat進行協議頭ip地址替換進行轉發的,你要是不信的話,可以用centos的

     iptables nat去查看一下。

 

[root@localhost ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
RETURN     all  --  192.168.122.0/24     224.0.0.0/24        
RETURN     all  --  192.168.122.0/24     255.255.255.255     
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24    
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8080

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:8080

 

    可以看到,docker在iptables中實現了一個自己的Docker chain,從 hostIP:8080 -> 172.17.0.2:8080中可以看到,當一個請求到了 192.168.23.149:8080

會自動轉發到 172.17.0.2.8080,有些人可能會問,這個明顯不是一個網段怎麼轉發呢? 那是因為你的宿主機上有一個預設的網橋Docker0,你可以理解成

他就是一個數據鏈路層上的路由器,通過這個路由器,可以將不同的網段進行互聯,你可以用ipconfig查看docker0的ip地址,這個ip地址就相當於路由器ip,

也即是子網地址。

[root@localhost ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:25ff:fe14:8a13  prefixlen 64  scopeid 0x20<link>
        ether 02:42:25:14:8a:13  txqueuelen 0  (Ethernet)
        RX packets 105061  bytes 8399597 (8.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 148379  bytes 425576796 (405.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.23.149  netmask 255.255.255.0  broadcast 192.168.23.255
        inet6 fe80::20c:29ff:fe5c:2e32  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:5c:2e:32  txqueuelen 1000  (Ethernet)
        RX packets 1570930  bytes 2222888854 (2.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 532628  bytes 56478232 (53.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 104  bytes 8816 (8.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 8816 (8.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth871156e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::3c7f:5fff:fe53:4542  prefixlen 64  scopeid 0x20<link>
        ether 3e:7f:5f:53:45:42  txqueuelen 0  (Ethernet)
        RX packets 99  bytes 726984 (709.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 306  bytes 19235 (18.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:83:96:c2  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

二:如何處理容器中的日誌數據

    我們的webnotebook運行的時候總會產生一些日誌,這時候可以把日誌文件夾掛載到宿主機上,方便查看和採集啥的,當然更多的情況是採用集中式

的日誌收集,這個就不是本篇所討論的了,接下來我要做兩件事情,配置nlog日誌框架,然後進行docker目錄掛載。

 

1.  配置nlog框架,在nuget上下載

 

2.  nlog.config 配置如下,{basedir} 就是當前程式的根目錄。

 

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
        <target name="file_info" xsi:type="File"
                        fileName="${basedir}/log/${shortdate}.txt" maxArchiveFiles="30"
                        layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
    </targets>
    <rules>
        <logger name="*" writeTo="file_info" />
    </rules>
</nlog>

 

3.  然後我們的Controller類修改一下,記錄下客戶端的ip地址。

 public class HomeController : Controller
    {
        public static Logger logger = LogManager.GetLogger("SimpleDemo");

        /// <summary>
        /// 讀取mongodb數據數據
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            var log = $"客戶端:{HttpContext.Connection.RemoteIpAddress} 訪問了 Index 頁面!";

            logger.Info(log);

            return View();
        }
    }

 

 4.  接下來你就可以docker build 成鏡像啦,在 docker run 中使用-v參數,將宿主機的 /data/log 掛載到容器的 /data/log目錄,如下命令。

[root@localhost publish]# docker build -t huangxincheng520/webnotebook:v5 -f ./Dockerfile .
[root@localhost publish]# docker run --name webnotebook5 -d -p 8080:8080 -v /data/log:/data/log huangxincheng520/webnotebook:v5
0e03f54d69ccdf3f88511385fd6fd5fdcafb64c0f971cbadb0b93014cb79e375

 

5. 一切都部署好了,接下來你可以訪問8080埠,然後到你的宿主機的/data/log目錄下查看一下,你的日誌就出來啦。

[root@localhost log]# pwd
/data/log
[root@localhost log]# ls
2019-02-20.txt
[root@localhost log]# tail 2019-02-20.txt
2019-02-20 04:13:36.2904 | Info | 客戶端:::ffff:192.168.23.1 訪問了 Index 頁面! 
[root@localhost log]# 

    細心的你應該會發現到,日誌所列印出的時間出了問題,比北京時間少了8個小時,所以你要做的是,把預設的0區時間改成東8區即可,那怎麼修改呢?

 

《1》 在docker run 中加入 -e 參數,也就是加入環境變數 -e TZ=Asia/Shanghai 即可,不要怕參數多,以後這些都是通過CI工具集成的,不要怕哈。

[root@localhost publish]# docker run --name webnotebook5 -d -p 8080:8080 -v /data/log:/data/log -e TZ=Asia/Shanghai  huangxincheng520/webnotebook:v5
18cbd284dbd6f6ff498d849eda7652ec63df3c0113c0cdd53ae4a0030abb52f2

     

       訪問網站之後再看看你的log文件,時區已經調整過來了。

[root@localhost log]# tail 2019-02-20.txt
2019-02-20 04:13:36.2904 | Info | 客戶端:::ffff:192.168.23.1 訪問了 Index 頁面! 
2019-02-20 12:20:38.3752 | Info | 客戶端:::ffff:192.168.23.1 訪問了 Index 頁面!

 

《2》 在dockerfile中增加環境變數占位符。

FROM microsoft/dotnet:2.2-aspnetcore-runtime
ENV TZ Asia/Shanghai

 

好了,本篇就說到這裡,希望對你有幫助。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.net core 使用UEditor.Core 實現 ueditor 上傳功能 首先通過nuget 引用UEditor.Core,作者github:https://github.com/baiyunchen/UEditor.Core/ 在Startup.cs中添加 引入ueditor並配置 ...
  • 一. 支持欄位 EF允許讀取或寫入欄位而不是一個屬性。在使用實體類時,用面向對象的封裝來限制或增強應用程式代碼對數據訪問的語義時,這可能很有用。無法使用數據註釋配置。除了約定,還可以使用Fluent API為屬性配置支持欄位。 1.1 約定 1.2 Fluent API 二. 構造函數 從開始 EF ...
  • 1.對微服務的理解 之前看到在群里的朋友門都在討論微服務,看到他們的討論,我也有了一些自己的理解,所謂微服務就是系統里的每個服務都 可以自由組合。自由組合這個就很厲害了,這樣一來,每個服務與服務之間基本的物理 耦合為0,橫向擴展整個系統就會非常非常靈活。 surging的厲害之處也恰恰是可以做到這些 ...
  • 鏈接:https://pan.baidu.com/s/1SJHKTvQ4av_P9kLrtyYZ6w 提取碼:toya ...
  • 右鍵“工具箱”選擇“選擇項” 彈出對話框 選擇“瀏覽” 選中下載還的dll庫文件。完成後工具箱中會有 treeGridView控制項,如下圖 拖動控制項到windform 中 添加代碼 參考: https://www.cnblogs.com/mrtiny/p/5174095.html ...
  • Openfire簡介    Openfire 是開源的、基於可拓展通訊和表示協議(XMPP)、採用Java編程語言開發的實時協作伺服器。Openfire的效率很高,單台伺服器可支持上萬併發用戶。   Server和Client端的通信都用xml文檔的形式進行通 ...
  • 上一篇文章講了 k8s使用helm打包chart並上傳到騰訊雲TencentHub,今天就講一下使用Helm部署應用並使用configMap代替asp.net core 中的appsettings.json文件。 把Chart上傳到TencentHub之後,我們就可以通過騰訊雲的容器服務,直接部署H ...
  • SqlTableDependency是一個組件用來接收資料庫的通知,包含在數據表上該記錄的值的Inserted、Deleted或者Update操作. 備註:原文提供示例代碼下載,但是js寫的有些問題(沒有更新數據),可以參考下文代碼修改一下,修改後的代碼可以接收插入和更新兩個,對刪除沒有處理。 介紹 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...