容器技術之Docker數據捲

来源:https://www.cnblogs.com/qiuhom-1874/archive/2020/05/25/12954097.html
-Advertisement-
Play Games

捲為docker提供了獨立於容器的數據管理機制;我們可以把鏡像想象成靜態文件,例如程式,把捲類比成動態內容,比如數據,於是鏡像可以復用,而捲可以共用;捲實現了程式(鏡像)和數據(捲)的分離;實現了容器之間的數據共用和復用,使得容器間傳遞數據變得高效方便;對數據捲內數據的修改會立馬生效,無論是在容器... ...


  前一篇隨筆中我們瞭解了docker的網路相關說明,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12952616.html;今天我們來聊一聊docker的數據管理相關說明;

  在前面的博客中我們有強調過docker的鏡像是分層構建的,把鏡像啟動為容器後,docker會載入只讀層鏡像併在鏡像最頂層添加一個讀寫層;我們還說過該讀寫層不屬於鏡像屬於容器;如果該容器宕掉了,那麼隨之鏡像最頂層的讀寫層也隨之消失;那麼問題來了,如果之前運行的容器,在宕掉前在可寫層生成的數據怎麼保存下來呢?為瞭解決這個問題,我們先來看看docker的COW機制吧;

 

   如上圖所示,docker鏡像是分層構建的,在最下麵一層的數據到第二層或更高層有相同數據時,在上面一層的數據就會覆蓋下麵一層相同的數據;從而使得在上面一層和下麵一層相同的數據只會存在一份,不同的數據都會存在;同樣的道理,docker鏡像通過層層鏡像構建,在docker鏡像最頂層看到的數據就應該是下麵若幹層重疊以後,相同的數據在最上層只會看到一份,而其他數據則是由下麵若幹層不同數據的疊加構成;在運行層容器時,容器內部看到的數據就是所有層鏡像不同數據的集合和相同數據留一份的結果;如果運行過程中容器修改了現有文件,那麼該文件就從讀寫層下麵去複製一份到讀寫層,該文件的原來在只讀層的文件還是存在,只是已經被讀寫層把該文件的副本隱藏了,這就叫docker的寫時複製(cow)機制;

  從上面的信息我們瞭解到docker容器在產生數據是在可寫層,在修改數據時,會把原來的數據從原來只讀層複製到可寫層,從而隱藏原來的只讀層的,但是只讀層的數據還在;所以容器刪除後,我們修改的數據不會保存到鏡像,而是隨容器的刪除而刪除;關閉並重啟容器對於數據不受什麼影響;我們現在有沒有一種辦法讓讀寫層的數據保存起來,即便容器被刪除後數據還依然可存在呢?

  先來說說nfs數據共用吧;nfs共用是通過把一個目錄通過網路的形式掛載到另外一個目錄;從而實現往一個目錄寫數據時,就相當於把數據寫到遠端的目錄的文件中;在docker容器中我們把這種類似的方式叫做捲;所謂捲就是容器上的一個或多個目錄,此類目錄可繞過聯合文件系統,與宿主機上的某目錄產生關聯關係(綁定,類似nfs里的掛載);volume於容器初始化之時就會創建,由base image提供的捲中的數據會在此期間完成複製;volume的初衷是獨立於容器的生命周期實現數據持久化,因此刪除容器時,既不會刪除捲,也不會對那些沒有被引用的捲作垃圾回收操作;

  捲為docker提供了獨立於容器的數據管理機制;我們可以把鏡像想象成靜態文件,例如程式,把捲類比成動態內容,比如數據,於是鏡像可以復用,而捲可以共用;捲實現了程式(鏡像)和數據(捲)的分離;實現了容器之間的數據共用和復用,使得容器間傳遞數據變得高效方便;對數據捲內數據的修改會立馬生效,無論是在容器中修改還是在本地操作;docker有兩種類型的捲,每種類型都在容器中存在一個掛載點,但其在宿主機上的位置有所不同而已;bind mount volume這種捲是由用戶指定目錄把存儲上的一個目錄掛載到容器內部的某個目錄;docekr-managed volume這種捲是docker自己管理的捲,通常表現形式上把宿主機上的/var/lib/docker/vfs/dir/某個捲的ID 掛載到容器內部某個目錄下;

  示例:在的docker容器中使用docker-managed 類型的volume

[root@node1 ~]# docker run --name m2 -it --rm  -v /mydata linux1874/myimg:v0.1 /bin/sh  
/ # ls /
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd /mydata/
/mydata # ls
/mydata # [root@node1 ~]# docker container inspect m2 -f {{.Mounts}}        
[{volume 65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422 /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data /mydata local  true }]
[root@node1 ~]# ll /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data 
total 0
[root@node1 ~]# echo "hello world" > /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data/aa.txt
[root@node1 ~]# cat /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data/aa.txt
hello world
[root@node1 ~]# docker attach m2
/mydata # ls
aa.txt
/mydata # cat aa.txt 
hello world
/mydata # 

  提示:-v只指定了一個目錄表示指定容器內部的目錄,它會通過docker daemon 自動在宿主機上生成掛載目錄;像這種方式的掛載就叫做docker -managed類型的數據捲;從上面的信息可以看到我們可以用docker container inspect -f {{.Mounts}} 容器名稱,來查看容器的捲、標識符以及掛載點主機目錄信息;我們在生成的掛載目錄下創建一個aa.txt的文件,然後在容器里/mydata里能夠看到該文件和文件內容;

  測試:我們把容器停掉看看數據捲是否會被刪除呢?

[root@node1 ~]# cat /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data/aa.txt
hello world
[root@node1 ~]# docker attach m2
/mydata # ls
aa.txt
/mydata # cat aa.txt 
hello world
/mydata # exit
[root@node1 ~]# 
[root@node1 ~]# docker ps 
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
33c6f135eb86        linux1874/myimg:v0.1   "/bin/sh -c '/bin/ht…"   20 minutes ago      Up 20 minutes                           m1
[root@node1 ~]# cat /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data/aa.txt
cat: /var/lib/docker/volumes/65db95bc3010530381e2bcc20fdd216329a502527e17a1e70c1cb7f6e2d2a422/_data/aa.txt: No such file or directory
[root@node1 ~]#

  提示:在運行容器時如果使用了--rm選項,但容器停掉以後,對應掛載點數據捲會隨之刪除;

  測試:運行容器不使用--rm選項,看看容器停掉後,是否還會刪除數據捲?

[root@node1 ~]# docker run --name m2 -v /mydata -it linux1874/myimg:v0.1 /bin/sh
/ # ls /
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd mydata/
/mydata # ls
/mydata # [root@node1 ~]# docker container inspect -f {{.Mounts}} m2
[{volume 28c477840d926c2fc33ebfacd607b84cfd5a272d279e1f966a65b7cb2f1d9a2e /var/lib/docker/volumes/28c477840d926c2fc33ebfacd607b84cfd5a272d279e1f966a65b7cb2f1d9a2e/_data /mydata local  true }]
[root@node1 ~]# cd /var/lib/docker/volumes/28c477840d926c2fc33ebfacd607b84cfd5a272d279e1f966a65b7cb2f1d9a2e/_data
[root@node1 _data]# ls
[root@node1 _data]# echo "hello tom" > aa.txt
[root@node1 _data]# cat aa.txt
hello tom
[root@node1 _data]# docker attach m2
/mydata # ls
aa.txt
/mydata # cat aa.txt 
hello tom
/mydata # exit
[root@node1 _data]#docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS                     PORTS               NAMES
e6560584d41e        linux1874/myimg:v0.1   "/bin/sh"                About a minute ago   Exited (0) 9 seconds ago                       m2
33c6f135eb86        linux1874/myimg:v0.1   "/bin/sh -c '/bin/ht…"   32 minutes ago       Up 32 minutes                                  m1
[root@node1 _data]# docker container rm m2
m2
[root@node1 _data]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
33c6f135eb86        linux1874/myimg:v0.1   "/bin/sh -c '/bin/ht…"   35 minutes ago      Up 35 minutes                           m1
[root@node1 _data]# cd 
[root@node1 ~]# cd -
/var/lib/docker/volumes/28c477840d926c2fc33ebfacd607b84cfd5a272d279e1f966a65b7cb2f1d9a2e/_data
[root@node1 _data]# ls
aa.txt
[root@node1 _data]# cat aa.txt 
hello tom
[root@node1 _data]# 

  提示:在不使用--rm選項運行容器,容器停止後刪除容器,對於數據捲是不會被刪除的;

  示例:在docker容器中使用bind-mount 類型volume

[root@node1 ~]# mkdir /hostdir/v1 -p
[root@node1 ~]# docker run --name m3 -it -v /hostdir/v1/:/mydata linux1874/myimg:v0.1 /bin/sh
/ # ls /
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd /mydata/
/mydata # ls
/mydata # [root@node1 ~]# docker container inspect -f {{.Mounts}} m3
[{bind  /hostdir/v1 /mydata   true rprivate}]
[root@node1 ~]# cd /hostdir/v1/
[root@node1 v1]# ls
[root@node1 v1]# echo "hello jerry" > aa.sh
[root@node1 v1]# cat aa.sh 
hello jerry
[root@node1 v1]# docker attach m3
/mydata # ls
aa.sh
/mydata # cat aa.sh 
hello jerry
/mydata # exit
[root@node1 v1]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS                     PORTS               NAMES
62ddbdc11a62        linux1874/myimg:v0.1   "/bin/sh"                About a minute ago   Exited (0) 4 seconds ago                       m3
33c6f135eb86        linux1874/myimg:v0.1   "/bin/sh -c '/bin/ht…"   41 minutes ago       Up 41 minutes                                  m1
[root@node1 v1]# docker container rm m3
m3
[root@node1 v1]# cd
[root@node1 ~]# cd -
/hostdir/v1
[root@node1 v1]# ls
aa.sh
[root@node1 v1]# cat aa.sh 
hello jerry
[root@node1 v1]# 

  提示:-v指定宿主機目錄:容器目錄表示把宿主機目錄掛載到容器的某個目錄;容器里的目錄可以是不存在的目錄,它會自動創建;這種數據捲我們叫做bind-mount類型的數據捲;通常表現形式就是用戶自己定義把宿主機的那個目錄當作數據捲掛載到容器里的某個目錄;和上面一樣我們在宿主機上的對應目錄下創建文件,在容器對應目錄是可以正常訪問到該文件的;-v可使用多次來指定不同的數據捲掛載關係;通常bind-mount類型的捲用的比較多;

  示例:多個容器的捲使用同一宿主機目錄

[root@node1 ~]# ll /hostdir/v1/aa.sh 
-rw-r--r-- 1 root root 12 May 24 13:59 /hostdir/v1/aa.sh
[root@node1 ~]# cat /hostdir/v1/aa.sh
hello jerry
[root@node1 ~]#  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker run --name m1 -d -v /hostdir/v1/:/var/www/web/html linux1874/myimg:v0.1
9eb3287e4007f0656b1f099aac9504724307679ac41689774059388a96d75cf0
[root@node1 ~]# docker container inspect -f {{.Mounts}} m1
[{bind  /hostdir/v1 /var/www/web/html   true rprivate}]
[root@node1 ~]# docker container inspect -f {{.NetworkSettings.IPAddress}} m1      
172.17.0.2
[root@node1 ~]# curl http://172.17.0.2
<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>
<BODY><H1>404 Not Found</H1>
The requested URL was not found
</BODY></HTML>
[root@node1 ~]# curl http://172.17.0.2/aa.sh
hello jerry
[root@node1 ~]# docker run --name m2 -d -v /hostdir/v1/:/var/www/web/html linux1874/myimg:v0.1
ff877e29d10c55b355b5270218d486894958880058e2eb7bef9bdd1c7c531f0f
[root@node1 ~]# docker container inspect -f {{.Mounts}} m2
[{bind  /hostdir/v1 /var/www/web/html   true rprivate}]
[root@node1 ~]# docker container inspect -f {{.NetworkSettings.IPAddress}} m2
172.17.0.3
[root@node1 ~]# curl http://172.17.0.3
<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>
<BODY><H1>404 Not Found</H1>
The requested URL was not found
</BODY></HTML>
[root@node1 ~]# curl http://172.17.0.3/aa.sh
hello jerry
[root@node1 ~]#

  提示:數據捲掛載到容器會覆蓋容器原有文件;這個同mount掛載沒有本質的不同;從上面信息可以看到aa.sh就把原有的index.html給覆蓋了;除了以上方式指定掛載同一宿主機目錄外,我們還可以使用--volumes-from選項來指定從那個容器里複製數據掛載到本容器;如下

[root@node1 ~]# docker run --name m3 -d --volumes-from m1 linux1874/myimg:v0.1
61a1fbdc9c559a594870dc1e2bbf505a4eb588fc03e5ab50233b55b907beb9b0
[root@node1 ~]# docker container inspect -f {{.Mounts}} m3
[{bind  /hostdir/v1 /var/www/web/html   true rprivate}]
[root@node1 ~]# docker container inspect -f {{.NetworkSettings.IPAddress}} m3 
172.17.0.4
[root@node1 ~]# curl http://172.17.0.4/aa.sh
hello jerry
[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
linux1874/myimg     v0.1                e408b1c6e04f        38 hours ago        1.22MB
busybox             latest              78096d0a5478        10 days ago         1.22MB
centos              7                   b5b4d78bc90c        2 weeks ago         203MB
nginx               stable-alpine       ab94f84cc474        4 weeks ago         21.3MB
[root@node1 ~]# docker run --name c1 -it --volumes-from m1 centos:7 /bin/sh
sh-4.2# ls /
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
sh-4.2# cat /var/www/web/html/aa.sh 
hello jerry
sh-4.2#

  示例:以只讀方式掛載數據捲

[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
linux1874/myimg     v0.1                e408b1c6e04f        38 hours ago        1.22MB
busybox             latest              78096d0a5478        10 days ago         1.22MB
centos              7                   b5b4d78bc90c        2 weeks ago         203MB
nginx               stable-alpine       ab94f84cc474        4 weeks ago         21.3MB
[root@node1 ~]# docker run --name c1 -it -v /hostdir/v1/:/mydata:ro centos:7 /bin/sh
sh-4.2# ls /
anaconda-post.log  dev  home  lib64  mnt     opt   root  sbin  sys  usr
bin                etc  lib   media  mydata  proc  run   srv   tmp  var
sh-4.2# cd mydata/
sh-4.2# ls
aa.sh
sh-4.2# echo "hello tom" > aa.sh 
sh: aa.sh: Read-only file system
sh-4.2# exit
exit
[root@node1 ~]# docker run --name c2 -it -v /hostdir/v1/:/mydata centos:7 /bin/sh
sh-4.2# cd /mydata/
sh-4.2# ls
aa.sh
sh-4.2# echo "hello tom" > aa.sh 
sh-4.2# cat aa.sh 
hello tom
sh-4.2# exit
exit
[root@node1 ~]# 

  提示:我們掛載數據捲不指定許可權預設是rw,以讀寫方式掛載;指定許可權為ro(只讀)掛載數據捲後,在容器內部就不能修改數據捲里的文件內容了;

  示例:利用容器備份另一容器的數據

[root@node1 ~]# ll /hostdir/v1/
total 4
-rw-r--r-- 1 root root 10 May 24 14:42 aa.sh
[root@node1 ~]# echo "hello world" > /hostdir/v1/bb.sh
[root@node1 ~]# echo "hello world,hello tom" > /hostdir/v1/cc.sh  
[root@node1 ~]# ls /hostdir/v1/
aa.sh  bb.sh  cc.sh
[root@node1 ~]# docker run --name m1 -d -v /hostdir/v1/:/var/www/web/html linux1874/myimg:v0.1
5959e832c01f68c24e2542138a95eb7bfeabcb7608b070ef1b536c625ddfd612
[root@node1 ~]# docker run --name c1 --volumes-from m1 -v $(pwd):/backup centos:7 tar cvf /backup/backup.tar.gz /var/www/web/html
tar: Removing leading `/' from member names
/var/www/web/html/
/var/www/web/html/aa.sh
/var/www/web/html/bb.sh
/var/www/web/html/cc.sh
[root@node1 ~]# ls
backup.tar.gz
[root@node1 ~]# tar xf backup.tar.gz 
[root@node1 ~]# ls
backup.tar.gz  var
[root@node1 ~]# cd var/www/web/html/
[root@node1 html]# ls
aa.sh  bb.sh  cc.sh
[root@node1 html]# cat aa.sh bb.sh cc.sh 
hello tom
hello world
hello world,hello tom
[root@node1 html]# 

  提示:解釋下上面利用容器備份另一容器里的數據;首先通過--volumes-from來克隆m1的數據捲,然後在通過-v來指定把當前路徑掛載到容器內部的/backup目錄下,然後通過啟動容器執行tar cvf /backup/backup.tar.gz /var/www/web/html來把容器里的/var/www/web/html的文件打包到/backup/backup.tar.gz(容器內部的目錄);能夠在當前目錄看到打包的文件原因是因為我們把當前路徑掛載到容器里的/backup目錄,所以我們在當前宿主機目錄能夠看到打包好的文件;

  示例:利用容器恢復剛纔打包的數據文件

  首先運行一個容器

[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
5959e832c01f        linux1874/myimg:v0.1   "/bin/sh -c '/bin/ht…"   15 minutes ago      Up 15 minutes                           m1
[root@node1 ~]# docker run --name m2 -it -v /var/www/web/html linux1874/myimg:v0.1 /bin/sh
/ # ls /var/www/web/html/
index.html
/ # [root@node1 ~]#

  然後在來一容器克隆之前容器的數據捲,通過掛載當前目錄為數據捲,在執執行 tar xf命令來解包

[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
6462f22e0d7f        linux1874/myimg:v0.1   "/bin/sh"                2 minutes ago       Up 2 minutes                            m2
5959e832c01f        linux1874/myimg:v0.1   "/bin/sh -c '/bin/ht…"   22 minutes ago      Up 21 minutes                           m1
[root@node1 ~]# docker run --name c2 --volumes-from m2 -v $(pwd):/backup centos:7 tar xf /backup/backup.tar.gz
[root@node1 ~]# docker attach m2
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ls /var/www/web/html/
aa.sh       bb.sh       cc.sh       index.html
/ # cd /var/www/web/html/
/var/www/web/html # cat aa.sh bb.sh cc.sh 
hello tom
hello world
hello world,hello tom
/var/www/web/html # 

  提示:以上命令的思想是運行容器C2 把m2的數據捲掛載先克隆到c2上,然後通過掛載當前宿主機目錄到容器的/backup,然後再執行解包操作即可;這裡還需要註意一點,如果容器的工作目錄不是根目錄或者是其他特殊目錄,解壓命令可以通過-C來指定解壓到那個目錄;


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

-Advertisement-
Play Games
更多相關文章
  • userdel命令 功能說明:刪除用戶 用法:userdel [options] login_name | 選項 | 作用 | | | | | r, remove | 刪除用戶時一併刪除其家目錄,預設是不會刪除的 | 示例1:刪除jerry用戶,並查看其家目錄是否存在。 示例2:刪除tom用戶時連其 ...
  • clear命令 功能說明:用於清屏,只保留一行命令提示符。也可以使用Ctrl+L快捷鍵。 用法:clear 示例:清除當前的屏幕。 ...
  • usermod命令 功能說明:修改用戶屬性 用法:usermod [options] login_name | 選項 | 作用 | | | | | u, uid UID | 修改用戶的ID為此處指定的新UID | | g, gid group_name | 修改用戶所屬的基本組,不過此組得事先存在 ...
  • useradd命令 功能說明:添加用戶或更新預設的新用戶信息 用法:useradd [options] login_name | 選項 | 說明 | | | | | u, uid UID | 添加一個新的用戶時,手動指定UID號,預設是上一個用戶的UID+1,UID使用範圍(CentOS6)500+ ...
  • 作者:—葉丶知秋 鏈接:https://blog.csdn.net/fanxueya1322/article/details/90205143 轉載請保留出處 良許前言: 後臺突然有很多小伙伴留言想看 Linux+Windows 雙系統的安裝,本想自己寫一個,但看了一眼自己那台服役快6年的老古董,想 ...
  • 公有雲技術 公有云云伺服器的申請與使用 華為雲介紹 華為雲立足於互聯網領域,依托於華為公司雄厚的資本和強大的雲計算研發實力,面向互聯網增值服務運營商、大中小型企業、政府、科研院所等廣大企事業用戶提供包括雲主機、雲托管、雲存儲等基礎雲服務、超算、內容分發與加速、視頻托管與發佈、企業IT、雲電腦、雲會議 ...
  • kali linux 中文教程 learn kali 漢化版閑言碎語不要講,曬圖有真相 下載百度網盤 提取碼: 1ie4 ...
  • Heartbeat 項目是 Linux-HA 工程的一個組成部分,它實現了一個高可用集群系統。心跳服務和集群通信是高可用集群的兩個關鍵組件,在 Heartbeat 項目里,由 heartbeat 模塊實現了這兩個功能。本實驗實現web伺服器的主備雙熱備份系統Linux系統:Linux6.8規劃:2台... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...