日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从安全到镜像流水线,Docker 最佳实践与反模式一览

發(fā)布時(shí)間:2024/8/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从安全到镜像流水线,Docker 最佳实践与反模式一览 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者 |?Timothy Mugayi

譯者 |?彎月,責(zé)編 | 夕顏

封圖 | CSDN付費(fèi)下載自視覺中國(guó)

出品 | CSDN(ID:CSDNnews)

在使用Docker的大部分時(shí)間里,我們并不關(guān)心其內(nèi)部的工作原理。僅憑啟動(dòng)一個(gè)Docker容器并且讓應(yīng)用程序運(yùn)行良好,并不能說明你已經(jīng)實(shí)現(xiàn)了一個(gè)良好的解決方案。有時(shí),由于時(shí)間限制,我們只能復(fù)制粘貼Docker鏡像,卻沒能真正理解實(shí)現(xiàn)細(xì)節(jié)以及如何構(gòu)建Docker鏡像的細(xì)微差別。

?

在本文中,我們將探討Docker的最佳實(shí)踐和反模式。反模式是人們對(duì)于反復(fù)出現(xiàn)的問題的一般解決方案,這些方案沒有效率,甚至?xí)耆窒鸇ocker技術(shù)棧帶來的好處。

?

下面我們來看看我們的哪些做法不可取。

?

我們需要的標(biāo)簽

?

標(biāo)簽是必不可少的,我們需要通過標(biāo)簽傳達(dá)有關(guān)Docker鏡像的信息。你可以將標(biāo)簽視為Docker鏡像ID的別稱。Git標(biāo)簽負(fù)責(zé)標(biāo)記特定的提交,而Docker標(biāo)簽與之類似,可以給不同時(shí)間點(diǎn)上的Docker鏡像添加版本。忘記打標(biāo)簽是小事,但會(huì)帶來一些弊端,具體來講,如果未指定標(biāo)記,則默認(rèn)鏡像將被標(biāo)記為latest。

?

FROM your_image_name:latest

?

如果你頻繁執(zhí)行該操作,那么很有可能鏡像不是最新的,可能指向的是舊版本。因此,請(qǐng)使用適當(dāng)?shù)臉?biāo)簽并遵守某個(gè)版本控制標(biāo)準(zhǔn),例如語(yǔ)義版本控制。這樣,Docker鏡像使用者才能確保Docker鏡像的兼容性并時(shí)刻保持最新,還可以有計(jì)劃地使用正確的版本。

?

還有一個(gè)情況應(yīng)該避免。你可以利用最新的默認(rèn)標(biāo)簽(如FROM python3:latest),從Docker鏡像倉(cāng)庫(kù)中提取最新的鏡像。乍一看,這種做法似乎是個(gè)好主意,但卻有一些意想不到的副作用:每個(gè)最新的請(qǐng)求可能都會(huì)派生出與以前的構(gòu)建完全不同的Docker鏡像。弄明白Docker鏡像損壞的原因?qū)?huì)變得很困難,因?yàn)殓R像本應(yīng)該是不可變的。因此,我強(qiáng)力建議使用特定的標(biāo)簽來標(biāo)記鏡像(例如:python3:1.0.1)。這種方法可以確保你的Dockerfile保持不變。

?

在同一個(gè)容器中運(yùn)行多個(gè)服務(wù)

?

雖然你可以在同一個(gè)容器中運(yùn)行多個(gè)服務(wù),但我并不建議你這么做,原因有兩個(gè)。在使用Docker服務(wù)時(shí),我們應(yīng)該努力維持責(zé)任單一性。最佳做法是,組成應(yīng)用程序的每個(gè)服務(wù)都應(yīng)在各自的容器中運(yùn)行,請(qǐng)務(wù)必將每項(xiàng)獨(dú)立的功能都打包到單獨(dú)的獨(dú)立容器鏡像中。

?

將多個(gè)服務(wù)添加到一個(gè)Docker鏡像的做法似乎很誘人,但是你不應(yīng)該將容器鏡像視為虛擬機(jī)。一個(gè)容器包含多個(gè)服務(wù),可能會(huì)導(dǎo)致你的應(yīng)用程序很難水平擴(kuò)展。Docker容器核心概念是,它們都是瞬態(tài)的,專為分發(fā)而設(shè)計(jì),這對(duì)于現(xiàn)代Web應(yīng)用程序來說很理想,因?yàn)樗乃矐B(tài)特性、擴(kuò)展和并發(fā)會(huì)非常容易。添加多個(gè)服務(wù)會(huì)增加管理分發(fā)的難度。

?

另外,單個(gè)容器上的多個(gè)服務(wù)還會(huì)加大管理安全性的難度。龐大的鏡像可能會(huì)降低CI/CD的速度,你需要小心。

?

使用LABEL對(duì)鏡像進(jìn)行分類

?

這并不能說是反模式,但我認(rèn)為值得一提。我在處理各種Docker鏡像時(shí)注意到了一件事:有時(shí)這些鏡像的創(chuàng)建者沒有使用LABEL maintainer標(biāo)簽。這個(gè)標(biāo)簽可在事件中設(shè)置鏡像的Author字段,當(dāng)出現(xiàn)問題或需要澄清時(shí),這個(gè)標(biāo)簽可以方便大家了解該與何人內(nèi)部聯(lián)系;如果鏡像是公開共享的,也可以知道該與哪個(gè)外部的人聯(lián)系。

?

這絕不是唯一可以使用的標(biāo)簽。你可以根據(jù)需要定義各種標(biāo)簽,來對(duì)鏡像進(jìn)行分類,定義許可信息,也可以定義標(biāo)簽來幫助自動(dòng)化。

?

除了maintainer,還可以使用多行標(biāo)簽:

# Set one or more individual labels LABEL com.example.version="0.0.1-beta" LABEL vendor1="RBTSB Incorporated" LABEL vendor2=TIPTAPCODE\ Incorporated LABEL com.example.release-date="202-04-02" LABEL com.example.version.production="0.0.1"

Docker 1.10之前的單行標(biāo)簽會(huì)創(chuàng)建新的docker層,如果你使用的是最新版的Docker,則不必?fù)?dān)心創(chuàng)建額外的層。

LABEL vendor=ACME\ Incorporated \ com.example.is-beta= \ com.example.is-production="" \ com.example.version="0.0.1-beta" \ com.example.release-date="2015-02-12"

我們應(yīng)該將盡可能多的元數(shù)據(jù)添加到不可變的Docker鏡像,以方便追蹤,提高可見性和可維護(hù)性。

?

避免構(gòu)建依賴特定環(huán)境的鏡像

?

在構(gòu)建Docker鏡像時(shí),我們應(yīng)始終牢記不變性。最好不要使用帶有dev、test、staging和production的鏡像,因?yàn)檫@會(huì)破壞單一來源的原則。另一個(gè)問題是,如果在不同環(huán)境上驗(yàn)證或調(diào)試,則這種做法無法保證鏡像的相似。

?

為什么要使用非Root容器?

?

在默認(rèn)情況下,Docker容器以root身份運(yùn)行。以root用戶身份運(yùn)行的Docker容器可以完全控制主機(jī)系統(tǒng)。然而,出于安全考慮,我并不推薦這種做法。使用非root運(yùn)行的Docker容器鏡像可以多一層保護(hù),在生產(chǎn)環(huán)境中通常建議使用非root容器。但是,由于這些容器由非root用戶運(yùn)行,因此無法執(zhí)行需要特殊權(quán)限的任務(wù)。如果需要利用USER指令指定非root用戶(如以下示例所示),則需要進(jìn)行一些上下文切換。

?

FROM python:3.6-slim-buster LABEL maintainer="Timothy Mugayi <timothy.mugayi@gmail.com>"RUN apt-get update && apt-get install -y --no-install-recommends \ wget && rm -rf /var/lib/apt/lists/*# Dumb init RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 RUN chmod +x /usr/local/bin/dumb-initRUN pip install --upgrade pipWORKDIR /usr/src/appCOPY requirements.txt .RUN pip install -r requirements.txtCOPY helloworld.py .USER 1001ENTRYPOINT ["/usr/local/bin/dumb-init", "python3", "-u", "./helloworld.py"]?

如果你使用的基礎(chǔ)鏡像不是由root生成的,但需要切換回root,則可以執(zhí)行以下操作:

FROM <namespace>/<image>:<tag_version>USER root

不要在單個(gè)容器內(nèi)運(yùn)行太多進(jìn)程

?

容器的優(yōu)點(diǎn)以及容器相對(duì)于虛擬機(jī)的優(yōu)勢(shì)在于,通過多個(gè)相互交互的容器組成一個(gè)完整的應(yīng)用程序。我們無需在單個(gè)容器中運(yùn)行完整的應(yīng)用程序。相反,我們應(yīng)盡可能將應(yīng)用程序分解為多個(gè)服務(wù),并將服務(wù)分布到多個(gè)容器上。這樣可以最大程度地提高靈活性和可靠性。

?

不要在容器內(nèi)安裝操作系統(tǒng)

?

使用一段時(shí)間Docker后,你就有可能遇到這種情況。雖然你可以在容器內(nèi)安裝和運(yùn)行完整的Linux操作系統(tǒng)。但是你應(yīng)該這樣做嗎?

?

這可能不是一個(gè)好主意。Docker鏡像是使用層的概念構(gòu)建的,因此添加的東西越多,鏡像就會(huì)膨脹得越大。一個(gè)完整的操作系統(tǒng)并不是Docker的理想使用情況。在理想情況下,你的容器內(nèi)部只應(yīng)該加載必要的組件。

?

不要在容器內(nèi)運(yùn)行不必要的服務(wù)

?

為了充分利用容器的優(yōu)勢(shì),你應(yīng)該盡可能保持容器精簡(jiǎn)。這樣可以最大程度地提高性能,并最大程度地降低安全風(fēng)險(xiǎn)。因此,請(qǐng)避免運(yùn)行并非絕對(duì)必要的服務(wù)。例如,若非必要請(qǐng)不要在容器內(nèi)運(yùn)行SSH服務(wù),你可以選用其他方式(例如Docker exec)登錄到容器。

?

不要在容器內(nèi)加載不必要的程序

?

你必須知道這種反模式。在使用Docker時(shí),很多人傾向于在鏡像中加載sonar之類的工具,來確保代碼覆蓋率等。

?

使用從Docker CE 17.05+開始支持的多階段構(gòu)建(Multistage builds)模式,你可以在Dockerfile中使用多個(gè)FROM stage。臨時(shí)構(gòu)建的階段容器將被丟棄,因此最終的運(yùn)行時(shí)容器鏡像都很精簡(jiǎn)。舉個(gè)例子,當(dāng)你需要從源文件編譯一些二進(jìn)制文件,然后在第二個(gè)階段中將二進(jìn)制文件復(fù)制到最終鏡像中。

?

優(yōu)點(diǎn):

?

  • 構(gòu)建速度更快,精簡(jiǎn)的鏡像可以讓CI/CD過程更快,鏡像通過網(wǎng)絡(luò)進(jìn)行傳輸時(shí)花費(fèi)的時(shí)間也更少。

  • 需要的存儲(chǔ)空間更少。

  • 冷啟動(dòng)(拉取鏡像)更快。

  • 潛在的受攻擊面更少。

?

缺點(diǎn):

?

  • 容器內(nèi)的工具較少,但這是保證容器的精簡(jiǎn)所需付出的一點(diǎn)小小的代價(jià)。

在容器內(nèi)加入供觀察的工具

?

即便沒有監(jiān)視解決方案,你也可以照常運(yùn)行容器,但需要牢記,從本質(zhì)上來說,你很難知道容器內(nèi)部發(fā)生了什么,特別是隨著容器數(shù)量的增加。

?

Docker本身自帶了許多指標(biāo),能夠公開每個(gè)運(yùn)行容器的CPU、內(nèi)存、網(wǎng)絡(luò)和I/O使用情況,可通過Docker遠(yuǎn)程API的/stats端點(diǎn)訪問。App dynamics 和 Newrelic 是兩個(gè)現(xiàn)成的程序,可以與Docker鏡像一起打包,幫助你從應(yīng)用程序級(jí)別了解應(yīng)用程序和容器的運(yùn)行狀況。

?

基礎(chǔ)鏡像的愛恨交織

?

“你知道是誰(shuí)構(gòu)建了這個(gè)景象,里面都添加了什么嗎?”

?

這里說的都是可追溯性。牢記安全性是所有軟件開發(fā)人員都應(yīng)努力的方向。你需要了解如何跟蹤Docker鏡像的源,并了解里面有什么。

?

你需要時(shí)刻牢記以下幾點(diǎn):

?

  • 鏡像是怎樣創(chuàng)建的。

  • 驗(yàn)證鏡像在創(chuàng)建后未經(jīng)更改。

  • 驗(yàn)證鏡像的內(nèi)容。

  • 掃描鏡像是否有安全漏洞。

?

我們可以通過一些工具對(duì)容器進(jìn)行靜態(tài)分析。這些工具涉及方方面面,已超出了本文的范圍,但是我建議你花一些時(shí)間來學(xué)習(xí)。

?

Clair是一個(gè)有趣的工具,可為你的Docker應(yīng)用程序提供自動(dòng)容器漏洞和安全掃描。掃描基于常見的漏洞和公開(CVE)的數(shù)據(jù)庫(kù)。如果你本地運(yùn)行Docker,則可以下載Postgres,然后將Clair連接到Postgres上。以下是啟動(dòng)和運(yùn)行Clair所需的最低配置:

$ mkdir $PWD/clair_config $ curl -L https://raw.githubusercontent.com/coreos/clair/master/config.yaml.sample -o $ PWD/clair_config/config.yaml $ docker run -d -e POSTGRES_PASSWORD="" -p 5432:5432 postgres:9.6 $ docker run --net=host -d -p 6060-6061:6060-6061 -v PWD/clair_config:/config quay.io/coreos/clair:latest -config=/config/config.yaml

如果你想更改Postgres的端口,請(qǐng)確保同時(shí)修改config.yaml文件。如果你的系統(tǒng)上已經(jīng)運(yùn)行了另一個(gè)Postgres,請(qǐng)注意不要將docker端口更改為5432以外的端口。

?

clair: database: # Database driver type: pgsql options: # PostgreSQL Connection string # https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING source: host=localhost port=5432 user=postgres password=123456 sslmode=disable statement_timeout=60000

在鏡像啟動(dòng)并執(zhí)行后,你可以運(yùn)行Docker ps來確認(rèn)容器已啟動(dòng)且正常運(yùn)行:

你需要注意Clair沒有Web UI或CLI。你只能通過REST API或第三方CLI工具來使用。

?

Bayan Collector是一款輕巧的靜態(tài)分析應(yīng)用程序,可以從鏡像倉(cāng)庫(kù)啟動(dòng)容器以進(jìn)行靜態(tài)分析,可以運(yùn)行任意腳本并收集有用的信息(例如已安裝的軟件包),強(qiáng)制執(zhí)行策略,以及對(duì)鏡像進(jìn)行校驗(yàn)。

?

Docker Bench for Security是由Docker團(tuán)隊(duì)創(chuàng)建的工具,它會(huì)在Docker的宿主上運(yùn)行一個(gè)安全最佳做法清單,并標(biāo)記發(fā)現(xiàn)的任何問題。

?

不要在容器鏡像中存儲(chǔ)敏感數(shù)據(jù)

?

請(qǐng)一定避免這個(gè)錯(cuò)誤。如果你的鏡像對(duì)外公開,或者開發(fā)人員無意中將鏡像推送到公共的Docker鏡像倉(cāng)庫(kù)中,那么就會(huì)導(dǎo)致隱私和敏感信息的泄露。切記永遠(yuǎn)不要在Dockerfile中對(duì)敏感信息使用COPY或`。

?

為了避免這種情況,請(qǐng)將敏感數(shù)據(jù)存儲(chǔ)在安全文件系統(tǒng)上,并讓容器進(jìn)行連接。一般情況下,這個(gè)文件系統(tǒng)應(yīng)該在容器所在的宿主上,或者可通過AWS Elastic Block Storage(EBS)等塊存儲(chǔ)或S3等對(duì)象存儲(chǔ)服務(wù)來使用。

?

此外,你應(yīng)避免在Docker鏡像中存儲(chǔ)安全憑證。作為開發(fā)人員,有時(shí)我們會(huì)采用偷懶的做法,在代碼中硬編碼密碼和私鑰。你需要習(xí)慣使用-e參數(shù)在運(yùn)行時(shí)為Docker容器指定環(huán)境變量。

?

你也可以通過env-file,從文件中讀取環(huán)境變量。通過CMD或`從第三方來源獲取憑據(jù)的自定義腳本也可用于獲取Docker容器所需的相關(guān)憑據(jù)。

?

不要在容器內(nèi)存儲(chǔ)數(shù)據(jù)或日志

?

容器化改變了日志的性質(zhì)。容器是瞬態(tài)、無狀態(tài)應(yīng)用程序的理想選擇。本質(zhì)上,存儲(chǔ)在運(yùn)行容器中的所有數(shù)據(jù)都應(yīng)該是短暫的,你可能已經(jīng)注意到,當(dāng)容器關(guān)閉時(shí),數(shù)據(jù)將丟失。因此,將數(shù)據(jù)存儲(chǔ)在Docker容器之外的做法更值得推崇。有一些工具可以幫助你提取Docker日志,并將其放在更永久的數(shù)據(jù)存儲(chǔ)中。

?

在處理Docker日志時(shí)需要牢記一點(diǎn):Docker至少擁有三個(gè)級(jí)別的日志記錄,即Docker容器、Docker服務(wù)和宿主操作系統(tǒng),你選擇的日志記錄方法應(yīng)該能夠提取所有級(jí)別的日志。

?

不要寫入容器的文件系統(tǒng)

?

每次將內(nèi)容寫入容器的文件系統(tǒng)都會(huì)激活“寫時(shí)復(fù)制”策略。這會(huì)使用存儲(chǔ)驅(qū)動(dòng)程序(deviermapper、overlayfs或其他驅(qū)動(dòng))創(chuàng)建新的存儲(chǔ)層。在實(shí)際應(yīng)用中,這會(huì)給存儲(chǔ)驅(qū)動(dòng)帶來巨大的壓力,特別是使用Devicemapper或BTRFS的情況下。

?

確保容器只向卷中寫入數(shù)據(jù)。對(duì)于小型的臨時(shí)文件可以寫入tmpfs,因?yàn)閠mpfs是僅存在于內(nèi)存或交換分區(qū)中的臨時(shí)文件系統(tǒng)。

?

不要運(yùn)行PID 1

?

這是許多人都不知道的常見問題。

?

Docker中的進(jìn)程運(yùn)行時(shí)沒有init進(jìn)程負(fù)責(zé)清理子進(jìn)程,所以容器可能會(huì)出現(xiàn)僵尸進(jìn)程,導(dǎo)致意料之外的錯(cuò)誤。

?

使用tini或dumb-init

?

PID 1在Unix中很特殊,因此在init系統(tǒng)中忽略它通常會(huì)導(dǎo)致進(jìn)程和信號(hào)處理錯(cuò)誤。這會(huì)導(dǎo)致類似于容器無法優(yōu)雅地停止,或本應(yīng)摧毀的容器出現(xiàn)泄露等問題。

?

僵尸進(jìn)程指的是運(yùn)行已經(jīng)停止,但依然在進(jìn)程表中占據(jù)位置的進(jìn)程,因?yàn)樗鼈兊母高M(jìn)程沒有調(diào)用wait系統(tǒng)調(diào)用進(jìn)行回收。理論上,每個(gè)結(jié)束的進(jìn)程都會(huì)非常短暫地呈現(xiàn)僵尸狀態(tài),但有些進(jìn)程的僵尸狀態(tài)會(huì)持續(xù)很久。

?

如果某個(gè)進(jìn)程會(huì)生成新進(jìn)程,但信號(hào)處理的實(shí)現(xiàn)不好,無法捕獲子進(jìn)程的信號(hào)并將其終止,那么可以使用Tini或dumb-init。例如,bash腳本就無法正確處理或釋放信號(hào)。

?

下面是運(yùn)行dumb init的示例,其中prepare.sh可以是shell腳本,也可以是用于執(zhí)行應(yīng)用程序的命令:

RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64RUN chmod +x /usr/local/bin/dumb-initENTRYPOINT ["/usr/local/bin/dumb-init", "/usr/bin/prepare.sh"]

或者如果你選擇tini,可以參考下面使用Python anaconda conda的示例:

?

RUN conda install --yes -c conda-forge tiniENTRYPOINT ["tini", "-g", "--", "/usr/bin/prepare.sh"]

?

最后,這里是一個(gè)更一般的示例,不依賴于任何編程語(yǔ)言:

?

FROM node:13.12.0-slimMAINTAINER?Timothy?Mugayi?<timothy.mugayi@gmail.com>ENV TINI_VERSION='v0.13.0' # Add tini init, see https://github.com/krallin/tini ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tiniRUN chmod +x /tini # Set tini as entrypoint ENTRYPOINT ["/tini", "--"]

在CI/CD中使用Dockerfile格式檢查

?

跟編程語(yǔ)言一樣,Docker也有格式檢查工具。

?

采用格式檢查工具有許多好處,因?yàn)樗鼤?huì)強(qiáng)制你使用最佳實(shí)踐。在CI/CD過程中加入格式檢查,可以幫助團(tuán)隊(duì)避免常見的錯(cuò)誤,并在構(gòu)建產(chǎn)品Docker鏡像時(shí)建立最佳實(shí)踐。可以從hadolint開始,這是一個(gè)用Haskell編寫的Dockerfile格式檢查工具,能夠解析Dockerfile成AST,并在AST上執(zhí)行規(guī)則檢查。

?

我們來運(yùn)行一個(gè)示例。要對(duì)Docker進(jìn)行格式檢查,可以執(zhí)行以下命令:

$ docker run --rm -i hadolint/hadolint < Dockerfile

?

格式檢查完成后會(huì)顯示以下結(jié)果:

?

上圖中的錯(cuò)誤碼DL3008“Pin”來自hadolint的錯(cuò)誤碼描述狀態(tài)。固定版本號(hào)可以強(qiáng)制構(gòu)建時(shí)安裝特定版本的包,不論緩存中是什么。這個(gè)技巧可以減少依賴包意料之外的改變導(dǎo)致的構(gòu)建錯(cuò)誤。

?

最后的一點(diǎn)想法

?

在本文中,我們談了很多內(nèi)容,覆蓋了從安全到Docker鏡像流水線的方方面面。

?

有許多技巧可以讓Docker鏡像更好、更安全。希望這篇文章可以給你帶來一些啟發(fā),幫助你理解應(yīng)該做什么、不應(yīng)該做什么,并為你提供一些在構(gòu)建內(nèi)部或外部Docker容器鏡像時(shí)可以應(yīng)用的方案。

??

原文鏈接:

https://medium.com/better-programming/docker-best-practices-and-anti-patterns-e7cbccba4f19

本文為CSDN翻譯文章,轉(zhuǎn)載請(qǐng)注明出處。?


推薦閱讀

  • 大促下的智能運(yùn)維挑戰(zhàn):阿里如何抗住“雙11貓晚”?

  • 20萬(wàn)個(gè)法人、百萬(wàn)條銀行賬戶信息,正在暗網(wǎng)兜售

  • 當(dāng)莎士比亞遇見Google Flax:教你用字符級(jí)語(yǔ)言模型和歸遞神經(jīng)網(wǎng)絡(luò)寫“莎士比亞”式句子

  • Hyperledger Fabric 和企業(yè)級(jí)以太坊,誰(shuí)才是企業(yè)首選?

  • 面試時(shí)遇到「看門狗」脖子上掛著「時(shí)間輪」,我就問你怕不怕?

  • 同期兩篇 Nature:運(yùn)行溫度高于 1K 的量子計(jì)算平臺(tái)問世!

  • GitHub 標(biāo)星 10,000+,Apache 頂級(jí)項(xiàng)目 ShardingSphere 的開源之路

    真香,朕在看了!

總結(jié)

以上是生活随笔為你收集整理的从安全到镜像流水线,Docker 最佳实践与反模式一览的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。