Docker 提供了一個(gè)與 Docker 守護(hù)進(jìn)程交互的 API (稱為Docker Engine API),我們可以使用官方提供的 Go 語言的 SDK 進(jìn)行構(gòu)建和擴(kuò)展 Docker 應(yīng)用程序和解決方案。
成都創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
轉(zhuǎn)自:
整理:地鼠文檔
通過下面的命令就可以安裝 SDK 了:
該部分會(huì)介紹如何使用 Golang + Docker API 進(jìn)行管理本地的 Docker。
第一個(gè)例子將展示如何運(yùn)行容器,相當(dāng)于 docker run docker.io/library/alpine echo "hello world" :
還可以在后臺(tái)運(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,我們可以獲取對(duì)應(yīng) ID 的容器的日志:
獲取本地所有的鏡像,相當(dāng)于 docker image ls 或 docker images :
拉取指定鏡像,相當(dāng)于 docker pull alpine :
除了公開的鏡像,我們平時(shí)還會(huì)用到一些私有鏡像,可以是 DockerHub 上私有鏡像,也可以是自托管的鏡像倉庫,比如 harbor 。這個(gè)時(shí)候,我們需要提供對(duì)應(yīng)的憑證才可以拉取鏡像。
值得注意的是:在使用 Docker API 的 Go SDK 時(shí),憑證是以明文的方式進(jìn)行傳輸?shù)模匀绻亲越ǖ溺R像倉庫,請務(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 。
您好,很高興為您解答。
安裝daemonize
安裝git環(huán)境
yum?install?git?-y
獲取daemonize
git?clone?git://github.com/bmc/daemonize.git
安裝daemonize
cd?daemonize
./configure
make??make?install
查看是否安裝
daemonize?-v
通過daemonize執(zhí)行g(shù)olang守護(hù)進(jìn)程
需要打包golang程序?yàn)榭蓤?zhí)行文件(go build),并通過daemonize來執(zhí)行它來實(shí)現(xiàn)守護(hù)進(jìn)程,如:
daemonize?-p?/var/run/myapp.pid?-l?/var/lock/subsys/myapp?-u?nobody?/path/to/myapp
如若滿意,請點(diǎn)擊右側(cè)【采納答案】,如若還有問題,請點(diǎn)擊【追問】
希望我的回答對(duì)您有所幫助,望采納!
~?O(∩_∩)O~
在golang的gin項(xiàng)目中使用supervisor守護(hù)進(jìn)程,用子進(jìn)程配置將標(biāo)準(zhǔn)輸出日志轉(zhuǎn)移到指定目錄下,然后使用阿里云的日志服務(wù)將標(biāo)準(zhǔn)輸出日志轉(zhuǎn)移到線上做一些分析和預(yù)警。
? 項(xiàng)目上線之后一切正常,可是周日夜里三點(diǎn)左右阿里云的日志服務(wù)采集不到日志,一頓pv為0的告警過來,趕緊打開電腦,線上服務(wù)正常,松一口氣,supervisor狀態(tài)也正常,觀察了一會(huì)業(yè)務(wù)數(shù)據(jù)正常就安然入睡了,心想可能是因?yàn)榕渲庙?xiàng)有缺陷吧,回頭好好整整supervisor的配置再觀察一波。
? ?早上起來打開服務(wù)器,cd /var/log/supervisor/,發(fā)現(xiàn)存在兩個(gè)日志文件,分別是xxxx.log-20201223和xxxx.log,xxxx.log的大小為0,xxxx.log-20201223還在繼續(xù)寫入請求日志,權(quán)限問題?chmod 777之后發(fā)現(xiàn)新的文件還是不寫入日志,重啟 supervisor之后發(fā)現(xiàn)日志能正常寫入了。。。一開始懷疑是supervisor日志切割備份有問題,將配置stdout日志文件大小的stdout_logfile_maxbytes配置項(xiàng),默認(rèn) 50MB改成0,代表無限大,stdout日志文件備份數(shù)的stdout_logfile_backups配置項(xiàng),默認(rèn)10改為0,代表不備份,重啟supervisor,心想不切割總不會(huì)再出現(xiàn)切割之后不往新文件寫內(nèi)容的問題了,真乃明智之選。:)
? ? 一周過去,0pv的告警如期而至,雖然不影響線上業(yè)務(wù),如鯁在喉讓我久久不能釋懷。全網(wǎng)翻,百度谷歌,中文英文,去github上翻issue等等,看到一個(gè)歷史issue1090,Better support for logrotate,感覺和日志轉(zhuǎn)儲(chǔ)相關(guān),于是查了下logrotate相關(guān)資料,logrotate程序是一個(gè)日志文件管理工具。用于分割日志文件,刪除舊的日志文件,并創(chuàng)建新的日志文件,起到“轉(zhuǎn)儲(chǔ)”作用。centos系統(tǒng)默認(rèn)安裝,于是找到對(duì)應(yīng)的配置文件,果不其然里面就有supervisor,默認(rèn)配置如下:
/var/log/supervisor/*.log {
? missingok
? weekly
? notifempty
? nocompress
},看到weekly感覺離這個(gè)問題的答案不遠(yuǎn)了,于是去查找linux的logrotate往舊文件寫入的問題,在一篇logrotate writing to old app.log.1 instead of app.log的文章中找到需要配置參數(shù)copytruncate,是用于還在打開中的日志文件,把當(dāng)前日志備份并截?cái)?;是先拷貝再清空的方式,拷貝和清空之間有一個(gè)時(shí)間差,可能會(huì)丟失部分日志數(shù)據(jù)。增加完配置之后,為了快速驗(yàn)證結(jié)果,修改weekly為daily,第二天日志正常切割了,新的文件也正常寫入了標(biāo)準(zhǔn)日志。至此問題解決。
? ? linux的logrotate對(duì)于運(yùn)維來說可能是常識(shí),作為開發(fā)剛接觸運(yùn)維,只能慢慢積累了,工作之余看看相關(guān)的運(yùn)維知識(shí),盡量少采坑。
通俗解釋docker就是集裝箱。
Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的Linux或Windows機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
一個(gè)完整的Docker有以下幾個(gè)部分組成:
DockerClient客戶端。
Docker Daemon守護(hù)進(jìn)程。
Docker Image鏡像。
DockerContainer容器。
在docker的網(wǎng)站上提到了docker的典型場景:
Automating the packaging and deployment of applications(使應(yīng)用的打包與部署自動(dòng)化)。
Creation of lightweight, private PAAS environments(創(chuàng)建輕量、私密的PAAS環(huán)境)。
Automated testing and continuous integration/deployment(實(shí)現(xiàn)自動(dòng)化測試和持續(xù)的集成/部署)。
Deploying and scaling web apps, databases and backend services(部署與擴(kuò)展webapp、數(shù)據(jù)庫和后臺(tái)服務(wù))。