小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

支持HTTP2的cURL——基于Alpine的最小化Docker鏡像

 wiborgite 2016-09-15


cURL(https://curl./)是我喜歡的開源軟件之一。雖然cURL的強大常常被認為是理所當(dāng)然的,但我真心地認為它值得感謝和尊重。如果我們的工具箱失去了curl,那些需要和網(wǎng)絡(luò)重度交互的人(我們大多數(shù)人都是這樣的)將會陷入到困境中。curl速度快、體積小,并且和大多數(shù)好工具一樣,簡潔干凈,盡量不影響用戶,只做它們需要做的事情。

如果有人想使用curl中的一種功能(比如UNIX套接字支持),而恰恰系統(tǒng)提供的包的配置不支持這種功能,或者包版本太老而不包含這種功能,由于curl享有“數(shù)據(jù)傳輸?shù)娜鹗寇姷丁钡拿雷u,可以想象這種情況是有可能發(fā)生的。因此你會發(fā)現(xiàn),你想要編譯一個包含你所需要的功能的curl。編譯自己的軟件是令人害怕的,尤其是當(dāng)你不擅長解決這類問題時,讓我們先暫時拋開這個事實,自定義你所使用的軟件將會是一次難以置信的、解放自身的體驗。

如果需要,你可以編譯自己的軟件,并且不受限于其它人交給你的軟件包,明確這一點將會給你帶來自信。突然間,你腦中可能會充斥著興奮的快感——你能夠按照你喜歡的方式安裝和配置任何軟件,并不需要接受其它人配置中的限制。人類常常喜歡給一樣?xùn)|西加上自己的標(biāo)記,這就是使用開源軟件的令人上癮的原因之一。

由于Docker文件系統(tǒng)的分離特性,它成為了完成這類事情最佳的選擇。你并不需要擔(dān)心安裝依賴庫或者運行一個糟糕的make install類似的命令,會將你的本地文件系統(tǒng)弄亂。它能夠讓你在真實的環(huán)境中進行操作,并且允許你犯錯。這對于學(xué)習(xí)知識是一個極佳的工具,因為將事情完全弄糟是學(xué)習(xí)的必經(jīng)之路,并且在容器中將事情弄糟,你能夠輕易地將這些容器丟棄,這種方式比弄糟自己的本地系統(tǒng)要安全多了。除此之外,如果你將這些步驟以腳本的形式寫入到Dockerfile中,那么在后續(xù)重新構(gòu)建時,構(gòu)建步驟將保持一致。盡管Dockerfile不能100%保證構(gòu)建的結(jié)果,但這總比README中的隨意描述好多了。

接下來讓我們一起構(gòu)建一個Dockerfile來創(chuàng)建一個支持HTTP2的、體積最小的、基于Alpine Linux的鏡像。重點將會放在減小鏡像體積和能夠100%自定義curl上。

方法步驟

我們將會:

  1. 討論為什么我們要關(guān)注HTTP2?

  2. 簡要地看一遍Dockerfile,讓你對構(gòu)建過程有初步了解。

  3. 討論為什么將Alpine作為基礎(chǔ)鏡像?

  4. 詳細解釋Dockerfile,一步一步地理解它。

  5. 構(gòu)建并且運行鏡像。

為什么選擇HTTP2?

引用自 https://http2./:

由于HTTP的危急現(xiàn)狀,HTTP/2成為了HTTP的代替品。HTTP/2并不是對HTTP協(xié)議的完全重寫,HTTP方法,狀態(tài)碼,語義都保留了下來,并且應(yīng)該能夠使用和HTTP/1.x(可能有細微調(diào)整)一樣的API來表示HTTP/2協(xié)議。

HTTP/2協(xié)議重點關(guān)注性能,尤其是端用戶的接收延遲、網(wǎng)絡(luò)和服務(wù)器資源的使用。其中一個主要的目標(biāo)就是從瀏覽器訪問一個Web網(wǎng)站可以只通過一條連接來實現(xiàn)。

簡要地說,HTTP2想要解決HTTP/1.1的一些缺點,包括性能問題(https://www./http2/)。通過對前面鏈接中的樣本用例進行測試,CloudFlare聲明HTTP/2對我的電腦會有4~8倍的速度提升。能夠提升網(wǎng)頁4~8倍的速度?是的,你沒有聽錯。

Dockerfile

這就是支持HTTP2的curl的Dockerfile

FROM alpine:edge # For nghttp2-dev, we need this respository. RUN echo https://dl-cdn./alpine/edge/testing >>/etc/apk/repositories  ENV CURL_VERSION 7.50.1 RUN apk add --update --no-cache openssl openssl-dev nghttp2-dev ca-certificates RUN apk add --update --no-cache --virtual curldeps g  make perl && wget https://curl./download/curl-$CURL_VERSION.tar.bz2 && tar xjvf curl-$CURL_VERSION.tar.bz2 && rm curl-$CURL_VERSION.tar.bz2 && cd curl-$CURL_VERSION && ./configure     --with-nghttp2=/usr     --prefix=/usr     --with-ssl     --enable-ipv6     --enable-unix-sockets     --without-libidn     --disable-static     --disable-ldap     --with-pic && make && make install && cd / && rm -r curl-$CURL_VERSION && rm -r /var/cache/apk && rm -r /usr/share/man && apk del curldeps CMD ['curl']

以上的構(gòu)建過程大概做了以下事情:

  1. 我們安裝了一些包,里面包含了我們所需要的、支持SSL(HTTPS)和HTTP2的庫。

  2. 我們安裝了一些編譯cURL所必需的庫。

  3. 我們下載和解壓了cURLDE 源代碼(在寫作時的最新穩(wěn)定版)。

  4. 我們配置,編譯,然后安裝了curl。

  5. 我們清理了那些構(gòu)建需要的、但是不想保留在最終鏡像中的依賴。

  6. 我們將默認的CMD設(shè)置為curl

為什么選擇Alpine?

Alpine Linux是體積最小的Linux發(fā)行版,它重點關(guān)注于安全和速度。使用apk能夠很快地安裝軟件包,默認情況下,鏡像只包含了完成基礎(chǔ)UNIX任務(wù)所需要的東西 ,因此相對于其它Docker基礎(chǔ)鏡像,體積會更小。

對比常用的、沒有壓縮過的基礎(chǔ)鏡像(在寫作時使用的是:latest標(biāo)簽):

  • Alpine - 4.8MB

  • Ubuntu - 124.8 MB

  • Debian - 125.1MB

  • Centos - 196MB


想象一下,在網(wǎng)絡(luò)上一次又一次地下載拉取這些鏡像

你是否正在考慮這能否對硬盤和帶寬產(chǎn)生同樣25倍價值的提升?在某些情況下,是相等的,但是Alpine每天都在不斷地改進和提高,并且提供了很多殺手锏級別的特性,比如說通過文件名來查找(例子:需要定位哪一個apk包包含了二進制文件mke2fs,完全沒有問題。)。在使用其它工具時,我必須花費大量的時間來學(xué)習(xí)它們奇怪的使用方式,對此我感到十分憤怒,不同于這些工具,我對使用Alpine十分高興,并且它不斷地給我驚喜。尤其是在使用一些小工具類型的容器時,比如說curl,鏡像體積的縮小對我來說非常棒。

詳細的構(gòu)建步驟

讓我們更深入地了解Dockerfile。

FROM alpine:edge # For nghttp2-dev, we need this respository. RUN echo https://dl-cdn./alpine/edge/testing >>/etc/apk/repositories

在Alpine的edge分支中,nghttp2包(支持cURL中的HTTP2所必需的包)只有在testing倉庫有效,因此這幾行命令確保了當(dāng)我們執(zhí)行apk installnghttp2包能夠被正確安裝。閱讀“如何讓cURL支持HTTP2”的文檔就會發(fā)現(xiàn), nghttp2庫是必需的(由于HTTP2所帶來的復(fù)雜性),并且在Alpine的歸檔中閑逛時,發(fā)現(xiàn)了edge分支中nghttp2只在testing倉庫有效。

ENV CURL_VERSION 7.50.1

當(dāng)cURL發(fā)布了新版本,我們想要更新鏡像,我們僅僅需要修改這個文件的一處位置——環(huán)境變量,7.50.1表示在寫作時cURL最新的穩(wěn)定版。

RUN apk add --update --no-cache openssl openssl-dev nghttp2-dev ca-certificates

這些是我們想要最終保留在鏡像的依賴,默認證書和庫是為了讓curl支持SSL(HTTPS連接)。注意—no-cache,這個確保了apk不會使用多余的硬盤空間來緩存包位置查找的結(jié)果,最終就會節(jié)省鏡像的空間。

下一條RUN命令只會產(chǎn)生一個文件層(因此我們可以安裝一些依賴,使用它們,然后清除它們,不將它們保留在最終鏡像中)。這條命令內(nèi)容比較多,讓我們一步一步來看它們到底做了什么操作。

RUN apk add --update --no-cache --virtual curldeps g  make perl && \

以上全都是成功編譯和安裝curl所需要的工具。--virtual是一個非常有用的apk特性——虛擬包。你可以給予包的集合一個標(biāo)簽,然后通過使用一條命令 apk del virtual-pkg-name來將它們?nèi)壳宄?/p>

wget https://curl./download/curl-$CURL_VERSION.tar.bz2 && tar xjvf curl-$CURL_VERSION.tar.bz2 && rm curl-$CURL_VERSION.tar.bz2 && cd curl-$CURL_VERSION && \

獲得cURL的源碼壓縮包,解壓它,刪除壓縮包(我們在解壓后就不需要它了),然后使用cd命令進入到源文件目錄。

./configure     --with-nghttp2=/usr     --prefix=/usr     --with-ssl     --enable-ipv6     --enable-unix-sockets     --without-libidn     --disable-static     --disable-ldap     --with-pic && make && make install && \

在熟悉的./configure;make;make install命令的基礎(chǔ)上加上了一些cURL特有的偏好設(shè)置。--with-nghttp2=/usr就是用來配置HTTP2支持的,由于我們將nghttp2-dev安裝在Aline的/usr/lib目錄下,在構(gòu)建cURL的時候,程序會自動在/usr下的lib目錄尋找一個包配置文件。因此,你可能在其他的例子中看到參數(shù)設(shè)置為/usr/local或者其它目錄。

大多數(shù)的其它參數(shù)(除了—with-ssl)都是都拷貝自上游對curl包的請輸入鏈接描述(http://git./cgit/aports/tree/main/curl/APKBUILD)APKBUILD文件。由于Alpine的包維護者比較可靠,因此我決定復(fù)用這些已經(jīng)存在的配置。如果我對這么做感到太魯莽,那么我將會深入進去,然后從底層的角度來決定哪些我需要,哪些不需要,但是我還是希望它們包含UNIX套接字和IPV6的支持,因此我保留了這些已存在的配置。

cd / && rm -r curl-$CURL_VERSION && rm -r /var/cache/apk && rm -r /usr/share/man && apk del curldeps

以上全都是清除工作。

保留構(gòu)建目錄(也就是二進制文件被安裝的地方),去除源代碼目錄,運行apk del curldepsenter code here命令來清除我們之前創(chuàng)建的虛擬包,接下來再去除/var/cache/apk(這是包緩存,老實說,我也不清楚為什么使用了—no-cache選項,緩存依舊存在)和/usr/share/man目錄(幫助手冊,在man命令沒有被安裝的情況下,這是無用的)。其中一些清除操作,尤其是緩存和幫助頁面的清除,某種程度上可以說是對縮小鏡像體積的一種怪癖,畢竟它們實際上不會超過1MB。這些都是我通過運行du | sort -n后,認為在最終鏡像中可能不必要的內(nèi)容,我只能說,我狂熱地追求盡可能地縮小鏡像體積。

由于以上的這些操作都屬于同一個RUN命令,因此這最終會產(chǎn)生一個相對小的鏡像層,盡管在命令最開始的時候,我們?yōu)榱藰?gòu)建最終的產(chǎn)品,安裝了將近212MB的依賴。如果這些操作分布在不同的層,清除操作實際上不會真正地在最終鏡像上刪除這些文件,相反,只是將這些文件隱藏了起來。

最后一條:

CMD ['curl']

docker run image命令將會默認調(diào)用curl命令。當(dāng)然這也能夠替換為ENTRYPOINT,但是我并不介意CMD能夠簡單地通過docker run被重新賦值。

構(gòu)建并且運行鏡像

首先是構(gòu)建,將Dockerfile丟進一個空目錄下,然后在這個目錄下運行:

$ docker build -t yourname/curl .

一旦構(gòu)建完鏡像,運行鏡像就顯得非常直接了。讓我們來檢查看看一切是否按照上描述的那樣工作。-s表示啟動安靜模式,--http2表示使用HTTP2協(xié)議,-I能夠返回請求頭,以此驗證我們使用了正確的協(xié)議。

$ docker run yourname/curl curl -s --http2 -I https:// HTTP/2 200  date: Sat, 06 Aug 2016 21:47:31 GMT content-type: text/html last-modified: Thu, 21 Jul 2016 14:06:56 GMT etag: '5790d700-19e1' accept-ranges: bytes content-length: 6625 x-backend-header-rtt: 0.00166 strict-transport-security: max-age=31536000 server: nghttpx nghttp2/1.14.0-DEV via: 2 nghttpx x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block x-content-type-options: nosniff

很好,一切正常工作。并且最終的鏡像體積保持在16MB左右。這對于私人訂制的curl構(gòu)建來說是不錯的,畢竟編譯curl需要上百MB的依賴的支持。

結(jié)論
  • Alpine Linux非常棒。

  • 從零構(gòu)建你自己的工具是難以想象的,但確實令人興奮。

  • Docker非常適合于從源代碼構(gòu)建工具。

  • 你能夠擁有支持HTTP2的cURL工具。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多