最小限のカールとミラーコマンド
Dockerfileは、以下の
FROM alpine:latest
RUN apk add --update curl && rm -rf /var/cache/apk/*
あなたはアルパインのLinuxドッキングウィンドウミラーのカールのダウンロード速度が非常に遅いインストールすると、どのように解決するには?
Step 2/2 : RUN apk update && apk add curl && rm -rf /var/cache/apk/*
---> Running in 86c4e9f3daca
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
ミラーが解決インストールの国内ソースに高山のLinux APK
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
次のようにDockerfileを調整しました
FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk add --update curl && rm -rf /var/cache/apk/*
cURL--ベースアルパインのサポートHTTP2はドッカーイメージを最小限に抑えます
cURLのは、私の好きなオープンソースソフトウェアの1つです。カールは、強力なものの、多くの場合は、当たり前の、しかし私は心からそれが感謝と尊敬に値すると思うしています。私たちは、ツールボックスを紛失した場合curl
、(私たちのほとんどは、このようなものです)厳しいと相互作用して、ネットワークに必要とする人たちは窮地に陥ります。curl
ユーザーへの影響を最小限に抑え、彼らがする必要がある唯一のものとスピード、小型サイズ、および最も良いツール、シンプルで清潔な、。
誰かが使用したい場合curl
(たとえば、UNIXソケットのサポートなど)に機能を、システムが提供する設定を正確にパッケージには、この機能をサポートしていない、またはパッケージのバージョンが古すぎるとに起因して、この機能が含まれていませんcurl
「のデータ送信世界でスイスアーミーナイフ」、状況が発生する可能性が高いと考えられます。あなたはあなたが必要な機能が含まれてコンパイルしたいことがわかりますのでcurl
。独自のソフトウェアは恐ろしいですコンパイル、あなたはこのような問題を解決するのが得意じゃない場合は特に、私たちは一時的に使用すると、カスタムソフトウェアを使用しているという事実は、彼ら自身の経験の信じられないほどの、解放されます脇に置くましょう。
必要に応じてあなたに自信を与える明らかなように、あなたは、あなた自身のソフトウェアをコンパイルすることができ、そして、あなたのパッケージに他の人に限定されるものではありません。あなたが任意のソフトウェアにそれのようなあなたは、制限その他の設定を受け入れる必要はありません道をインストールして設定することができます-突然、あなたの心は興奮のスリルを充填することができます。何かの人間はしばしば、自分のマーク、一つの理由がある追加したいなぜオープンソースソフトウェアの中毒性の使用。
分離特性ドッカーファイルシステムので、それはこの種のものを完了するための最良の選択肢となっています。あなたは、依存ライブラリをインストールするか、お粗末な実行を心配する必要はありませんmake install
ローカルのファイルシステムまで同様の注文意志の混乱を。それはあなたが実際の環境で動作することを可能にする、とあなたは間違いを犯すことができます。事は完全に台無しにする唯一の方法を学ぶことですので、この知識は、優れた学習ツールである、物事はコンテナになり台無しにして、あなたは簡単に自分自身の混乱よりも、この方法では、これらのコンテナを破棄することができますローカルシステムは安全であると。また、フォームに書かれたスクリプトにこれらの手順を適用した場合Dockerfile
、そして、その後の再構築構築ステップ時に一貫性があります。けれどもDockerfile
ていない100%保証ビルドに結果が、それはよりも優れているREADME
はるかに良いで記述するために自由に。
私たちは一緒に作ろうDockerfile
支援の最小HTTP2、イメージベースのアルパインのLinuxのボリュームを作成します。これは、縮小画像とカスタムの量の100%に焦点を当てるcurl
に。
方法ステップ
私たちは以下となります。
- 我々はHTTP2に注意を払う理由を話し合いますか?
- 簡単に言うとは通読
Dockerfile
ビルドプロセスの予備的な理解を持っているので、。 - 基本イメージとして、なぜアルプスを話し合いますか?
- 詳細に説明し
Dockerfile
、それを理解するためのステップバイステップを。 - ミラーの構築と運用。
なぜHTTP2?
以下からの引用 https://http2.github.io/:
そのためHTTP、HTTP / 2の重要な状態のHTTP代替となりました。HTTP / 2完全に書き直されていないHTTPプロトコル、HTTPメソッド、ステータスコード、セマンティクスが保持され、そして使用することができるべきであり、HTTP / 1.1と同じAPI HTTP / 2プロトコルを表現するために(微調整があってもよいです) 。
HTTP / 2プロトコルは、性能上特にエンドユーザ受信遅延、ネットワークおよびサーバリソースの使用を集中させます。主な目的の一つは、唯一の接続を介して達成することができ、ブラウザからWebサイトを訪問することです。
簡単に言えば、HTTP2は、以下を含むHTTP / 1.1の欠点のいくつかに対処したいパフォーマンスの問題を。サンプルのテストケースでは、フロントリンクすることにより、CloudFlareの声明HTTP / 2は4〜8倍高速自分のコンピュータ上になります。4〜8倍高速なWebページを向上させることができますか?はい、あなたはそれが右に聞きました。
Dockerfile
これは、HTTP2のカールによってサポートされていますDockerfile
:
FROM alpine:edge
# For nghttp2-dev, we need this respository.
RUN echo https://dl-cdn.alpinelinux.org/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.haxx.se/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"]
次のことを行うためのビルドプロセスについての詳細:
- 私たちは、含まれているいくつかのパッケージをインストールし、サポートするSSL(HTTPS)とHTTP2ライブラリ我々は必要です。
- 私たちは、必要なcURLのライブラリいくつかのコンパイラをインストールしました。
- 私たちは、ダウンロードして解凍したcURLDEのソースコード(最新の安定版を書いている時点で)。
- 私たちは、コンパイルを構成し、インストールします
curl
。 - 私たちは、その建物をクリーンアップする必要がありますが、鏡に決勝で保持さに依存したくありませんでした。
- 私たちは、デフォルトになります
CMD
設定curl
。
なぜアルパイン?
アルパインLinuxは最小のLinuxディストリビューションである、それは安全性とスピードに焦点を当てています。使用してapk
すぐにパッケージをインストールすることができ、デフォルトでは、画像を完成することが唯一のため、体積に対するドッカー他のベースイメージは、小さくなり、タスクが必要とするものの基本的なUNIXが含まれています。
一般に使用される造影、(書き込みがあるときに使用される。最新のタグ)無圧縮ベース画像:
Alpine
- 4.8メガバイトUbuntu
- 124.8メガバイトDebian
- 125.1メガバイトCentos
- 196メガバイト
ダウンロードにこれらの画像を引っ張って何度も何度もネットワーク上で、想像し
ますが、これはハードディスクと帯域幅をアップグレードするのと同じ25倍の値を生成することができます検討している場合は?検索に必要なもの:いくつかのケースでは、それは同じですが、アルパインは絶えず改善し、改善し、毎日、及び(例を見つけるために申し出ファイル名などのキラー・レベルの機能の多くをされているapk
バイナリを含むパッケージをmke2fs
、問題ありません。)。他のツールを使用している場合、私は彼らの奇妙な方法を使用することを学ぶために多くの時間を費やす必要があり、私は非常に怒って、これらのツールとは違って、私は非常にアルパインの使用と嬉しく思いますし、それは常に私に驚き。特に、ガジェットコンテナのいくつかのタイプを使用することで、例えばcurl
、ミラーボリュームの減少は、私のために素晴らしいです。
詳細な手順の構築
私たちはより良いDockerfileを理解しましょう。
FROM alpine:edge
# For nghttp2-dev, we need this respository.
RUN echo https://dl-cdn.alpinelinux.org/alpine/edge/testing >>/etc/apk/repositories
エッジのアルパインブランチは、nghttp2
コマンドのこの数行は、私たちが実行したときにことを保証するように、パッケージ(HTTP2のカールのサポートに必要なパッケージが)、倉庫のテストにのみ効果があるapk install
ときnghttp2
パッケージが正常にインストールすることができます。文書を見つけるだろう「どのようにcURLサポートHTTP2を作るために」をお読み、 nghttp2
ライブラリが(原因HTTP2もたらした複雑さを)必要とされる、とアルパインアーカイブにさまよって、エッジブランチが見つかっnghttp2
テスト倉庫でのみ有効です。
ENV CURL_VERSION 7.50.1
cURLの新しいバージョンをリリースしたとき、我々は画像を更新したい、私たちは、ファイルの場所を変更する必要がある-環境変数、7.50.1
書き込み時にcURLの最新の安定版を表明しました。
RUN apk add --update --no-cache openssl openssl-dev nghttp2-dev ca-certificates
これらは、私たちが鏡に依存したままにする最終的なもので、デフォルトの証明書とライブラリができるようにすることですcurl
SSL(HTTPS接続)のサポートを。注意—no-cache
、というこの性を保証apk
結果は、スペースを節約する、最終的なイメージの場所を見つけるために、パケットをキャッシュするために余分なハードディスクの空き容量を使用しません。
次のRUNコマンドは、ファイル層を生成します(私たちは依存関係をインストールすることができますので、それらを使用し、それらをクリアし、彼らは最終ミラーに残りません)。より多くのコンテンツこのコマンドは、ステップバイステップでは、私たちはそれらが動作エンドで何が行われたかを見てみましょう。
RUN apk add --update --no-cache --virtual curldeps g++ make perl && \
上記すべて正常にコンパイルし、インストールcurl
に必要なツールを。--virtual
仮想パッケージ- APKは非常に有用な特徴です。あなたは、コレクションパッケージのラベルを与え、その後、コマンドを使用してすることができ apk del virtual-pkg-name
、それらのすべてをクリアします。
wget https://curl.haxx.se/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
コマンドカールプラスいくつかのユニークな設定の根拠。--with-nghttp2=/usr
私たちがしますので、設定しHTTP2サポートするために使用されnghttp2-dev
アリーンさんに取り付ける/usr/lib
のcURL、プログラムは自動的に構築するときに、ディレクトリ/usr
パッケージ構成ファイルを見つけるためのlibディレクトリを。そのため、あなたは他のインスタンスに設定されたパラメータを参照する/usr/local
か、他のディレクトリを。
(に加えて他のパラメータの最も—with-ssl
カールの両方が上流のパケットからコピーされる)は、リンカー入力 APKBUILDファイル。アルパインパッケージのメンテナとして、より信頼性の高いので、私は、既存の構成を再利用することにしました。私はそうするにはあまりにも無謀と感じた場合、私は深さに行く、その後、ビューの底点から、私は何をして何をしないかを決定する必要がありますが、私は保たれて、私はまだ、彼らはUNIXソケットを含ん希望とIPV6をサポートこれらの既存の設定。
cd / && \
rm -r curl-$CURL_VERSION && \
rm -r /var/cache/apk && \
rm -r /usr/share/man && \
apk del curldeps
すべてのクリーンアップ以上。
予約ビルドディレクトリ(バイナリファイルがインストールされている場合、である)、APKデルcurldeps実行し、ソースコードのディレクトリを削除しenter code here
、その後再び除去、我々は以前に作成した仮想パッケージを削除するには、コマンドを/var/cache/apk
正直に言うと、これはパッケージキャッシュである(、私は知りませんなぜ使用して—no-cache
、キャッシュがまだそこにあるオプションが)と/usr/share/man
(manコマンドの場合は、ヘルプマニュアルは、インストールされていない、それは無用である)ディレクトリ。特にある程度のキャッシュされたページやヘルプの除去は、言うことができるこれらの清算業務の一部は、すべての後、彼らはもう1メガバイトよりも実際にあり、とても狭いミラーボリュームではありません。これらは私が実行されdu | sort -n
ていることが、最終的な画像内の不要な内容かもしれ後、私は、私はできるだけ狭いミラーボリュームの熱狂的な追求だと言うことができます。
コマンドの先頭の時点で、我々は最終製品は、ほぼ212メガバイトインストール依存構築する必要がありますが、これは最終的には、比較的小さなミラー層が生成されますので、これらの操作の詳細なので、同じRUNコマンドに属します。これらの操作は異なる層に配置されている場合は、クリア動作は、実際には、実際には逆に、最終的な画像のファイルを削除しないが、これらのファイルが隠されました。
最後の1:
CMD ["curl"]
docker run image
コマンドは、デフォルトの起動するcurl
コマンドを。もちろん、これも交換することができENTRYPOINT
ますが、私は気にしないCMD
、単純でできるdocker run
再割り当てされています。
ビルドおよびランタイムイメージ
ビルドへの最初のものであるが、それがされDockerfile
、このディレクトリで実行、空のディレクトリに投げ込ま:
$ docker build -t yourname/curl .
あなたがミラーを構築したら、ミラーは、それは非常に簡単です実行します。説明nghttp2.orgに従ってすべてのその仕事かどうかを確認するためにチェックしてみましょう。-s
スタートアップ静かなモード、ことを示す--http2
表示HTTP2契約は、-I
我々は正しいプロトコルを使用していることを確認するためには、最初の要求に戻ります。
$ docker run yourname/curl curl -s --http2 -I https://nghttp2.org
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
まあ、すべてが正常に動作しています。そして、最終容量は、ミラー16メガバイトで維持しました。プライベートカスタムカールのためのこの建物は良いですが、すべての後に、MBのコンパイルカール依存の何百もの支援を必要としています。
結論
- アルパインLinuxは素晴らしいです。
- ゼロから独自のツールを構築することは想像しにくいが、本当にエキサイティングです。
- ドッカーは、ソースコードからツールを構成するのに適しています。
- あなたはサポートHTTP2 cURLのツールを持つことができます。