ゼロからDockerイメージを作成する

Creating Docker Image From Scratch



他のコンテナ化テクノロジーに対するDockerの主な利点は、Dockerが開発者とそのアップスタックアプリケーションを対象としていることです。のような適切なコンテナ化技術が LXCゾーン刑務所 運用の観点からターゲットにされている、または簡単に言えば、これらのプラットフォームはクラウド上で実行されている仮想マシンの代替です。一方、Dockerはパッケージと実行可能バイナリの代わりになります。

大まかに言えば、Dockerは、考えられるすべてのLinuxプラットフォームで機能するユニバーサルパッケージマネージャーのようになりつつあります。コンテナを使用して、開発者が直面するまったく異なる問題を解決します。問題は、開発者がデスクトップオペレーティングシステム(Windows、macOS、Linuxなどのデスクトップ関連パッケージが大量に含まれている)を使用してアプリケーションを作成することです。彼らが作成するアプリケーションは、開発者のラップトップとは完全に異なるLinuxディストリビューションを備えた、サーバー上の完全に異なるオペレーティングシステムで実行されることがよくあります。







Dockerの場合、アプリケーションはDockerイメージとしてパックされます。このイメージを取得してコンテナ化されたアプリケーションとして実行するのはDockerの仕事です。コンテナ化されるということは、アプリケーションとその依存関係が、開発者のラップトップや本番サーバーとは完全に異なる可能性のある分離された環境で実行されることを意味します。どちらもDockerをサポートしている限り、まったく同じ方法で同じアプリケーションを実行できます。



Dockerイメージの構造

前述のように、Dockerアプリは合意された環境で実行されます。ここで問題となるのは、その環境をどのように作成するかです。ほとんどのアプリケーションイメージは、Dockerベースイメージをインポートし、その上にアプリケーションを構築します。



アプリケーションはソフトウェアのレイヤーから作成されます。 WordPressコンテナイメージは、Ubuntuイメージの上に構築されるhttpdコンテナイメージを使用して構築されます。新しいイメージが構築されるイメージは、Dockerの用語ではPARENTIMAGEとして知られています。 Dockerfileでは(Dockerfileの意味については少し後で説明します)、この親イメージはファイルの先頭に次のように記載されています。





Ubuntuから:18.04
##残りのDockerfile

このDockerfileを実行すると、アプリケーションがDockerイメージ(一種のバイナリ)に変換され、レジストリにプッシュして、そこからプルして別の場所に新しいコンテナーを作成できます。ただし、それらはすべてベースイメージとしてUbuntu:18.04を持ち、実行しているUbuntuシステムであるかのように実行されます。

新しいDockerイメージをプルしようとしたときに、これに気付いたかもしれません。



ゼロからDockerイメージを作成する

これは、実際のアプリケーション(サイズが数メガバイトしかない場合があります)が取り込まれる前にプルされるレイヤーの数を示しています。

このため、ベースイメージと呼ばれるものを作成したいと思います。これは他のものの上に構築されていません。キーワードscratchは、このレイヤーが他のものの上に構築されていないことを示すために使用されます。そのようです:

ゼロから
##残りのDcokerfile

最初に単純なhello-worldアプリケーションを作成してから、Dockerfileの残りの部分がどうなるかを理解します。ホストシステムはUbuntu:18.04 LTSで、実験にはDockerバージョン17.12.1-ceを使用しています。

静的バイナリの作成

Dockerコンテナーは、オペレーティングシステムの他の部分から分離されて実行されているプロセスのコレクションです。プロセスが接触しているのはカーネルだけです。カーネルは、CPUでこれらのプロセスをスケジュールし、メモリ管理およびその他のいくつかの基本的な予約保持タスクを実行する責任があります。

しかし、ほとんどの高レベルのアプリケーションは、多くのシステムライブラリに依存しています( glibc、musl、klibcなど )およびPython、Node.js、Javaランタイムなどの多くのランタイム依存関係。アプリケーションバイナリには、利用可能なすべてのライブラリが含まれているわけではありませんが、実行を開始すると、ホストオペレーティングシステムからそれらのライブラリが呼び出されます。

ゼロからイメージを作成しようとしているので、これらの優れた機能は得られません。したがって、アプリケーションは静的ファイルまたはスタンドアロンの実行可能ファイルである必要があります。

MyDockerImageというフォルダを作成し、その中にhello.ccファイルを作成することから始めましょう。

$mkdirMyDockerImage
$CDMyDockerImage
$接するhello.cc

お気に入りのテキストエディタを使用してhello.ccを開き、その中に次の行を追加します。

#含む
名前空間stdを使用する;
int主要(()。{{
費用<< 'こんにちは!このメッセージはコンテナから送信されますNS';
戻る 0;

}

これは、Hello!を出力する単純なC ++プログラムです。このメッセージ …

前に説明した理由により、静的フラグを使用してこれをコンパイルします。使用されているコンパイラは g ++(Ubuntu 7.3.0-16ubuntu3)7.3.0。

プログラムをコンパイルするには、同じディレクトリで次のコマンドを実行します。

$ g++ -oこんにちは-静的こんにちは。DC

これにより、同じディレクトリにバイナリ実行可能ファイルhelloが作成されます。これが静的ファイルです。ターミナルでファイル名を指定して、意図したとおりに実行されているかどうかをテストします。

$。/こんにちは

これで、この単純なプログラムをコンテナ化する準備が整いました。

Dockerfile

Dockerfileは、アプリケーションファイル(バイナリ、ソースファイルなど)と、ファイルシステムレイアウト、公開ポートなどのさまざまな構成パラメーターを取得してDockerイメージファイルに変換する一連のルールで構成されます。その後、そのアプリケーションを実行したい人と画像ファイルを共有できます。

Dockerfileで利用可能なすべてのオプションを掘り下げるのではなく、非常に最小限のDockerfileを作成します。 hello実行可能ファイルが存在する同じディレクトリに、という名前の空のファイルを作成します Dockerfile。

$接するDockerfile

お気に入りのテキストエディタで開き、次の行を書き込みます。

ゼロから
こんにちは追加/
CMD['/こんにちは']

スクラッチ 親画像ではありません。むしろ、イメージが他のイメージの上に構築されていないことをDockerに示します。ゼロから構築されています。 ADDコマンドは、現在のディレクトリから hello という名前の静的バイナリを取得し、それをイメージファイルのルートディレクトリに追加します。最終的にこのイメージに基づいてコンテナを実行すると、hello実行可能ファイルはルートディレクトリ自体の /hello. に表示されます。

最後に、CMD行には文字列があります /こんにちは この文字列は、このイメージからコンテナーが作成されるたびにシェルコマンドとして実行されます。したがって、コンテナーに追加したバイナリファイルは、アプリに書き込んだメッセージを出力します。

を呼び出してイメージを作成しましょう Dockerビルド Dockerfileの内容を調べて画像を生成するコマンド。 Dockerfileおよび実行可能バイナリと同じディレクトリで次のコマンドを実行します。

$Dockerビルド - 鬼ごっここんにちは 。

NS –tag hello フラグは画像名をに設定します こんにちは とドット( 。 )。 最後に告げる Dockerビルド Dockerfileおよび関連コンテンツの現在のディレクトリを調べます。

Dockerコンテナの実行

作成した画像が画像のリストに表示されるかどうかを確認するには、次のコマンドを実行します。

$Docker画像

他の画像と比較すると、hello画像がどれほど小さいかに注目してください。いずれにせよ、コンテナとして実行する準備ができています。

$docker run hello

それでおしまい!最初のミニマルなコンテナを最初から作成しました。

別のオプション

ゼロからイメージを作成することは常にオプションですが、人々は他の軽量Linuxディストリビューションからイメージを作成する傾向があります。たとえば、alpineやbusyboxのような画像は、glibcの代わりにmuslのような小さなライブラリを備えた非常に軽量な環境です。

を使用してそれらを親画像として使用する 高山から:最新 画像も小さくなります。ベースイメージのサイズはわずか2〜5MBであるため。次に取り上げてほしいDocker関連のトピックがあるかどうかをお知らせください。あなたは私たちに到達することができます ツイッターフェイスブック または電子メールで購読してください。