8天入門docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互聯和docker-compose一鍵部署

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

這一篇繼續完善webnotebook,如果你讀過上一篇的內容,你應該知道怎麼去掛載webnotebook日誌和容器的遠程訪問,但是這些還遠不夠,webnotebook 總要和一些資料庫打交道吧,比如說mysql,mongodb,redis,通常情況下這些存儲設備要麼是以容器的方式承載,要麼是由DBA ...


 

  這一篇繼續完善webnotebook,如果你讀過上一篇的內容,你應該知道怎麼去掛載webnotebook日誌和容器的遠程訪問,但是這些還遠不夠,webnotebook

總要和一些資料庫打交道吧,比如說mysql,mongodb,redis,通常情況下這些存儲設備要麼是以容器的方式承載,要麼是由DBA在非容器環境下統一管理。

 

一:webnotebook連接容器redis

       我們做一個小案例,把網站的所有PV記錄到redis中,webnotebook前端顯示當前你是 xxx 位用戶,案例不重要,重要的是怎麼去實現容器互聯。

 

      在docker hub 上去找redis的官方鏡像,具體redis該如何合理配置這裡我就不管了,用最簡單的一條docker run 跑起來再說。

[root@localhost data]# docker run --name some-redis -d redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
6ae821421a7d: Pull complete 
e3717477b42d: Pull complete 
8e70bf6cc2e6: Pull complete 
0f84ab76ce60: Pull complete 
0903bdecada2: Pull complete 
492876061fbd: Pull complete 
Digest: sha256:dd5b84ce536dffdcab79024f4df5485d010affa09e6c399b215e199a0dca38c4
Status: Downloaded newer image for redis:latest
ed07890700a5cdb7d737a196c28009a9d1b08de35f55d51f53c80e6cfe6ba199
[root@localhost data]# 
[root@localhost data]# 
[root@localhost data]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
ed07890700a5        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp            some-redis

    

    接下來安裝 StackExchange.Redis,在Index這個Action中將當前的訪問作為一個PV記錄到redis中,不過下麵的代碼要註意一點的就是,為了去訪問redis,

這裡我採用了redis.webnotebook.com 去映射到redis容器的ip,映射關係可以在創建容器的時候自動追加到 /etc/hosts 中,每一次訪問都執行一次Increment自

增操作。

   public class HomeController : Controller
    {
        public static Logger logger = LogManager.GetLogger("SimpleDemo");
        public static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("redis.webnotebook.com:6379");

        /// <summary>
        /// 讀取mongodb數據數據
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            var db = redis.GetDatabase();

            var num = db.StringIncrement("count");

            ViewData["num"] = num;

            return View();
        }
    }

   

     在UI上,展示下你當前是多少位訪客,就是這樣。

<div class="text-center">
    <h1 class="display-4">您是當前 @ViewData["num"]  位訪客</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

     

     然後你就可以docker build,完了之後docker run時通過 --link  some-redis:redis.webnotebook.com  去指定一下就好了,some-redis是redis容器的名字,

redis.webnotebook.com 是這個some-redis別名,這樣就方便的實現了 redis.webnotebook.com和容器ip的映射關係。

[root@localhost publish]# docker run -d --name webnotebook -p 8080:8080 --link some-redis:redis.webnotebook.com huangxincheng/webnotebook:v1
b931e040de26c4bfc0b49cbc8e626cdcb30ad9bdff523f623c0a2d6c50899a81
[root@localhost publish]# 
[root@localhost publish]# 
[root@localhost publish]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
b931e040de26        huangxincheng/webnotebook:v1   "dotnet WebNotebook.…"   2 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   webnotebook
ed07890700a5        redis                          "docker-entrypoint.s…"   27 minutes ago      Up 27 minutes       6379/tcp                 some-redis

       有些人可能就好奇了,到底webnotebook容器內的/etc/hosts真的修改了嗎? 接下來你可以通過 docker exec 到webnotebook容器去看一下就好啦,

從下麵標紅的地方可以看到,172.17.0.2 已經和 xxx.com 做了映射。

[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@b931e040de26:/data# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    redis.webnotebook.com ed07890700a5 some-redis
172.17.0.3    b931e040de26
root@b931e040de26:/data# 

 

     回到文章開頭的問題,如果redis是在遠程宿主機上部署的,那我的webnotebook容器該怎麼訪問呢?你可能會說,直接通過ip訪問即可,但是為了保持

統一性,我還是希望通過redis.webnotebook.com 這個功能變數名稱進行訪問,也就是說怎麼去把這個映射關係追加到容器中呢?可以使用-- add-host來實現。

[root@localhost publish]#  docker run -d --name webnotebook -p 8080:8080 --add-host redis.webnotebook.com:172.17.0.2 huangxincheng/webnotebook:v1
91e7d9c1b575cc34ae98eebfc437d081b852f450104e2b368f898299852b0f18
[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@91e7d9c1b575:/data# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    redis.webnotebook.com
172.17.0.3    91e7d9c1b575
root@91e7d9c1b575:/data# 

   

二:docker-compose 容器編排

      目前我們僅引入了redis,這樣有了兩個容器,但隨著業務的增加,你可能還需要mysql,ssdb,rabbitmq,nginx等服務,而docker建議的就是一個容器

一個進程,那為了能順利承載這些服務,你可能需要部署6個容器,如果你還是按照老一套的方法一個一個的去部署,操作起來就比較亂,有沒有一種方式可

以讓docker自動幫我們一鍵部署好這些容器呢? 就好像dockerfile那樣自動化部署,當然有了,那就是docker-compose 容器編排。

 

1. 安裝

    官網地址:https://docs.docker.com/compose/install/#install-compose  然後按照步驟一步一步來就好了,最後通過docker-compose --version 看一下即可。

[root@localhost publish]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@localhost publish]# sudo chmod +x /usr/local/bin/docker-compose
[root@localhost publish]# docker-compose --version
docker-compose version 1.22.0, build f46880fe
[root@localhost publish]#

 

2. 編寫docker-compose 

    docker-compose的所有命令都在 https://docs.docker.com/compose/compose-file/  上面找得到,如果有興趣可以查看一下。

version: '3.0'
services:
  webnotebook:
    container_name: webnotebook
    build: 
      context: .
      dockerfile: ./Dockerfile
    depends_on:
      - redis
    links:
      - "redis:redis.webnotebook.com"
    ports:
      - "8080:8080"
  redis:
   container_name: some-redis
   image: redis

 

   上面的配置看起來不難吧,如果不知道參數的意思,還是那句話,查看官方文檔, 最後你可以使用 docker-compose up --build 跑起來,或者使用 -d 參數

進行後臺運行。

[root@localhost publish]# docker-compose up --build
Building webnotebook
Step 1/9 : FROM microsoft/dotnet:2.2-aspnetcore-runtime
 ---> dad26d192ae6
Step 2/9 : ENV TZ Asia/Shanghai
 ---> Using cache
 ---> 72535a350c5d
Step 3/9 : LABEL author [email protected]
 ---> Using cache
 ---> d4dcb4ba06aa
Step 4/9 : RUN mkdir /data
 ---> Using cache
 ---> 6bbfc1537e42
Step 5/9 : COPY ./ /data
 ---> Using cache
 ---> 5401b74ec21f
Step 6/9 : WORKDIR /data
 ---> Using cache
 ---> d93e7949b527
Step 7/9 : VOLUME /data/log
 ---> Using cache
 ---> 39c4285c6d6c
Step 8/9 : EXPOSE 8080
 ---> Using cache
 ---> d02932ddfbcc
Step 9/9 : CMD [ "dotnet","WebNotebook.dll" ]
 ---> Using cache
 ---> 0572ceea51a1
Successfully built 0572ceea51a1
Successfully tagged publish_webnotebook:latest
Starting some-redis ... done
Starting webnotebook ... done
Attaching to some-redis, webnotebook
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
some-redis     | 1:M 22 Feb 2019 09:11:03.161 * Running mode=standalone, port=6379.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # Server initialized
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 * Ready to accept connections
webnotebook    | : Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
webnotebook    |       User profile is available. Using '/root/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
webnotebook    | Hosting environment: Production
webnotebook    | Content root path: /data
webnotebook    | Now listening on: http://[::]:8080
webnotebook    | Application started. Press Ctrl+C to shut down.

非常簡單吧,只要我有一個docker-comose文件就可以實現一鍵部署,好了,希望本篇對你有幫助。

 


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

-Advertisement-
Play Games
更多相關文章
  • 快速排序可能沒你想的那麼簡單!如何選擇基準?如何快速分區?如何減少數據交換次數?如何使用非遞歸方法? ...
  • MAC homebrew自2018/3/31之後棄用homebrew/php 詳細:https://brew.sh/2018/01/19/homebrew-1.5.0/ 所以不能再用下麵的方法安裝xdebug了,下麵的方法不行!下麵的方法不行!下麵的方法不行! 所以,安裝xdebug我們可以手動編譯 ...
  • package 向家康; import java.util.concurrent.ThreadLocalRandom; public class 練習21 { public static void main(String[] args) { // 隨機一個0--1之間的小數 double n=Mat ...
  • 原創文章,轉載請標註出處: "《Java基礎系列 二進位操作》" 概述 Java源碼中涉及到大量的二進位操作,非常的複雜,但非常的快速。 Java二進位表示法 首先瞭解下二進位,二進位是相對十進位而言的,當然還有八進位,十六進位等等,我們常用的都是十進位,電腦用的都是二進位,而符號表示常用十六進位 ...
  • 1. 查看Nginx的配置文件 命令 nginx -t ,如圖 2. 進入配置文件目錄 並查看目錄 cd /usr/loxa/nginx/conf , 可以看見有一個 nginx.conf文件 一個vhost 目錄 3. 我們先編輯 nginx.conf, 主要的這個 service 這是另一個配置 ...
  • 實常式序的界面效果如下圖所示: 在表單中的搜索條件有姓名,學號,成績。他們在一行中按照水平三等分排列。 在cshtml中用html實現上述表單效果的的代碼如下: 1 <form class="form-horizontal" role="form"> 2 <div class="row"> 3 <d ...
  • 寫程式的過程應該是一種藝術創作過程,我們寫出來的程式體現了我們的技術水平和個人修養, 也就是說作為程式員,自己寫的程式就是自己的臉面。讓自己有臉有面的第一步就是要遵循程 序編碼規範,這裡總結一些程式編寫規範。 1. 命名規範 表達清晰是命名規範的核心,常見的命名分格有: 1.1 Pascal風格 包 ...
  • //載入配置文件 var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, relo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...