|
cURL(https://curl./)是我喜歡的開源軟件之一。雖然cURL的強大常常被認為是理所當(dāng)然的,但我真心地認為它值得感謝和尊重。如果我們的工具箱失去了 如果有人想使用 如果需要,你可以編譯自己的軟件,并且不受限于其它人交給你的軟件包,明確這一點將會給你帶來自信。突然間,你腦中可能會充斥著興奮的快感——你能夠按照你喜歡的方式安裝和配置任何軟件,并不需要接受其它人配置中的限制。人類常常喜歡給一樣?xùn)|西加上自己的標(biāo)記,這就是使用開源軟件的令人上癮的原因之一。 由于Docker文件系統(tǒng)的分離特性,它成為了完成這類事情最佳的選擇。你并不需要擔(dān)心安裝依賴庫或者運行一個糟糕的 接下來讓我們一起構(gòu)建一個 我們將會:
引用自 https://http2./:
簡要地說,HTTP2想要解決HTTP/1.1的一些缺點,包括性能問題(https://www./http2/)。通過對前面鏈接中的樣本用例進行測試,CloudFlare聲明HTTP/2對我的電腦會有4~8倍的速度提升。能夠提升網(wǎng)頁4~8倍的速度?是的,你沒有聽錯。 這就是支持HTTP2的curl的 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)建過程大概做了以下事情:
Alpine Linux是體積最小的Linux發(fā)行版,它重點關(guān)注于安全和速度。使用 對比常用的、沒有壓縮過的基礎(chǔ)鏡像(在寫作時使用的是:latest標(biāo)簽):
想象一下,在網(wǎng)絡(luò)上一次又一次地下載拉取這些鏡像 你是否正在考慮這能否對硬盤和帶寬產(chǎn)生同樣25倍價值的提升?在某些情況下,是相等的,但是Alpine每天都在不斷地改進和提高,并且提供了很多殺手锏級別的特性,比如說通過文件名來查找(例子:需要定位哪一個 讓我們更深入地了解Dockerfile。 FROM alpine:edge
# For nghttp2-dev, we need this respository.
RUN echo https://dl-cdn./alpine/edge/testing >>/etc/apk/repositories 在Alpine的edge分支中, ENV CURL_VERSION 7.50.1 當(dāng)cURL發(fā)布了新版本,我們想要更新鏡像,我們僅僅需要修改這個文件的一處位置——環(huán)境變量, RUN apk add --update --no-cache openssl openssl-dev nghttp2-dev ca-certificates 這些是我們想要最終保留在鏡像的依賴,默認證書和庫是為了讓 下一條RUN命令只會產(chǎn)生一個文件層(因此我們可以安裝一些依賴,使用它們,然后清除它們,不將它們保留在最終鏡像中)。這條命令內(nèi)容比較多,讓我們一步一步來看它們到底做了什么操作。 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 && \ 獲得cURL的源碼壓縮包,解壓它,刪除壓縮包(我們在解壓后就不需要它了),然后使用 ./configure --with-nghttp2=/usr --prefix=/usr --with-ssl --enable-ipv6 --enable-unix-sockets --without-libidn --disable-static --disable-ldap --with-pic && make && make install && \ 在熟悉的 大多數(shù)的其它參數(shù)(除了 cd / && rm -r curl-$CURL_VERSION && rm -r /var/cache/apk && rm -r /usr/share/man && apk del curldeps 以上全都是清除工作。 保留構(gòu)建目錄(也就是二進制文件被安裝的地方),去除源代碼目錄,運行apk del curldeps 由于以上的這些操作都屬于同一個RUN命令,因此這最終會產(chǎn)生一個相對小的鏡像層,盡管在命令最開始的時候,我們?yōu)榱藰?gòu)建最終的產(chǎn)品,安裝了將近212MB的依賴。如果這些操作分布在不同的層,清除操作實際上不會真正地在最終鏡像上刪除這些文件,相反,只是將這些文件隱藏了起來。 最后一條: CMD ['curl']
首先是構(gòu)建,將 $ docker build -t yourname/curl . 一旦構(gòu)建完鏡像,運行鏡像就顯得非常直接了。讓我們來檢查看看一切是否按照上描述的那樣工作。 $ 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的依賴的支持。
|
|
|