女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker提供的構(gòu)建功能有哪些

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-08-25 09:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Docker 提供了一些出色的構(gòu)建時(shí)功能和基本映像,我們可以用它們來(lái)實(shí)現(xiàn)輕量、安全和高效的應(yīng)用程序構(gòu)建。

本文會(huì)介紹為什么 Golang 可以很好地展示這些特性,因?yàn)?Golang 可以編譯為單個(gè)二進(jìn)制文件(或一組二進(jìn)制文件)。

這篇文章的示例所關(guān)注的焦點(diǎn)是極簡(jiǎn)主義。盡管這些示例很基礎(chǔ),但它們非常重要,你可以在這些概念基礎(chǔ)上為大型 Golang 項(xiàng)目引入更多最佳實(shí)踐,以提高安全性和效率。

我們將使用這個(gè)簡(jiǎn)單的 main.go 來(lái)演示本文的概念:


package main import "fmt" func main() {  fmt.Println("Hello Cloudreach!") }

最少的層帶來(lái)效率最大化:最佳實(shí)踐

Docker 在 Dockerfile 文檔中一上來(lái)就強(qiáng)調(diào):盡量減少層數(shù)是一個(gè)最佳實(shí)踐!這是一個(gè)重要的概念,必須從一開始就做好。

你很容易就能寫一個(gè)包含很多層的 Dockerfile——它的語(yǔ)法就有這個(gè)傾向——結(jié)果你不知不覺中就會(huì)寫出很多效率低下的內(nèi)容。

最佳實(shí)踐是將構(gòu)建的相關(guān)階段分組和鏈接在一起,例如下載依賴項(xiàng)、供應(yīng)商文件夾集成或使用 RUN 命令設(shè)置構(gòu)建環(huán)境等階段。

你還需要考慮分組的哪些部分是可以經(jīng)常更改的,然后將它們分組到 Dockerfile 中盡可能低的層,同時(shí)把靜態(tài)構(gòu)建依賴項(xiàng)、構(gòu)建環(huán)境配置或應(yīng)用程序資產(chǎn)放到 Dockerfile 中盡可能上層的位置上。

每一層,更具體地說(shuō)是 Dockerfile 中以指令開頭的每一行,都經(jīng)過(guò)哈希處理并建立在另一層之上,最后一個(gè)映像由“堆疊(stacked)”層構(gòu)成。

由于 Dockerfile 的每一層都是從下一層繼承的,因此構(gòu)建緩存提供了一種很好的機(jī)制,可以幫助你跳過(guò)已構(gòu)建或靜態(tài)的內(nèi)容,然后轉(zhuǎn)到你需要構(gòu)建和重新哈希的部分!

盡量縮短構(gòu)建時(shí)間是很重要的,因?yàn)楦咝У?CI/CD 系統(tǒng)每天都會(huì)運(yùn)行這些構(gòu)建很多次。當(dāng)團(tuán)隊(duì)規(guī)模逐漸擴(kuò)大后,這可能意味著大量的構(gòu)建工作,可能會(huì)需要很多 Jenkins worker,有時(shí)甚至需要很長(zhǎng)時(shí)間才能集成開發(fā)人員的代碼!

Docker 有一些構(gòu)建緩存功能,它們可以顯著節(jié)省構(gòu)建時(shí)間。等待構(gòu)建的時(shí)間越短,意味著集成和自動(dòng)化測(cè)試的速度也就越快,也能提升 CI/CD 流程的速度,讓你的流程足以和團(tuán)隊(duì)規(guī)模相匹配。

盡可能為應(yīng)用程序安排單獨(dú)的非 root 用戶也是很重要的。你只需要在 linux adduser 命令中使用 RUN 指令,然后在 Dockerfile 中使用 USER 指令就可以使用這個(gè)用戶來(lái)運(yùn)行二進(jìn)制文件了。

下面是使用這些最佳實(shí)踐構(gòu)造的一個(gè)最精簡(jiǎn)的 Dockerfile main.go 示例,它只有一個(gè)基本的 main 函數(shù),沒有外部依賴項(xiàng):

FROM golang:alpine RUN mkdir /app  ADD . /app/ WORKDIR /app  RUN go build -o main . RUN adduser -S -D -H -h /app appuser USER appuser CMD ["./main"]

構(gòu)建后,生成的映像大小為 378MB:


$  docker build -t hellocloudreachmain:1.0 . -f Dockerfile.single... (build output omitted)$  docker images | grep hellocloudreachmainhellocloudreachmain1.0d1c5090585bcLessthanasecondago378MB

盡可能使用基于 Alpine 的官方映像!它是基于 busybox 和 musl 構(gòu)建的,最輕量級(jí)的 Linux 發(fā)行版之一。與較重的發(fā)行版相比,它的容器映像體積很小,這是一個(gè)輕松提升效率的好方法。

但我們還可以進(jìn)一步簡(jiǎn)化!這些官方映像構(gòu)建(比如golang:alpine)都包含很多層,里面含一些安全組件,用來(lái)構(gòu)建應(yīng)用程序資產(chǎn)時(shí)很方便;但是如果我們的應(yīng)用程序不需要這些層,那就不要把它們放進(jìn)去!我們需要使用其他一些 Docker 構(gòu)建功能,進(jìn)一步縮小文件體積。

下一步:多階段

當(dāng)需要在生產(chǎn)環(huán)境中運(yùn)行應(yīng)用程序時(shí),我們需要讓容器的設(shè)計(jì)可以確保性能和安全性。我們還需要盡可能多的可移植性,以便輕松地移動(dòng)容器,并使用 DockerSwarm 和 Kubernetes 之類的編排器對(duì)其進(jìn)行大規(guī)模調(diào)度。

將映像推入和拉出注冊(cè)表所需的時(shí)間應(yīng)盡量縮短。編寫用于生產(chǎn)的 Dockerfile 時(shí),要記住的一個(gè)要點(diǎn)就是在最終運(yùn)行時(shí)映像中實(shí)踐極簡(jiǎn)主義。

如果運(yùn)行的時(shí)候并不需要某樣?xùn)|西,請(qǐng)不要把它放進(jìn)去!

在開發(fā)環(huán)境中,有時(shí)需要一個(gè)“較重”的容器映像,也許是一個(gè)開發(fā)人員專屬的 Dockerfile,方便開發(fā)人員隨時(shí)扔進(jìn)來(lái)一些工具,和容器一起進(jìn)行調(diào)試等開發(fā)活動(dòng)。也可能會(huì)附加或保留一兩個(gè)卷和活動(dòng)容器交互。這些當(dāng)然都是很常見的情況!

但是,隨著容器映像沿開發(fā)管線向上移動(dòng),一定要記得把這些東西都取出來(lái)。一條正規(guī)的安全軟件供應(yīng)鏈會(huì)要求在管道中盡早構(gòu)建最終映像,對(duì)映像簽名,并將經(jīng)過(guò)正式簽名的映像推到生產(chǎn)環(huán)境的各個(gè)階段。

因此,你需要盡早在供應(yīng)鏈中構(gòu)建、驗(yàn)證、集成和簽名這個(gè)最小化的映像;這是 Dockerfile 開發(fā)人員、QA 團(tuán)隊(duì)和安全工程師必須熟悉的操作!換句話說(shuō),只構(gòu)建一次,然后讓你的流程將生成的映像投入生產(chǎn)環(huán)境。

多階段構(gòu)建是實(shí)現(xiàn)這一目標(biāo)的一個(gè)好方法!多階段涉及的基本原理包括:調(diào)用一個(gè)臨時(shí)容器以簡(jiǎn)化應(yīng)用程序的構(gòu)建,然后將構(gòu)建的資產(chǎn)從這個(gè)空間復(fù)制到只有運(yùn)行應(yīng)用所需必要組件的容器映像中。拿之前的 Dockerfile 示例來(lái)說(shuō):

FROM golang:alpine as builder RUN mkdir /build  ADD . /build/ WORKDIR /build  RUN go build -o main . FROM alpine RUN adduser -S -D -H -h /app appuser USER appuser COPY --from=builder /build/main /app/ WORKDIR /app CMD ["./main"]

注意這個(gè) Dockerfile 中的兩個(gè) FROM 指令。我們將第一個(gè)標(biāo)記為“builder”,使用它來(lái)構(gòu)建應(yīng)用程序。

然后,我們使用第二個(gè) FROM,這一次是從基本的“alpine”(非常輕巧!)中提取的,并將我們構(gòu)建的可執(zhí)行文件從該環(huán)境復(fù)制到該新環(huán)境。

這就讓映像的體積比以前小了很多!另外,“builder”容器被緩存在 docker builder 上下文中,因此可以像前面的示例一樣利用構(gòu)建緩存來(lái)提升速度!

$  docker build -t hellocloudreachmain:1.1 . -f Dockerfile.multi... (build output omitted)$  docker images | grep hellocloudreachmainhellocloudreachmain                1.0 d1c5090585bc  8 minutes ago 378MBhellocloudreachmain                1.1 ea737df5cc64 Less than a second ago    6.16MB

這個(gè)映像的大小是 6.16MB。相比 378MB 來(lái)說(shuō),體積減少的效果很明顯!

最小化整個(gè)運(yùn)行環(huán)境……從頭開始構(gòu)建!

實(shí)際上,我們?cè)诰?jiǎn)之路上還可以走得更遠(yuǎn)。Golang 有很多有趣的特性,其中之一是你可以編譯為單個(gè)二進(jìn)制文件,并且在大多數(shù)情況下,你可以使用某些特殊的構(gòu)建時(shí)參數(shù)將所有相關(guān)的庫(kù)靜態(tài)編譯進(jìn)這個(gè)二進(jìn)制文件。

這樣我們就能構(gòu)建一個(gè)最小化的 Docker 容器,并減少額外的運(yùn)行時(shí)開銷,以實(shí)現(xiàn)我們所追求的出色性能、可移植性和安全性!

如果我們可以將 Golang 應(yīng)用程序編譯為單個(gè)二進(jìn)制文件,并將它靜態(tài)鏈接到依賴項(xiàng)上,就可以使用一個(gè) 0KB 容器來(lái)運(yùn)行這個(gè)應(yīng)用程序。這是 Docker 提供的一個(gè)特殊的基礎(chǔ)映像,稱為“scratch”。

在我們的 Docker 培訓(xùn)課程中總會(huì)遇到一個(gè)問(wèn)題:所有容器內(nèi)部都裝有操作系統(tǒng)嗎?答案是否定的,就是因?yàn)橛羞@種特殊類型!

這個(gè)映像內(nèi)部沒有關(guān)聯(lián)受支持的操作系統(tǒng)環(huán)境。它有一些特殊要求,最重要的是,主機(jī)的架構(gòu)必須支持編譯好的二進(jìn)制文件的架構(gòu)(x86、x64 等),然后,你實(shí)際得到的容器除了隔離功能和 Docker 容器的那些優(yōu)秀特性外,不向應(yīng)用程序提供任何功能或支持!盡量使用 scratch 作為基礎(chǔ)映像,將為你的應(yīng)用程序容器提供極高的簡(jiǎn)約性和安全性水平。

FROM golang:alpine as builder RUN mkdir /build  ADD . /build/ WORKDIR /build  RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main . FROM scratch COPY --from=builder /build/main /app/ WORKDIR /app CMD ["./main"]

在第 6 行,F(xiàn)ROM scratch 告訴 Docker 從頭開始,就像我們?cè)谏弦粋€(gè)多階段示例中看到的那樣,但這次使用的是 0KB 臨時(shí)映像。第一個(gè)階段與之前類似,但這次我們?cè)跇?gòu)建階段使用一些編譯時(shí)參數(shù)來(lái)指示 go 編譯器將運(yùn)行時(shí)庫(kù)靜態(tài)鏈接到二進(jìn)制文件本身:


RUNCGO_ENABLED=0GOOS=linuxgobuild-a-installsuffixcgo-ldflags'-extldflags"-static"'-omain.

在此示例中,最終的 Docker 映像只會(huì)包含這一個(gè)可執(zhí)行文件,而無(wú)需使用容器操作系統(tǒng)。

$ docker build -t hellocloudreachmain:1.2 . -f Dockerfile.scratch ... (build output omitted) $ docker images | grep hellocloudreachmain hellocloudreachmain 1.0 d1c5090585bc 8 minutes ago 378MB hellocloudreachmain 1.1 ea737df5cc64 4 minutes ago 6.16MB hellocloudreachmain 1.2 bda5c99404ae 33 seconds ago 2.01MB

太棒了,生成的容器大小只有 2.01MB!與最初的 378MB 映像相比,這是一個(gè)巨大的進(jìn)步!

那么這些真的有用嗎?

$  docker run -it hellocloudreachmain:1.0 Hello Cloudreach! $  docker run -it hellocloudreachmain:1.1 Hello Cloudreach! $  docker run -it hellocloudreachmain:1.2 Hello Cloudreach!

小結(jié)

我們用一個(gè)基本的 Dockerfile 舉例,然后一步步縮減最終映像的體積。通過(guò)這個(gè)簡(jiǎn)單的練習(xí),我們很容易看到在構(gòu)建 Golang 應(yīng)用程序時(shí),有很多選擇可以在 Docker 構(gòu)建中實(shí)踐極簡(jiǎn)主義。

我們有很多辦法可以利用這種語(yǔ)言的特性,及其在編譯期間提供給開發(fā)人員的特性來(lái)減小容器的體積。由于 Golang 可以編譯為靜態(tài)鏈接的可執(zhí)行文件,因此我們能利用這類特性為運(yùn)行時(shí)剝離所有不必要的組件。

更復(fù)雜的應(yīng)用程序和構(gòu)建可能無(wú)法遵循和上面完全相同的設(shè)計(jì)模式,但是這些原理可以應(yīng)用在大多數(shù) Golang Dockerfile 上!只需花一些時(shí)間來(lái)確保自己使用行業(yè)最佳實(shí)踐正確構(gòu)建 Dockerfile,就能成功地在容器中構(gòu)建快速、安全和可擴(kuò)展的應(yīng)用程序!

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3329

    瀏覽量

    58883
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    676

    瀏覽量

    33874
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    515

    瀏覽量

    12860

原文標(biāo)題:如何構(gòu)建 Golang Dockerfiles?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    docker核心概念

    密度。企業(yè)利用 Docker 可以構(gòu)建敏捷的軟件交付管道,以更快的速度、更高的安全性和可靠的信譽(yù)為 Linux 和 Windows Server 應(yīng)用發(fā)布新功能
    發(fā)表于 07-15 07:29

    怎么構(gòu)建docker鏡像倉(cāng)庫(kù)軟件

    Docker Registry】用docker registry 鏡像搭建私有測(cè)試倉(cāng)庫(kù)
    發(fā)表于 08-13 11:03

    采用CentOS7的JDK Docker鏡像構(gòu)建

    基于CentOS7構(gòu)建JDK Docker鏡像
    發(fā)表于 04-02 11:25

    構(gòu)建ARM64版本nacos docker鏡像

    在適配過(guò)程中有大量合作伙伴用到nacos且采用容器化部署,dockerhub未提供官方鏡像,因此需要在鯤鵬服務(wù)器自定義構(gòu)建構(gòu)建前提:Docker已部署
    發(fā)表于 06-16 14:29

    如何使用AirGradient構(gòu)建功能強(qiáng)大的PM2.5細(xì)塵傳感器

    描述空氣梯度作為 AirGradient for Education 系列的一部分,本說(shuō)明教授如何使用 AirGradient 構(gòu)建功能強(qiáng)大的 PM2.5 細(xì)塵傳感器。傳感器將在顯示屏上顯示
    發(fā)表于 06-22 06:25

    介紹一款非常方便的java領(lǐng)域docker鏡像構(gòu)建工具

    前言本文主要介紹的是google開源的一個(gè)java領(lǐng)域的docker構(gòu)建工具jib.目前在github上的start有8.5k,fork有784,是一款非常方便的java領(lǐng)域docker構(gòu)建
    發(fā)表于 07-19 17:41

    庫(kù)是否有另一種選項(xiàng)來(lái)構(gòu)建功能更全面的控件UI?

    一些我想要的功能,例如選項(xiàng)卡、下拉菜單等。庫(kù)是否有另一種選項(xiàng)來(lái)構(gòu)建功能更全面的控件 UI?我還想讓 UI 比現(xiàn)在更漂亮,但我不確定是否可行。雖然我有其他幾種類型的 ESP8266,但我很欣賞這不是一款
    發(fā)表于 02-23 06:55

    docker容器中構(gòu)建yocto imx-image時(shí)出錯(cuò)怎么解決?

    我正在嘗試根據(jù)規(guī)范 <>(修訂版 LF5.15.5_1.0.0 — 2022 年 3 月 31 日)中的第 3.1 章 Dockerdocker 容器中構(gòu)建
    發(fā)表于 06-08 09:30

    一種具有輸出限壓功能的電荷泵的設(shè)計(jì)_范建功

    一種具有輸出限壓功能的電荷泵的設(shè)計(jì)_范建功
    發(fā)表于 01-07 22:14 ?2次下載

    Docker:微容器的優(yōu)勢(shì)與構(gòu)建教程

    非必要的東西也打包進(jìn)去,所以最后構(gòu)建出來(lái)的鏡像就很龐大,直接導(dǎo)致我們的容器也變得很大。對(duì)于剛?cè)腴T的Docker新手來(lái)說(shuō),大家一開始基本都是用的Docker官方鏡像倉(cāng)庫(kù)里提供的基礎(chǔ)鏡像,
    發(fā)表于 10-10 11:32 ?0次下載

    passenger-docker Docker基礎(chǔ)鏡像提供工具

    ./oschina_soft/passenger-docker.zip
    發(fā)表于 05-13 10:35 ?1次下載
    passenger-<b class='flag-5'>docker</b> <b class='flag-5'>Docker</b>基礎(chǔ)鏡像<b class='flag-5'>提供</b>工具

    如何使用AirGradient構(gòu)建功能強(qiáng)大的PM2.5細(xì)塵傳感器

    電子發(fā)燒友網(wǎng)站提供《如何使用AirGradient構(gòu)建功能強(qiáng)大的PM2.5細(xì)塵傳感器.zip》資料免費(fèi)下載
    發(fā)表于 07-01 15:42 ?0次下載
    如何使用AirGradient<b class='flag-5'>構(gòu)建功能</b>強(qiáng)大的PM2.5細(xì)塵傳感器

    Dockerfile定義Docker鏡像的構(gòu)建過(guò)程

    了解Dockerfile Dockerfile 是一個(gè)文本文件,用于定義 Docker 鏡像的構(gòu)建過(guò)程。它以指令的形式描述了如何構(gòu)建鏡像,從基礎(chǔ)鏡像開始逐步添加配置、文件和依賴,最終形成我們所需
    的頭像 發(fā)表于 09-30 10:22 ?2883次閱讀

    手動(dòng)構(gòu)建Docker鏡像的方法

    不推薦使用docker commit命令,而應(yīng)該使用更靈活、更強(qiáng)大的dockerfile來(lái)構(gòu)建docker鏡像。
    的頭像 發(fā)表于 08-05 15:30 ?866次閱讀
    手動(dòng)<b class='flag-5'>構(gòu)建</b><b class='flag-5'>Docker</b>鏡像的方法

    Docker運(yùn)行環(huán)境安裝

    作者:京東科技 林中 Docker是一個(gè)開放的平臺(tái),用于開發(fā)、發(fā)布和運(yùn)行應(yīng)用程序。Docker分離了應(yīng)用程序和運(yùn)行應(yīng)用的基礎(chǔ)設(shè)施,從而實(shí)現(xiàn)了軟件的快速交付。利用docker提供的一系列
    的頭像 發(fā)表于 10-29 11:28 ?617次閱讀