docker-compose下載慢_編寫Docker Compose時要注意的五大常見錯誤

859e365e5c9df5cdef51c4777e581699.gif

508b88313d753a19b5431bc87c5f5ae2.png

在構建容器化的應用時,開發人員往往需要某種方法來引導啟動目標容器,以對其進行代碼級別的測試。盡管業界有許多方法可以實現該目的,但Docker Compose是目前最受歡迎的一種方法。它能夠讓如下兩個方面變得容易實現:
  • 指定在開發過程中需要啟動的容器。
  • 設置一套快速的代碼測試調試(code-test-debug),以方便開發循環。
通常情況下,團隊事先編寫一個docker-compose.yml文件,指定開發所需的所有內容,并將其提交給存儲庫。然后,每個開發人員只需運行docker-compose up,即可啟動測試其代碼所需的所有容器。不過,要讓docker-compose的設置能夠達到最佳性能狀態,例如:在不到一分鐘之內啟動開發環境,并且在幾秒鐘內完成對每個更改的測試,這些都需要團隊花費大量的工作。在這些準備過程中,由于各個開發人員每天花費在測試其代碼上的時間各不相同,而且任何細微的改動,都可能會對整個開發團隊的生產力產生巨大的影響。因此,我們有必要在此討論他們在編寫Docker Compose時常見的五大錯誤,及其對應的解決方法。

錯誤1:頻繁地進行容器重建

Docker的構建往往比較耗時,特別是每次針對代碼的變更開展測試的時候。如果能夠節省此方面的時間,那么對于加快開發周期來說是十分有益的。過去,對于非容器化的應用,我們通常會采取如下傳統的工作流程:
  • 編寫代碼
  • 構建
  • 運行
多年來,業界持續優化該流程,并提出了諸如:針對編譯語言的增量構建和熱重載(hot reloading)等實用技巧。隨著容器技術的出現,我們在現有的工作流程中增加了docker構建的步驟,如下圖所示。
  • 編寫代碼
  • 構建
  • Docker構建
  • 運行
當然,如果構建得不好,那么docker構建步驟也可能會帶來額外的時間開銷。例如:使用apt-get進行依賴項的重載步驟。有時候,這些步驟可能會讓整個測試過程比添加Docker之前還要慢。解決方案:在Docker外部運行代碼第一種解決方法是在Docker Compose中啟動所有的依賴項,然后在本地運行測試代碼。此舉模仿了非容器化應用開發的工作流程。您只需向localhost公布依賴關系,然后將正在使用的服務指向所有的localhost:地址即可。但是,該方法并非永遠可行,如果您正在使用的是代碼依賴容器鏡像中的內置元素時,那么用戶電腦就不一定能夠訪問到具體內容。解決方案:最大化緩存,以優化Dockerfile如果必須構建Docker鏡像,那么我們可以編寫Dockerfile,通過最大化緩存,將Docker的構建時間從原來的10分鐘壓縮至1分鐘。在生產環境中,Dockerfile的典型模式是通過將單個命令鏈接到一條RUN語句中,來減少層級的數量。畢竟,在開發過程中鏡像的大小并不重要,重要的是層級的數量。下面展示的是在生產環境中的一個Dockerfile文件:
RUN \ 
go get -d -v \
&& go install -v \
&& go build
不過,該命令在每次被重新運行時,Docker都會重新下載所有的依賴項,并重新安裝它們。我們可以通過增量構建(incremental build)來提供效率。同時,您可以將開發專用的Dockerfile其分成幾個短小的步驟,從而使得那些經常更改的代碼步驟被排到最后,而將鮮少更改的步驟(例如拉式依賴關系)被放在首位。因此,在重建Dockerfile時,您不必構建整個項目,而只需構建那些被已更改的少量末尾塊即可。有關此方面的案例,您可以參閱以下用于Blimp(請參見--https://kelda.io/blimp)開發的Dockerfile。通過遵循上述方法,您可以將繁瑣的構建過程縮減到了幾秒鐘之內完成。
FROM golang:1.13-alpine as builder 
RUN apk add busybox-static
WORKDIR /go/src/github.com/kelda-inc/blimp
ADD ./go.mod ./go.mod
ADD ./go.sum ./go.sum
ADD ./pkg ./pkg
ARG COMPILE_FLAGS
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./pkg/...
ADD ./login-proxy ./login-proxy
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./login-proxy/...
ADD ./registry ./registry
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./registry/...
ADD ./sandbox ./sandbox
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./sandbox/...
ADD ./cluster-controller ./cluster-controller
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./cluster-controller/...
RUN mkdir /gobin
RUN cp /go/bin/cluster-controller /gobin/blimp-cluster-controller
RUN cp /go/bin/syncthing /gobin/blimp-syncthing
RUN cp /go/bin/init /gobin/blimp-init
RUN cp /go/bin/sbctl /gobin/blimp-sbctl
RUN cp /go/bin/registry /gobin/blimp-auth
RUN cp /go/bin/vcp /gobin/blimp-vcp
RUN cp /go/bin/login-proxy /gobin/login-proxy
FROM alpine
COPY --from=builder /bin/busybox.static /bin/busybox.static
COPY --from=builder /gobin/* /bin/
最后值得一提的是:隨著多階段構建(multi-stage builds,請參見--https://docs.docker.com/develop/develop-images/multistmuage-build/)的引入,我們如今可以創建各種具有良好分層和較小鏡像的Dockerfile。不過,我們在此并不會展開詳細的討論。解決方案:使用主機卷(host volumes)大多數語言都會提供一種方法來監視程序代碼,并在代碼發生更改時自動重新運行。例如,nodemon就是JavaScript語言的一種Node自動重啟工具(請參見--https://www.npmjs.com/package/nodemon)。由于主機卷可以將您電腦上的目錄,鏡像到正在運行的容器之中,因此您在使用文本編輯器來編輯文件時,各種更改將會被自動同步到容器中,并在容器內被立即執行。最初,您可能需要花點時間進行前期準備,之后在Docker中,您可以在1-2秒內馬上看到代碼的更改結果。因此,我們會選擇使用主機卷將代碼直接掛載到容器中,以便以原生的方式,在包含其了運行時依賴項的Docker容器中運行自己的代碼。

錯誤2:緩慢的主機卷

如果您使用過主機卷,那么是否已經注意到:在Windows和Mac上讀寫文件的速度可能會非常緩慢?其實,對于諸如Node.js和具有復雜依賴性的PHP應用程序之類,需要讀寫大量文件的命令而言,這是一個已知的問題。其背后的原因是:Docker主要運行在Windows和Mac上的VM中。而我們在進行主機卷的掛載時,它必須經過大量的轉換,才能使文件夾進入容器,這有點類似于網絡文件系統。而此類額外的開銷,在Linux本地運行Docker時,則不會出現。解決方案:放寬強一致性該問題的一個關鍵原因是:文件系統在默認掛載時,需要保持強一致性。也就是說:所有特定文件的讀寫進程都必須統一對于文件修改的順序,以便讓文件的內容達成最終的一致。可是,強一致性的代價非常昂貴,它需要所有文件的寫入進程之間持續保持協調,以確保它們不會干擾或破壞彼此的更改。雖然在生產環境中的數據庫需要保持強一致性。但是在開發過程中,由于寫入進程就是代碼文件本身,目標就是我們的存儲庫,因此強一致性就不那么必需了。那么,我們就可以考慮Docker在掛載卷時,放寬強一致性。例如:在Docker Compose中,我們可以簡單地將此cached關鍵字添加到卷掛載中,以獲得顯著的性能保證。對應的代碼如下:
volumes: 
- "./app:/usr/src/app/app:cached"
注意:此舉僅適合開發環境,不適合生產環境。解決方案:代碼同步另一種處置方法是設置代碼的同步。您可以使用工具偵測主機和容器之間的變化,通過復制文件來解決差異(類似于rsync),而不是掛載卷。Docker在最新的版本中內置了用來替代卷的緩存模式--Mutagen(請參見--https://mutagen.io/)。此外,上文提到的Blimp則使用Syncthing(請參見--https://http//syncthing.net/)實現了類似的功能。解決方案:不要掛載軟件包Node之類的語言通常會把大部分文件操作放在packages目錄中(如node_modules)。那么,我們可以試著從卷中去除此類目錄,以顯著提高性能。下列示例是一個將代碼掛載到容器中的專屬卷,它覆蓋了node_modules目錄。
volumes:  
- ".:/usr/src/app"
- "/usr/src/app/node_modules"
該掛載操作會告訴Docker去使用node_modules目錄下的標準卷,以使得在npm install運行時,不再使用慢速的主機掛載方式。為了使該工作能夠正常進行,我們應該在容器首次啟動時,在entrypoint中執行npm install,以安裝依賴項,并更新node_modules目錄。具體代碼如下:
entrypoint: 
- "sh"
- "-c"
- "npm install && ./node_modules/.bin/nodemon server.js"
如果您想查看并運行上述完整的示例,請參考--https://kelda.io/blimp/docs/examples/#nodejs。

錯誤3:脆弱的配置

如果您曾深入研究過代碼,您可能會發現Docker Compose中也充斥著各種大量復制和粘貼而來的代碼。顯然,我們需要干凈整潔的Docker Compose文件,以方便輕松地按需做出修改。解決方案:使用各種env文件Env文件能夠將環境變量與Docker Compose主配置分開,以實現:
  • 避免將代碼泄露到git的歷史記錄中。
  • 開發人員都能按需自定義設置。例如,每個開發人員都可以持有一個唯一的訪問密鑰。他們通過將配置保存在.env文件中,以實現不必修改已提交的docker-compose.yml文件,也不必在文件更新時處理各種沖突問題。
如果您想使用環境文件,只需添加一個.env文件,或設置帶有env_file字段的顯式路徑即可(請參見--https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option)。

解決方案:使用替代文件

替換文件(請參見--https://docs.docker.com/compose/extends/)可以方便您在具有基本配置的基礎上,在其他文件中指定各項修改。該功能非常適合Docker Swarm及其YAML文件。您可以將生產環境的配置存儲在docker-compose.yml中,然后在替代文件中,指定開發所需的任何修改(例如:使用主機卷)。解決方案:使用extends如果您使用的是Docker Compose v2,那么就可以使用extends關鍵字,在多個位置導入YAML片段。例如,您可能會定義:公司里所有的服務都需要在開發的Docker Compose文件中帶有某五個特定的配置。然后您可以使用extends關鍵字將其放置到任何需要的地方,以實現模塊化。當然,如果僅在YAML中執行此項操作可能比較繁瑣,我們完全可以通過編程來實現。雖然Compose v3刪除了對于extends關鍵字的支持。但是,您仍然可以使用YAML anchors(請參見--https://support.atlassian.com/bitbucket-cloud/docs/yaml-anchors/)來實現類似的結果。

錯誤4:亂序啟動(Flaky Boots)

如果docker-compose出現了崩潰,我們能夠僅使用docker-compose restart來重啟服務嗎?其實此類問題主要與服務錯誤的啟動順序有關。例如,您的Web應用可能依賴于數據庫,那么在Web應用啟動時,如果數據庫尚未準備就緒,就會出現崩潰。解決方案:使用depends_ondepends_on使您可以控制啟動的順序。默認情況下,depends_on僅判斷依賴項是否已經創建,而不會判斷依賴項是否“健康”。雖然Docker Compose v2能夠支持將depends_on與運行狀況的檢查相結合。不過,該功能也在Docker Compose v3中被去除了。當然,您可以使用諸如wait-for-it.sh之類的腳本,來手動實現類似的功能。和上面提到的放寬強一致性相同,雖然Docker文檔不建議在生產環境中使用depends_on和wait-for-it.sh,來為容器指定特定的啟動順序。但是對于開發而言,我們完全可以用到depends_on。

錯誤5:資源管理不善

如果您碰到開發流程受阻,Docker無法全速運行,或是無法平穩地獲取運行所需的資源,那么您可以考慮以下幾個方面:解決方案:更改Docker Desktop的分配Docker Desktop需要大量的RAM和CPU,尤其是在Mac和Windows的VM上。Docker Desktop的默認配置往往不會分配足夠的RAM和CPU,因此我們通常需要調整相關的設置。在開發時,我經驗是:為Docker分配大約8GB的RAM和4個CPU,并且在不使用Docker Desktop時,及時關閉之。解決方案:刪除未使用的資源人們在使用Docker時經常會出現數百個卷與舊的容器鏡像。這在無形中浪費了各種資源。為了釋放這些資源,我們建議通過間或運行docker system prune的方式,以刪除當前未使用到的所有卷、容器和網絡。

總結

總的說來,為了改善開發人員在使用Docker Compose時的體驗,我建議您做到如下五點:
  • 最小化容器的重建。
  • 使用主機卷。
  • 像對待代碼那樣,認真配置文件,以便于維護。
  • 讓啟動更加可靠。
  • 認真分配管理資源。
此外,您還可以通過鏈接--https://kelda.io/blog/docker-volumes-for-development/,以獲悉如何設置主機卷,并加快Docker開發。

Java幫幫

非盈利學習社區

官網:www.javahelp.com.cn

27387fe793450b273dd087b5a3c57137.png

職涯寶

幫助職業者成功

分享優質內容

官網:zhiya360.com

0d9e8da5d2eeb33afe0f2674f4dafd3d.png

九點編程

深夜學習,未來可期

c952be1c148f7e588fe4ba93ea89d87f.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457804.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端測試利器--Browser-Sync啟動命令

使用browser-sync啟動命令cmd切換到項目的根目錄下**1.browser-sync start --server --files "css/*.css"----------**使用兩個*檢測所有的目錄**轉載于:https://blog.51cto.com/1888512/1862054

VMware實現Android x86 8.1 從安裝到使用

VMware實現Android x86 8.1 從安裝到使用 虛擬機--Android 安裝 Android系統配置 安裝軟件 個性化設計 托坑指南 一些終端模擬器的指令 虛擬機–Android 發現現在安卓虛擬機已經到了8.1,我就試試能不能安裝并正常使用。由于版本過新,網上也沒有一些系統的…

frame越過另一個frame_擁抱swoole(三)之用php實現一個混合服務器

混合服務器,就是可以同時支持http,websocket,tcp等的服務器,用swoole就是這么簡單,分分鐘,就可以愉快地搞物聯網開發了,啥都支持,我采用官方的例子,創建一個混合服務器&a…

Hibernate學習系列————注解一對多單向實例

2019獨角獸企業重金招聘Python工程師標準>>> 開發環境:MysqlEclipse 一對多單向的列子原理:一個班級,多個學生,學生端為多的一端,他們擁有一個外鍵指向相同的班級。 項目結構 需要的jar包 hibernate.cfg.xm…

Spring學習筆記--自動裝配Bean屬性

Spring提供了四種類型的自動裝配策略: byName – 把與Bean的屬性具有相同名字(或者ID)的其他Bean自動裝配到Bean的對應屬性中。byType – 把與Bean的屬性具有相同類型的其他Bean自動裝配到Bean的對應屬性中。constructor – 把與Bean的構造器入參具有相同類型的其他…

sudo apt-get nmap 報錯鎖占用

在Ubuntu中用apt-get命令安裝軟件是出現如下錯誤: 網上搜了一下原因,說是有另外一個程序在運行,導致鎖不可用,原因可能是賞析運行更新或安裝沒有正常完成。這是因為上次更新或者安裝沒有正常完成。 網上的兩種解決方法&#xff1…

python逐行讀取txt寫入excel_用python從符合一定格式的txt文檔中逐行讀取數據并按一定規則寫入excel(openpyxl支持Excel 2007 .xlsx格式)...

前幾天接到一個任務,從gerrit上通過ssh命令獲取一些commit相關的數據到文本文檔中,隨后將這些數據存入Excel中。數據格式如下圖所示觀察上圖可知,存在文本文檔中的數據符合一定的格式,通過python讀取、正則表達式處理并寫入Excel文…

筋斗云newcloud錯誤碼列表

響應碼信息備注440Ip Error客戶送IP錯誤441Callee Number Error被叫號碼位數錯誤(標準11位正確,錯誤加前綴0,或其他前綴)442Called Operator Error被叫運營商錯誤(支持移動,不支持聯通電信)443N…

Extjs 之 initComponent 和 constructor的區別(轉)

在創建自定義類時,先構造(constructor)后初始化(initComponent)。如:(在舊的Extjs 版本中使用 Ext.extend 實現擴展) Ext.define(Btn,{ extend:Ext.button.Button, init…

hive遍歷_從Hive中的stored as file_foramt看hive調優

一、行式數據庫和列式數據庫的對比1、存儲比較行式數據庫存儲在hdfs上式按行進行存儲的,一個block存儲一或多行數據。而列式數據庫在hdfs上則是按照列進行存儲,一個block可能有一列或多列數據。2、壓縮比較對于行式數據庫,必然按行壓縮&#…

oracle sql語句 從指定條數查詢

現有表A 查詢從第10行之后的數據 select a from ( select a, rownum r from A ) where r > 10 order by r; 實際工作中例子 select account,acct_name from ( select account, acct_name, rownum r from pmctl_nonsleep_acct ) where r > 10 order by

幫助孩子學會感恩_頁數204_出版日期2015.03_完整版PDF電子書下載

幫助孩子學會感恩_頁數204_出版日期2015.03_完整版PDF電子書下載 帶索引書簽目錄高清版_13813212 下載鏈接http://pan.baidu.com/s/1geEmUeZ 【作 者】(英)蒂姆惠特尼(TimWhitney)著【叢書名】陪孩子成長系列叢書【形態項】 204 …

xwpftablecell設置字體樣式_HTML的文字樣式

font 屬性可以用來作為 font-style, font-variant, font-weight, font-size, line-height 和 font-family 屬性的簡寫,或將元素的字體設置為系統字體。字體修改font-family 屬性:設置HTML頁面中的字體font-size 屬性:設置字體大小font-weight…

將中文標點符號替換成英文標點符號

/// 轉全角的函數(SBC case) /// ///任意字符串 /// 全角字符串 /// ///全角空格為12288,半角空格為32 ///其他字符半角(33-126)與全角(65281-65374)的對應關系是:均相差65248 ///public string ToSBC(string input) { //半角轉全角:char[] cinput.ToCh…

Centos6.5升級GCC

由于CentOS自帶的gcc實在是老掉牙了,所以決定升級一下gcc,下面介紹如何進行源碼編譯,升級gcc。 從GNU網站下載你想要的gcc版本,鏈接:ftp://ftp.gnu.org/gnu/gcc/,選擇合適的gcc版本,然后下載&am…

oracle sql語句 exists

exists 這個關鍵字只是個查詢條件 用來判斷后面跟的查詢語句是否查找到記錄 查找到為真 反之為假 例子 select * from ammst_corp a where account 999999999999999999 and exists ( select 1 from pmrgt_unit where unit_code a.open_unit ) 查找 9999999999999999…

python金字塔_高斯金字塔與拉普拉斯金字塔的原理與python構建

高斯金字塔和拉普拉斯金字塔【1】在圖像相關領域應用廣泛,尤其是圖像融合和圖像分割方面。本文從理論和opencv實現兩個方面對兩種金字塔進行了介紹,并給出了二者的視覺效果。1、高斯金字塔在計算機視覺與圖像處理相關任務中,經常需要使用同一…

mongodb在32位機的連接

Windows 32bit版本安裝Mongodb時,會發生的下面問題 2016-05-09T00:09:45.1240800 I STORAGE [initandlisten] exception in initAndListen: 28663 Cannot start server. The default storage engine wiredTiger is not available with this build of mongod. Pleas…

oracle sql 語句 start with ...... connect by prior .......

這個查詢條件可以理解為遞歸查詢 select up_unit_code from pmctl_nuit START WITH unit_code 1188899Q CONNECT BY PRIOR up_unit_code unit_code 語句理解: 首先根據條件 START WITH unit_code 查詢到 up_unit_code 顯示 然后 CONNECT BY P…

cnetos7安裝zabbix3.0.3安裝手冊

親測可用呀。學習好幾天 最好用的文檔詳見附件http://down.51cto.com/data/2251232轉載于:https://blog.51cto.com/11802086/1863554