Docker 提供了一個(gè)與 Docker 守護(hù)進(jìn)程交互的 API (稱為Docker Engine API),我們可以使用官方提供的 Go 語言的 SDK 進(jìn)行構(gòu)建和擴(kuò)展 Docker 應(yīng)用程序和解決方案。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、長安網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、長安網(wǎng)絡(luò)營銷、長安企業(yè)策劃、長安品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供長安建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
轉(zhuǎn)自:
整理:地鼠文檔
通過下面的命令就可以安裝 SDK 了:
該部分會介紹如何使用 Golang + Docker API 進(jìn)行管理本地的 Docker。
第一個(gè)例子將展示如何運(yùn)行容器,相當(dāng)于 docker run docker.io/library/alpine echo "hello world" :
還可以在后臺運(yùn)行容器,相當(dāng)于 docker run -d bfirsh/reticulate-splines :
列出正在運(yùn)行的容器,就像使用 docker ps 一樣:
如果是 docker ps -a ,我們可以通過修改 types.ContainerListOptions 中的 All 屬性達(dá)到這個(gè)目的:
通過上面的例子,我們可以獲取容器的列表,所以在這個(gè)案例中,我們可以去停止所有正在運(yùn)行的容器。
通過指定容器的 ID,我們可以獲取對應(yīng) ID 的容器的日志:
獲取本地所有的鏡像,相當(dāng)于 docker image ls 或 docker images :
拉取指定鏡像,相當(dāng)于 docker pull alpine :
除了公開的鏡像,我們平時(shí)還會用到一些私有鏡像,可以是 DockerHub 上私有鏡像,也可以是自托管的鏡像倉庫,比如 harbor 。這個(gè)時(shí)候,我們需要提供對應(yīng)的憑證才可以拉取鏡像。
值得注意的是:在使用 Docker API 的 Go SDK 時(shí),憑證是以明文的方式進(jìn)行傳輸?shù)?,所以如果是自建的鏡像倉庫,請務(wù)必使用 HTTPS !
我們可以將一個(gè)已有的容器通過 commit 保存成一個(gè)鏡像:
當(dāng)然,除了可以管理本地的 Docker , 我們同樣也可以通過使用 Golang + Docker API 管理遠(yuǎn)程的 Docker 。
默認(rèn) Docker 是通過非網(wǎng)絡(luò)的 Unix 套接字運(yùn)行的,只能夠進(jìn)行本地通信( /var/run/docker.sock ),是不能夠直接遠(yuǎn)程連接 Docker 的。
我們需要編輯配置文件 /etc/docker/daemon.json ,并修改以下內(nèi)容(把 192.168.59.3 改成你自己的 IP 地址),然后重啟 Docker :
創(chuàng)建 client 的時(shí)候需要指定遠(yuǎn)程 Docker 的地址,這樣就可以像管理本地 Docker 一樣管理遠(yuǎn)程的 Docker 了:
現(xiàn)在已經(jīng)有很多可以管理 Docker 的產(chǎn)品,它們便是這樣進(jìn)行實(shí)現(xiàn)的,比如: portainer 。
1 select語句的每個(gè)case語句必須IO操作
2 執(zhí)行 case 語句順序是隨機(jī)的
3 select的每個(gè)case(包含default)語句是阻塞的
4 如果case語句均發(fā)生阻塞,那么執(zhí)行default語句
沒有定義。
Go語言特點(diǎn)1、函數(shù)式編程閉包。
2、工程化資源管理,錯(cuò)誤處理,測試無參,也沒有定義返回值聲明以后是import語句,引入要的模塊。
?? 當(dāng)讀取91.2 MB文件時(shí),read1耗時(shí)43ms,read2耗時(shí)99ms。
查看源碼:
讀取文件主要是通過 Read(p []byte) (n int, err error) :
官方文檔中關(guān)于該接口方法的說明:
結(jié)論:
??ReadFile(filename string)方法之所以速度快的原因就是先計(jì)算出file文件的size,在初始化對應(yīng)size大小的buff,傳入ReadRead(p []byte) 來讀取字節(jié)流
本文主要介紹了Go語言中文件讀寫的相關(guān)操作。
文件是什么?
計(jì)算機(jī)中的文件是存儲在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件。
os.Open() 函數(shù)能夠打開一個(gè)文件,返回一個(gè) *File 和一個(gè) err 。對得到的文件實(shí)例調(diào)用 close() 方法能夠關(guān)閉文件。
為了防止文件忘記關(guān)閉,我們通常使用defer注冊文件關(guān)閉語句。
Read方法定義如下:
它接收一個(gè)字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯(cuò)誤,讀到文件末尾時(shí)會返回 0 和 io.EOF 。 舉個(gè)例子:
使用for循環(huán)讀取文件中的所有數(shù)據(jù)。
bufio是在file的基礎(chǔ)上封裝了一層API,支持更多的功能。
io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數(shù)傳入。
os.OpenFile() 函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。
其中:
name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:
perm :文件權(quán)限,一個(gè)八進(jìn)制數(shù)。r(讀)04,w(寫)02,x(執(zhí)行)01。
Go里面提供了一個(gè)關(guān)鍵字select,通過select可以監(jiān)聽channel上的數(shù)據(jù)流動(dòng)。
select的用法與switch語言非常類似,由select開始一個(gè)新的選擇塊,每個(gè)選擇條件由case語句來描述。
與switch語句相比, select有比較多的限制,其中最大的一條限制就是每個(gè)case語句里必須是一個(gè)IO操作,大致的結(jié)構(gòu)如下:
在一個(gè)select語句中,Go語言會按順序從頭至尾評估每一個(gè)發(fā)送和接收的語句。
如果其中的任意一語句可以繼續(xù)執(zhí)行(即沒有被阻塞),那么就從那些可以執(zhí)行的語句中任意選擇一條來使用。
如果沒有任意一條語句可以執(zhí)行(即所有的通道都被阻塞),那么有兩種可能的情況:
如果給出了default語句,那么就會執(zhí)行default語句,同時(shí)程序的執(zhí)行會從select語句后的語句中恢復(fù)。
如果沒有default語句,那么select語句將被阻塞,直到至少有一個(gè)通信可以進(jìn)行下去
有時(shí)候會出現(xiàn)goroutine阻塞的情況,那么我們?nèi)绾伪苊庹麄€(gè)程序進(jìn)入阻塞的情況呢?我們可以利用select來設(shè)置超時(shí),通過如下的方式實(shí)現(xiàn):
select總結(jié):
作用: 用來監(jiān)聽 channel 上的數(shù)據(jù)流動(dòng)方向。 讀?寫?
select實(shí)現(xiàn)fibonacci數(shù)列: