在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Docker提供的構建功能有哪些

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 作者:馬哥Linux運維 ? 2022-08-25 09:08 ? 次閱讀

Docker 提供了一些出色的構建時功能和基本映像,我們可以用它們來實現輕量、安全和高效的應用程序構建。

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

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

我們將使用這個簡單的 main.go 來演示本文的概念:


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

最少的層帶來效率最大化:最佳實踐

Docker 在 Dockerfile 文檔中一上來就強調:盡量減少層數是一個最佳實踐!這是一個重要的概念,必須從一開始就做好。

你很容易就能寫一個包含很多層的 Dockerfile——它的語法就有這個傾向——結果你不知不覺中就會寫出很多效率低下的內容。

最佳實踐是將構建的相關階段分組和鏈接在一起,例如下載依賴項、供應商文件夾集成或使用 RUN 命令設置構建環境等階段。

你還需要考慮分組的哪些部分是可以經常更改的,然后將它們分組到 Dockerfile 中盡可能低的層,同時把靜態構建依賴項、構建環境配置或應用程序資產放到 Dockerfile 中盡可能上層的位置上。

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

由于 Dockerfile 的每一層都是從下一層繼承的,因此構建緩存提供了一種很好的機制,可以幫助你跳過已構建或靜態的內容,然后轉到你需要構建和重新哈希的部分!

盡量縮短構建時間是很重要的,因為高效的 CI/CD 系統每天都會運行這些構建很多次。當團隊規模逐漸擴大后,這可能意味著大量的構建工作,可能會需要很多 Jenkins worker,有時甚至需要很長時間才能集成開發人員的代碼!

Docker 有一些構建緩存功能,它們可以顯著節省構建時間。等待構建的時間越短,意味著集成和自動化測試的速度也就越快,也能提升 CI/CD 流程的速度,讓你的流程足以和團隊規模相匹配。

盡可能為應用程序安排單獨的非 root 用戶也是很重要的。你只需要在 linux adduser 命令中使用 RUN 指令,然后在 Dockerfile 中使用 USER 指令就可以使用這個用戶來運行二進制文件了。

下面是使用這些最佳實踐構造的一個最精簡的 Dockerfile main.go 示例,它只有一個基本的 main 函數,沒有外部依賴項:

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"]

構建后,生成的映像大小為 378MB:


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

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

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

下一步:多階段

當需要在生產環境中運行應用程序時,我們需要讓容器的設計可以確保性能和安全性。我們還需要盡可能多的可移植性,以便輕松地移動容器,并使用 DockerSwarm 和 Kubernetes 之類的編排器對其進行大規模調度。

將映像推入和拉出注冊表所需的時間應盡量縮短。編寫用于生產的 Dockerfile 時,要記住的一個要點就是在最終運行時映像中實踐極簡主義。

如果運行的時候并不需要某樣東西,請不要把它放進去!

在開發環境中,有時需要一個“較重”的容器映像,也許是一個開發人員專屬的 Dockerfile,方便開發人員隨時扔進來一些工具,和容器一起進行調試等開發活動。也可能會附加或保留一兩個卷和活動容器交互。這些當然都是很常見的情況!

但是,隨著容器映像沿開發管線向上移動,一定要記得把這些東西都取出來。一條正規的安全軟件供應鏈會要求在管道中盡早構建最終映像,對映像簽名,并將經過正式簽名的映像推到生產環境的各個階段。

因此,你需要盡早在供應鏈中構建、驗證、集成和簽名這個最小化的映像;這是 Dockerfile 開發人員、QA 團隊和安全工程師必須熟悉的操作!換句話說,只構建一次,然后讓你的流程將生成的映像投入生產環境。

多階段構建是實現這一目標的一個好方法!多階段涉及的基本原理包括:調用一個臨時容器以簡化應用程序的構建,然后將構建的資產從這個空間復制到只有運行應用所需必要組件的容器映像中。拿之前的 Dockerfile 示例來說:

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"]

注意這個 Dockerfile 中的兩個 FROM 指令。我們將第一個標記為“builder”,使用它來構建應用程序。

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

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

$  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

這個映像的大小是 6.16MB。相比 378MB 來說,體積減少的效果很明顯!

最小化整個運行環境……從頭開始構建!

實際上,我們在精簡之路上還可以走得更遠。Golang 有很多有趣的特性,其中之一是你可以編譯為單個二進制文件,并且在大多數情況下,你可以使用某些特殊的構建時參數將所有相關的庫靜態編譯進這個二進制文件。

這樣我們就能構建一個最小化的 Docker 容器,并減少額外的運行時開銷,以實現我們所追求的出色性能、可移植性和安全性!

如果我們可以將 Golang 應用程序編譯為單個二進制文件,并將它靜態鏈接到依賴項上,就可以使用一個 0KB 容器來運行這個應用程序。這是 Docker 提供的一個特殊的基礎映像,稱為“scratch”。

在我們的 Docker 培訓課程中總會遇到一個問題:所有容器內部都裝有操作系統嗎?答案是否定的,就是因為有這種特殊類型!

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

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 行,FROM scratch 告訴 Docker 從頭開始,就像我們在上一個多階段示例中看到的那樣,但這次使用的是 0KB 臨時映像。第一個階段與之前類似,但這次我們在構建階段使用一些編譯時參數來指示 go 編譯器將運行時庫靜態鏈接到二進制文件本身:


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

在此示例中,最終的 Docker 映像只會包含這一個可執行文件,而無需使用容器操作系統。

$ 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 映像相比,這是一個巨大的進步!

那么這些真的有用嗎?

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

小結

我們用一個基本的 Dockerfile 舉例,然后一步步縮減最終映像的體積。通過這個簡單的練習,我們很容易看到在構建 Golang 應用程序時,有很多選擇可以在 Docker 構建中實踐極簡主義。

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

更復雜的應用程序和構建可能無法遵循和上面完全相同的設計模式,但是這些原理可以應用在大多數 Golang Dockerfile 上!只需花一些時間來確保自己使用行業最佳實踐正確構建 Dockerfile,就能成功地在容器中構建快速、安全和可擴展的應用程序!

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 應用程序
    +關注

    關注

    38

    文章

    3296

    瀏覽量

    57946
  • 編譯
    +關注

    關注

    0

    文章

    662

    瀏覽量

    33067
  • Docker
    +關注

    關注

    0

    文章

    492

    瀏覽量

    11979

原文標題:如何構建 Golang Dockerfiles?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    docker核心概念

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

    怎么構建docker鏡像倉庫軟件

    Docker Registry】用docker registry 鏡像搭建私有測試倉庫
    發表于 08-13 11:03

    采用CentOS7的JDK Docker鏡像構建

    基于CentOS7構建JDK Docker鏡像
    發表于 04-02 11:25

    構建ARM64版本nacos docker鏡像

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

    如何使用AirGradient構建功能強大的PM2.5細塵傳感器

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

    介紹一款非常方便的java領域docker鏡像構建工具

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

    庫是否有另一種選項來構建功能更全面的控件UI?

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

    docker容器中構建yocto imx-image時出錯怎么解決?

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

    一種具有輸出限壓功能的電荷泵的設計_范建功

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

    Docker:微容器的優勢與構建教程

    非必要的東西也打包進去,所以最后構建出來的鏡像就很龐大,直接導致我們的容器也變得很大。對于剛入門的Docker新手來說,大家一開始基本都是用的Docker官方鏡像倉庫里提供的基礎鏡像,
    發表于 10-10 11:32 ?0次下載

    passenger-docker Docker基礎鏡像提供工具

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

    如何使用AirGradient構建功能強大的PM2.5細塵傳感器

    電子發燒友網站提供《如何使用AirGradient構建功能強大的PM2.5細塵傳感器.zip》資料免費下載
    發表于 07-01 15:42 ?0次下載
    如何使用AirGradient<b class='flag-5'>構建功能</b>強大的PM2.5細塵傳感器

    Dockerfile定義Docker鏡像的構建過程

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

    手動構建Docker鏡像的方法

    不推薦使用docker commit命令,而應該使用更靈活、更強大的dockerfile來構建docker鏡像。
    的頭像 發表于 08-05 15:30 ?592次閱讀
    手動<b class='flag-5'>構建</b><b class='flag-5'>Docker</b>鏡像的方法

    Docker運行環境安裝

    作者:京東科技 林中 Docker是一個開放的平臺,用于開發、發布和運行應用程序。Docker分離了應用程序和運行應用的基礎設施,從而實現了軟件的快速交付。利用docker提供的一系列
    的頭像 發表于 10-29 11:28 ?292次閱讀
    主站蜘蛛池模板: 欧美天天视频 | 人人爱天天操 | 性欧美在线| 国产精品四虎在线观看免费 | 午夜在线亚洲男人午在线 | 日韩欧美亚洲一区 | 中文字幕成人乱码在线电影 | 色婷婷激婷婷深爱五月老司机 | 天堂bt在线 | 色综合天天综合网看在线影院 | 天天se天天cao综合网蜜芽 | 亚洲jjzzjjzz在线观看 | 亚洲国产精品热久久2022 | 国产老头和美女在线观看 | 在线观看国产久青草 | 在线免费看高清视频大全 | 欧美日韩国产一区二区三区不卡 | 禁漫羞羞a漫入口 | 永久黄网站色视频免费 | 色女人天堂 | 最近2018年中文字幕大全一 | 黄网站色视频免费观看 | www毛片| 日本精品卡一卡2卡3卡四卡三卡 | 中文字幕一区二区三区在线观看 | 天天操天天操天天 | 男人的天堂一区二区视频在线观看 | 日本久操 | 毛片视频网址 | 国产精品好好热在线观看 | 成人国产亚洲欧美成人综合网 | 国产精品午夜久久 | 欧美一区二区三区影院 | 五月情网 | 中文字幕在线播放不卡 | 日本高清一本视频 | 国产又色| 视频在线观看免费网站 | 全日本爽视频在线 | 国产香港三级理论在线 | 亚洲 欧美 自拍 另类 |