004.Docker鏡像管理

来源:https://www.cnblogs.com/itzgr/archive/2018/12/28/10188487.html
-Advertisement-
Play Games

一 鏡像基本操作 鏡像是一個包含程式運行必要依賴環境和代碼的只讀文件,其本質是磁碟上一系列文件的集合。它採用分層的文件系統,將每一次改變以讀寫層的形式增加到原來的只讀文件上。鏡像是容器運行的基石。 1.1 搜索鏡像 docker命令必須具備root許可權,普通用戶可是用那個sudo。 提示:docke ...


一 鏡像基本操作

鏡像是一個包含程式運行必要依賴環境和代碼的只讀文件,其本質是磁碟上一系列文件的集合。它採用分層的文件系統,將每一次改變以讀寫層的形式增加到原來的只讀文件上。鏡像是容器運行的基石。

1.1 搜索鏡像

  1 root@docker:~# docker search centos				#查詢centos共用鏡像
01 docker命令必須具備root許可權,普通用戶可是用那個sudo。 提示:docker預設的Docker Hub 網址為: https://hub.docker.com/,速度很慢,建議添加國內的阿裡雲加速器,參考004-4.1。 選項說明: NAME:鏡像倉庫源的名稱 DESCRIPTION:鏡像的描述 OFFICIAL:是否docker官方發佈 AUTOMATED:是否使用了自動構建

1.2 下載(拉取)鏡像

  1 root@docker:~# docker pull centos:7				#使用pull下載鏡像
02 提示: Registry:倉庫,Registry包含一個或多個Repository Repository:系列,Repository包含一個或多個Image Tag and Image:Image用GUID表示,有一個或多個Tag與之關聯,版本號。

1.3 列出(查看)本地鏡像

  1 root@docker:~# docker images 	<特定標簽>			#查看本地下載的鏡像
03 選項說明:
  • REPOSTITORY:表示鏡像的倉庫源,有以下類型:
    • [namespace/centos]:由命名空間和實際的倉庫名稱組成。
    • [centos]:只有倉庫名。屬於頂級命名空間,只用於官方鏡像。
    • [dl.dockerpool.com:5000\centos:7]:指定URL路徑的方式。
  • TAG:鏡像的標簽
    • 未指定鏡像tag時,預設為latest,但latest沒有任何特殊含義,人為的將latest作為最新穩定版本的別名;
    • 一個repository可以有多個tag,而多個tag也可能對應同一個鏡像。
  • IMAGE ID:鏡像ID
  • CREATED:鏡像創建時間
  • SIZE:鏡像大小

1.4 推送鏡像

  1 root@docker:~# docker push registry.cn-hangzhou.aliyuncs.com/xhy-study-01/xhy-images-01:centos-7-xhy
04 提示:推送鏡像之前必須配置好倉庫信息。建議推送至個人私有倉庫,同時採用國內阿裡雲私有倉庫,配置方法見《附001-docker阿裡雲Registry配置》。

1.5 導出鏡像

  1 root@docker:~# docker save -o centos-7.tar centos:7

1.6 導入鏡像

  1 root@docker:~# docker load -i centos-7.tar

1.7 刪除鏡像

  1 root@docker:/study# docker rmi httpd

1.8 設置鏡像標簽

  1 root@docker:~# docker tag 6de222aa7640 xhy/centos7:v3
  2 root@docker:~# docker images
05

二 docker文件系統

2.1 Linux文件系統簡介

linux文件系統由bootfs和rootfs組成,bootfs主要包含bootloader和kernel,bootloader主要是引導載入kernel,當kernel被載入到記憶體之後bootfs就被卸載掉了。rootfs包含的就是典型linux系統中/dev,/proc,/bin,/etc等標準目錄。

2.2 docker文件系統

Docker容器是建立在Aufs基礎上的,Aufs支持將不同的目錄掛載到同一個虛擬文件系統下,並實現一種layer的概念。Aufs將掛載到同一虛擬文件系統下的多個目錄分別設置成read-only,read-write以及whiteout-able許可權。 read-only目錄只能讀,而寫操作只能在read-write目錄中實現。 寫操作是在read-only之上的一種增量操作,不影響read-only目錄。 docker 鏡像中每一層文件系統都是read-only。 提示:當掛載目錄的時候要嚴格按照各目錄之間的這種增量關係,將被增量操作的目錄優先於在它基礎上增量操作的目錄掛載,待所有目錄掛載結束了,繼續掛載一個read-write目錄,如此便形成了一種層次結構。

2.3 docker鏡像原理

在構建鏡像時,從一個最基本的操作系統開始,每個構建的操作都相當於做一層修改,增加了一層文件系統,一層層往上疊加,上層的修改會覆蓋底層該位置的可見性。當使用時,只會看到一個完全的整體,總共有多少層以及每層所做的修改都是透明的。 06 docker image 中最基礎的兩層結構: 07 不同的 linux 發行版(如 ubuntu 和 CentOS ) 在 rootfs 這一層會有所區別,體現發行版本的差異性: 08 傳統的 Linux 載入 bootfs 時會將 rootfs 設為 read-only,然後在系統自檢後將 rootfs 從 read-only改為 read-write,然後可在 rootfs 上進行讀寫操作。 Docker相比在 bootfs 自檢完畢之後不會將 rootfs 的 read-only 改為 read-write,而是利用 union mount(UnionFS 的一種掛載機制)將 image 中其他的 layer 載入到之前的 read-only 的 rootfs 層之上,每一層 layer 都是 rootfs 的結構,並且是read-only 的。因此,無法修改一個已有鏡像裡面的 layer層數據,只有當創建一個容器,即將 Docker 鏡像進行實例化後,系統會分配一層空的 read-write 的 rootfs ,用於提供數據修改。

三 鏡像結構

3.1 image結構

09 docker image的layer組織方式通常由 json、layer.tar、VERSION組成。
  1 root@docker:/study# tar -xf centos-7.tar
10
  1 root@docker:/study# tree
11
  1 root@docker:/study# cat repositories
  2 {"centos":{"7":"d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064"}}
解釋:repositories 文件,裡面是一個 JSON 定義,保存了三個信息:鏡像名字、tag、tag 對應的 layer。
  1 root@docker:/study# cat d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064/json | jq .
12 解釋:主要關於鏡像的配置信息,簡要部分信息如上。
  1 root@docker:/study# tar -tf d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064/layer.tar
13 解釋:包括一個類 Linux 文件目錄的結構,保存著這個 layer 所做的修改。

四 Dockerfile、Docker鏡像和Docker容器

4.1 關係

Dockerfile 是軟體的原材料,Docker 鏡像是軟體的交付品,而 Docker 容器則可以認為是軟體的運行態。從應用軟體的角度來看,Dockerfile、Docker 鏡像與 Docker 容器分別代表軟體的三個不同階段,Dockerfile 面向開發,Docker 鏡像成為交付標準,Docker 容器則涉及部署與運維。 14 Dockerfile構建出Docker鏡像,通過Docker鏡像運行Docker容器。 15 參考鏈接:http://dockone.io/article/783 https://blog.csdn.net/xuguokun1986/article/details/79295947

五 docker存儲驅動

Docker最開始採用AUFS作為文件系統,也得益於AUFS分層的概念,實現了多個Container可以共用同一個image。但由於AUFS未併入Linux內核,且只支持Ubuntu,考慮到相容性問題,在Docker 0.7版本中引入了存儲驅動, 目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五種存儲驅動。

5.1 底層技術

  • 寫時複製(CoW)
所有驅動都需要用到寫時複製(CoW),CoW就是copy-on-write,表示只在需要寫時才去複製,這個是針對已有文件的修改場景。比如基於一個image啟動多個Container,如果為每個Container都去分配一個image一樣的文件系統,那麼將會占用大量的磁碟空間。而CoW技術可以讓所有的容器共用image的文件系統,所有數據都從image中讀取,只有當要對文件進行寫操作時,才從image里把要寫的文件複製到自己的文件系統進行修改。 所以無論有多少個容器共用同一個image,所做的寫操作都是對從image中複製到自己的文件系統中的複本上進行,並不會修改image的源文件,且多個容器操作同一個文件,會在每個容器的文件系統里生成一個複本,每個容器修改的都是自己的複本,相互隔離,相互不影響。使用CoW可以有效的提高磁碟的利用率。
  • 用時分配(allocate-on-demand)
用時分配是用在原本沒有這個文件的場景,只有在要新寫入一個文件時才分配空間,這樣可以提高存儲資源的利用率。比如啟動一個容器,並不會為這個容器預分配一些磁碟空間,而是當有新文件寫入時,才按需分配新空間。

5.2 AUFS

AUFS(AnotherUnionFS)是一種Union FS,是文件級的存儲驅動。AUFS能透明覆蓋一個或多個現有文件系統的層狀文件系統,把多層合併成文件系統的單層表示。即支持將不同目錄掛載到同一個虛擬文件系統下的文件系統。 這種文件系統可以一層一層地疊加修改文件。無論底下有多少層都是只讀的,只有最上層的文件系統是可寫的。當需要修改一個文件時,AUFS創建該文件的一個副本,使用CoW將文件從只讀層複製到可寫層進行修改,結果也保存在可寫層。 在Docker中,底下的只讀層就是image,可寫層就是Container。結構如下圖所示: 16

5.3 OverlayFS

Overlay是Linux內核3.18後支持的,也是一種Union FS,和AUFS的多層不同的是Overlay只有兩層:一個upper文件系統和一個lower文件系統,分別代表Docker的鏡像層和容器層。當需要修改一個文件時,使用CoW將文件從只讀的lower複製到可寫的upper進行修改,結果也保存在upper層。在Docker中,底下的只讀層就是image,可寫層就是Container。 17

5.4 Device mapper

Device mapper是Linux內核2.6.9後支持的,提供的一種從邏輯設備到物理設備的映射框架機制,在該機制下,用戶可根據需要制定實現存儲資源的管理策略。 不同於AUFS和OverlayFS的文件級存儲,Device mapper是塊級存儲,所有的操作都是直接對塊進行操作,而不是文件。 Device mapper驅動會先在塊設備上創建一個資源池,然後在資源池上創建一個帶有文件系統的基本設備,所有鏡像都是這個基本設備的快照,而容器則是鏡像的快照。 所以在容器里看到文件系統是資源池上基本設備的文件系統的快照,並不有為容器分配空間。當要寫入一個新文件時,在容器的鏡像內為其分配新的塊並寫入數據,即用時分配。當要修改已有文件時,再使用CoW為容器快照分配塊空間,將要修改的數據複製到在容器快照中新的塊里再進行修改。 Device mapper 驅動預設會創建一個100G的文件包含鏡像和容器。每一個容器被限制在10G大小的捲內,大小可配置調整。 18

5.5 Btrfs

Btrfs被稱為下一代寫時複製文件系統,併入Linux內核,也是文件級級存儲,但可以像Device mapper直接操作底層設備。 Btrfs把文件系統的一部分配置為一個完整的子文件系統,稱之為subvolume 。那麼採用 subvolume,一個大的文件系統可以被劃分為多個子文件系統,這些子文件系統共用底層的設備空間,在需要磁碟空間時便從底層設備中分配。 為了靈活利用設備空間,Btrfs 將磁碟空間劃分為多個chunk 。每個chunk可以使用不同的磁碟空間分配策略。比如某些chunk只存放metadata,某些chunk只存放數據。這種模型有很多優點,比如Btrfs支持動態添加設備。 用戶在系統中增加新的磁碟之後,可以使用Btrfs的命令將該設備添加到文件系統中。 Btrfs把一個大的文件系統當成一個資源池,配置成多個完整的子文件系統,還可以往資源池裡加新的子文件系統,而基礎鏡像則是子文件系統的快照,每個子鏡像和容器都有自己的快照,這些快照則都是subvolume的快照。 當寫入一個新文件時,為在容器的快照里為其分配一個新的數據塊,文件寫在這個空間里,這個叫用時分配。而當要修改已有文件時,使用CoW複製分配一個新的原始數據和快照,在這個新分配的空間變更數據,變結束再更新相關的數據結構指向新子文件系統和快照,原來的原始數據和快照沒有指針指向,被覆蓋。 19

5.6 ZFS

ZFS 文件系統是一個革命性的全新的文件系統,它從根本上改變了文件系統的管理方式,ZFS 完全拋棄了“捲管理”,不再創建虛擬的捲,而是把所有設備集中到一個存儲池中來進行管理,用“存儲池”的概念來管理物理存儲空間。過去,文件系統都是構建在物理設備之上的。為了管理這些物理設備,併為數據提供冗餘,“捲管理”的概念提供了一個單設備的映像。而ZFS創建在虛擬的,被稱為“zpools”的存儲池之上。每個存儲池由若幹虛擬設備(virtual devices,vdevs)組成。這些虛擬設備可以是原始磁碟,也可能是一個RAID1鏡像設備,或是非標準RAID等級的多磁碟組。於是zpool上的文件系統可以使用這些虛擬設備的總存儲容量。 20 Docker里ZFS的使用。首先從zpool里分配一個ZFS文件系統給鏡像的基礎層,而其他鏡像層則是這個ZFS文件系統快照的克隆,快照是只讀的,而克隆是可寫的,當容器啟動時則在鏡像的最頂層生成一個可寫層。如下圖所示: 21 當要寫一個新文件時,使用按需分配,一個新的數據快從zpool里生成,新的數據寫入這個塊,而這個新空間存於容器(ZFS的克隆)里。 當要修改一個已存在的文件時,使用寫時複製,分配一個新空間並把原始數據複製到新空間完成修改。

5.7 存儲驅動的對比及適應場景

  特點 優點 缺點 使用場景
AUFS 聯合文件系統 未併入內核主線 文件級存儲 作為docker的第一個存儲驅動,相對穩定,且在大量的生產中實踐,有較強的社區支持。 有多層,在做寫時複製操作時,如果文件較大且存在比較低的層,可能會慢一些。 大併發但少IO的場景。
OverlayFS 聯合文件系統 併入內核主線 文件級存儲 只有兩層 不管修改的內容大小都會複製整個文件,對大文件進行修改顯示要比小文件消耗更多的時間。 大併發但少IO的場景。
Device mapper 併入內核主線 塊級存儲 塊級無論是大文件還是小文件都只複製需要修改的塊,並不是整個文件。 不支持共用存儲,即有多個容器讀同一個文件時,需要生產多個副本,在多容器啟停的情況下可能會導致磁碟溢出。 適合IO密集的場景。
Btrfs 併入內核主線 文件級存儲 可如Device mapper直接操作底層設備,支持動態添加設備。 不支持共用存儲,即有多個容器讀同一個文件時,需要生產多個副本,在多容器啟停的情況下可能會導致磁碟溢出。 不適合在高密度容器的PaaS平臺上使用。
ZFS 把所有設備密集到一個存儲池進行管理。 支持多個容器共用一個緩存塊,適合記憶體大的環境。 COW使碎片化問題更加嚴重,文件在硬碟上的物理地址會變得不再連續,順序讀會變得性能比較差。 適合PaaS和高密度的場景。
參考鏈接:http://dockone.io/article/1513

5.8 修改docker存儲驅動類型

  1 root@docker:~# vi /etc/docker/daemon.json
  2 {
  3 "storage-driver": "overlay2"
  4 }

六 創建鏡像

從鏡像倉庫中下載的鏡像若不能滿足需求,可通過以下兩種方式對鏡像進行更改。
  • 從已經創建的容器中更新鏡像,並且提交這個鏡像
  • 使用 Dockerfile 指令來創建一個新的鏡像

6.1 更新鏡像並提交

  1. 運行容器
  2. 修改容器
  3. 將容器保存為新的鏡像
  1 root@docker:~# docker run --name centos-7-01 -it centos:7 /bin/bash	#創建容器
  2 [root@01b2b251e216 /]# yum -y install net-tools vim openssh-clients wget ntp bash-completion    #安裝軟體
  3 [root@01b2b251e216 /]# exit
  4 root@docker:~# docker commit -m="has modify" -a="xhy" 01b2b251e216 centos-7-01
  5 root@docker:~# docker images
22 參數說明:
  • -m:提交的描述信息
  • -a:指定鏡像作者
  • 01b2b251e216 :容器ID
  • centos-7-01:指定要創建的目標鏡像名
  1 root@docker:~# docker images						#查看鏡像
更新現有鏡像缺陷
  • 手動創建,容易出錯,效率低及可重覆性弱
  • 使用者並不知道鏡像是如何創建出來的,裡面是否有惡意程式,可能存在案例隱患

6.2 Dockerfile構建鏡像舉例

  1 root@docker:~# mkdir /dockerfiles
  2 root@docker:~# cd /dockerfiles/
  3 root@docker:/dockerfiles# vi Dockerfile
  4 FROM            centos:7
  5 MAINTAINER  Fisher "[email protected]"
  6 
  7 RUN         /bin/echo 'root:x123456' |chpasswd
  8 RUN         useradd xhy
  9 RUN         /bin/echo 'xhy:x123456' |chpasswd
 10 RUN         /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
 11 EXPOSE      22
 12 EXPOSE      80
 13 CMD         /usr/sbin/sshd -D
語句說明: 第一條FROM,指定所採用的鏡像源,每一個指令的首碼都必須是大寫的; RUN 指令表示docker在鏡像內執行的命令,更多詳見七Dockerfile詳解。
  1 root@docker:/dockerfiles# docker build -t xhy/centos7 /dockerfiles/
參數說明:
  • -t :指定要創建的目標鏡像名
  • /dockerfiles/:Dockerfile 文件所在目錄
  1 root@docker:~# docker images						#查看鏡像
23
  1 root@docker:/dockerfiles# docker run -t -i xhy/centos7  /bin/bash	#創建容器
24

七 Dockerfile詳解

7.1 Dockerfile典型結構

  1 From ubutu						#第一行必須指令基於的基礎鏡像
  2 MAINTAINER docker_user  [email protected]        #維護者信息
  3 apt/sourcelist.list					#鏡像的操作指令
  4 RUN apt-get update && apt-get install -y ngnix 	#鏡像的操作指令
  5 RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf	#鏡像的操作指令
  6 CMD /usr/sbin/ngnix					#容器啟動時執行指令

7.2 Dockerfile相關指令

  • 指令:From
語法:
  1 FROM <image>
  2 FROM <image>:<tag>
  3 FROM <image>:<digest>

含義:FROM命令定義構建鏡像的基礎鏡像,該條必須是dockerfile的首個命令。若同一個DockerFile創建多個鏡像時,可使用多個From指令(每個鏡像一次),FROM 是必備且必須是第一條指令。在FROM指定構建鏡像的基礎源鏡像時,若本地沒有指定的該鏡像,則會自動從 Docker 的公共庫 pull 鏡像下來。 提示:
  • FROM必須是 Dockerfile 中非註釋行的第一個指令,即一個 Dockerfile 從FROM語句開始。
  • 如果有需求在一個 Dockerfile 中創建多個鏡像,則FROM可以在一個 Dockerfile 中出現多次。
  • 如果FROM語句沒有指定鏡像標簽,則預設使用latest標簽。
舉例:FROM ubuntu
  • 指令:MAINTAINER
語法:
  1 MAINTAINER <name>
含義:聲明作者信息,可以放在文件任何位置,建議放在FROM後面。 舉例:
  1 MAINTAINER  xhy
  • 指令:RUN
語法:
  1 RUN <commands>
  2 RUN "executable", "param1", "param2"

含義:RUN 指令是用來執行命令行命令的,每條RUN指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像,後續RUN都在之前RUN提交後的鏡像為基礎. exec 方式會被解析為一個 JSON 數組,所以必須使用雙引號而不是單引號。exec 方式不會調用一個命令 shell,所以也就不會繼承相應的變數,RUN產生的緩存在下一次構建的時依舊有效,且會被重用,可以使用--no-cache選項,即docker build --no-cache,如此便不會緩存。 舉例:
  1 RUN echo 'Hello, Docker!'
  2 RUN ["/bin/bash", "-c","echo hello"]

提示:對於處理同一事件的多個命令,建議採用&&連接為一個命令,即構建一層即可。命令過長可使用\的換行方式。
  • 指令:CMD
語法:
	   

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

-Advertisement-
Play Games
更多相關文章
  • 實際開發中我們需要對一些公共類庫進行開發,並基於Jenkins進行CI/CD(CI:持續集成,CD:持續部署),其他項目通過NuGet引用。 "上文" 講述瞭如何搭建本地NuGet伺服器併發布NuGet包,這裡不再贅述。 CI/CD流程如下圖: 首先公共類庫代碼通過Git管理,編輯完代碼後上傳到Gi ...
  • 1、 Ver是頁面定義的變數 2、 asp.net 頁面定義為 <link href="/company/them/page.css?v=<%=Ver%>" rel="stylesheet" type="text/css" /> 輸出結果為 <link href="them/page.css?v=& ...
  • 小弟初來乍到,分享一些工作學習中遇到的問題和解決方式,如有不准確或是有錯誤的地方,希望不吝賜教,謝過了。 --Dogtwo 起因: ABP 中異常處理的思路是很清晰的。一共五種類型的異常類。 AbpInitializationException用於封裝ABP初始化過程中出現的異常,只要拋出AbpIn ...
  • 1 using System.Configuration; 2 using System.Windows.Forms; 3 4 namespace Allyn.Common 5 { 6 public class XmlHeper 7 { 8 /// 9 ///返回Config文件中appSettin... ...
  • 1 using System; 2 using System.Collections.Specialized; 3 using System.IO; 4 using System.Net; 5 using System.Text; 6 7 namespace Allyn.Common 8 { 9 p... ...
  • 微信的api開放的二維碼是一個鏈接地址,而我們要將這個二維碼顯示到客戶端。方式很多,今天我們講其中一種。 調用方式: 這個是訪問微信地址url,獲取到這個url中顯示的微信二維碼,拿到這個圖片,顯示到wpf 更多方式瞭解請加頁面下方的群 ...
  • 小弟初來乍到,分享一些工作學習中遇到的問題和解決方式,如有不准確或是有錯誤的地方,希望不吝賜教,謝過了。 --Dogtwo 背景: 一個代理伺服器BK,接收前端A發送的請求,記錄log,並轉發給另外的伺服器B。 請求中有類似這樣的模塊: Person: { name:abc, age: 20, ad ...
  • [HttpGet] public ActionResult JsonList() { int itemselect = ConvertHelper.SafeRequest("itemselect",0);//一級 int ProfessionID = ConvertHelper.SafeReques ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...