Dockerを使うときは、まずベースイメージから始めます。起動して変更を作成すると、それらの変更は別のイメージを形成するレイヤーに保存されます。
それで結局私は私のPostgreSQLインスタンスのためのイメージと私のWebアプリケーションのためのイメージを持っています。
だから質問は:コンテナとは何ですか?
画像のインスタンスはコンテナと呼ばれます。あなたはイメージを持っています。それはあなたが説明したような一連のレイヤーです。この画像を起動すると、この画像の実行中のコンテナがあります。同じ画像の実行中のコンテナを多数持つことができます。
すべての画像をdocker images
で見ることができますが、実行中のコンテナをdocker ps
で見ることができます(そしてすべてのコンテナをdocker ps -a
で見ることができます)。
したがって、イメージの実行中のインスタンスはコンテナです。
Dockerデプロイメントの自動化 :に関する私の記事から
Dockerlandには、imagesとcontainersがあります。この2つは密接に関連していますが、別個のものです。私にとって、この二分法を理解することで、Dockerが非常に明確になりました。
イメージは、本質的にコンテナのスナップショットである不活性で不変のファイルです。イメージは build コマンドで作成され、 run で開始するとコンテナーを生成します。画像は registry.hub.docker.com などのDockerレジストリに保存されます。画像は非常に大きくなる可能性があるため、画像は他の画像のレイヤーで構成されるように設計されており、ネットワーク経由で画像を転送するときに最小限のデータを送信できます。
ローカル画像は、docker images
を実行することでリストできます:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
注意すべき点:
-t
コマンドのdocker build
フラグ、または既存のイメージのdocker tag
- ingから取得されます。意味のある命名法を使用して画像に自由にタグ付けできますが、Dockerはdocker Push
またはdocker pull
のレジストリの場所としてタグを使用することを知っています。[REGISTRYHOST/][USERNAME/]NAME[:TAG]
です。上記のubuntu
の場合、REGISTRYHOSTはregistry.hub.docker.com
であると推測されます。したがって、my-application
という名前の画像をdocker.example.com
のレジストリに保存する場合は、その画像docker.example.com/my-application
にタグを付ける必要があります。latest
タグは魔法ではありません。タグを指定しない場合の単なるデフォルトのタグです。<none>
タグとリポジトリを取得します。それらを忘れるのは簡単です。画像に関する詳細情報は、 Docker docs および glossary から入手できます。
プログラミングメタファーを使用するために、イメージがクラスである場合、コンテナはクラスのインスタンス、つまりランタイムオブジェクトです。コンテナが、Dockerを使用している理由です。それらは、アプリケーションを実行する環境の軽量でポータブルなカプセル化です。
docker ps
でローカルの実行中のコンテナーを表示:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
ここでは、Dockerレジストリのdockerizedバージョンを実行しているため、画像を保存するプライベートな場所があります。繰り返しますが、注意すべき点がいくつかあります。
docker ps
は、runningコンテナのみを出力します。 docker ps -a
を使用して、すべてのコンテナ(runningまたはstopped)を表示できます。--name
フラグを使用して、開始されたコンテナーを識別できます。Dockerに対する私の初期の不満の1つは、タグ付けされていない画像と停止したコンテナの継続的な蓄積でした。いくつかの機会に、このビルドアップにより、ハードドライブが最大限に使用され、ラップトップの速度が低下したり、自動ビルドパイプラインが停止したりしました。 「どこでもコンテナ」について話してください!
docker rmi
を最近のdangling=true
クエリと組み合わせることにより、すべてのタグなし画像を削除できます。
docker images -q --filter "dangling=true" | xargs docker rmi
Dockerは既存のコンテナの背後にある画像を削除できないため、最初にdocker rm
で停止したコンテナを削除する必要があります。
docker rm `docker ps --no-trunc -aq`
これらは 既知の問題点 Dockerであり、将来のリリースで対処される可能性があります。ただし、画像とコンテナを明確に理解していれば、これらの状況はいくつかの方法で回避できます。
docker rm [CONTAINER_ID]
を使用して、停止した不要なコンテナを常に削除します。docker rmi [IMAGE_ID]
を使用して、役に立たない停止したコンテナの背後の画像を常に削除します。コンテナーを実行中のイメージと考えるのが最も簡単ですが、これは まったく 正確ではありません。
画像は実際にはコンテナに変えることができるテンプレートです。イメージをコンテナに変換するために、Dockerエンジンはイメージを取得し、読み書き可能なファイルシステムを一番上に追加し、ネットワークポート、コンテナ名、ID、リソース制限などのさまざまな設定を初期化します。実行中のコンテナには現在実行中のプロセスがありますが、コンテナを停止することもできます(またはDockerの用語では 終了 )。終了したコンテナは再起動することができ、その設定とファイルシステムの変更を保持するため、 not はイメージと同じです。
簡単に言えば。
画像 -
コンテナーを作成するために使用されるファイルシステムおよび構成(読み取り専用)アプリケーション。 より詳しく 。
コンテナ -
これらはDockerイメージの実行中のインスタンスです。コンテナは実際のアプリケーションを実行します。コンテナには、アプリケーションとそのすべての依存関係が含まれています。カーネルを他のコンテナと共有し、ホストOS上のユーザースペースで独立したプロセスとして実行されます。 より詳しく 。
注意する他の重要な用語:
Dockerデーモン -
Dockerコンテナーの構築、実行、および配布を管理する、ホスト上で実行されているバックグラウンドサービス。
Dockerクライアント -
ユーザーがDockerデーモンと対話できるようにするコマンドラインツール。
Dockerストア -
Storeは、とりわけDockerイメージのレジストリです。あなたはすべての利用可能なDockerイメージのディレクトリとしてレジストリを考えることができます。
this blogからの写真は千語の価値があります。
(より深い理解のために これ を読んでください。)
概要:
docker run image_name:tag_name
)=>実行中の画像、すなわちコンテナを編集可能にしますワークフロー全体を説明するのが役に立つかもしれません。
すべては Dockerfile で始まります。 DockerfileはImageのソースコードです。
Dockerfileが作成されたら、それをビルドしてコンテナーの image を作成します。このイメージは、Dockerfileである「ソースコード」の「コンパイル済みバージョン」です。
コンテナのイメージを取得したら、 registry を使用してそれを再配布する必要があります。レジストリはgitリポジトリのようなものです - 画像をプッシュしたりプルしたりすることができます。
次に、このイメージを使って container を実行できます。実行中のコンテナは、多くの点で仮想マシンと非常に似ています(ただし ハイパーバイザ はありません)。
この記事 はdockerコンテナに関する多くの基本的なことを説明しています(DockerとPuppetについて話していますが、どんな状況でも使える概念はたくさんあります)
これは、さまざまなコマンドとそれに関連する入出力を示すエンドツーエンドのワークフローです。これで画像とコンテナの関係が明確になります。
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
実行できる画像を一覧表示するには、次のコマンドを実行します。
docker image ls
コンテナを一覧表示するには、コマンドを実行します。
docker ps
ここですべての質問を読んだにも関わらずimageおよびlayerの概念を理解できず、最終的にこれにつまずいた Dockerの優れたドキュメント (だよ!)。
この例は、概念全体を理解するための鍵です。これは長い記事なので、明確にするために本当に把握する必要がある重要なポイントを要約しています。
イメージ:Dockerイメージは一連の読み取り専用から構築されますレイヤー
Layer:各レイヤーは、画像のDockerfile内の命令を表します。
Example
:以下のDockerfileには4つのコマンドが含まれており、それぞれがレイヤーを作成します。
Ubuntuから:15.04
コピー/ app
RUN make/app
CMD python /app/app.py
重要、各レイヤーはその前のレイヤーとの違いのみです。
したがって、コンテナーとイメージの主な違いは、最上部の書き込み可能なレイヤーです。新しいデータを追加したり、既存のデータを変更したりするコンテナへの書き込みはすべて、この書き込み可能なレイヤーに保存されます。コンテナが削除されると、書き込み可能なレイヤーも削除されます。基になる画像は変更されません。
ディスク上のサイズの観点からの画像とコンテナの理解
実行中のコンテナのおおよそのサイズを表示するには、docker ps -s
コマンドを使用できます。 2つの出力としてsize
とvirtual size
を取得します。
サイズ:各コンテナの書き込み可能なレイヤーに使用されるデータ(ディスク上の)の量
仮想サイズ:コンテナが使用する読み取り専用画像データに使用されるデータの量。複数のコンテナは、読み取り専用の画像データの一部またはすべてを共有できます。 これらは加算的ではありません。つまりすべての仮想サイズを追加して、イメージで使用されるディスク上のサイズを計算することはできません
もう1つの重要な概念は、コピーオンライト戦略です
ファイルまたはディレクトリがイメージ内の下位レイヤーに存在し、別のレイヤー(書き込み可能なレイヤーを含む)が読み取りアクセスを必要とする場合、既存のファイルを使用します。最初に別のレイヤーがファイルを変更する必要がある場合(イメージの構築時またはコンテナーの実行時)、ファイルはそのレイヤーにコピーされ、変更されます。
私のような他の人の助けになることを願っています。
Dockerfile >(ビルド)> Image >(実行)> コンテナ 。
Dockerfile :お使いのオペレーティングシステムを好きなように準備し、すべてのソフトウェアをインストール/設定する一連のdocker命令が含まれています。
Image :コンパイル済みDockerfile。コンテナーを実行する必要があるたびにDockerfileを再作成する手間を省きます。そしてそれはあなたの規定コードを隠す方法です。
コンテナ :仮想オペレーティングシステムそれ自体で、あなたはそれにsshして、まるでそれが実環境であるかのように、あなたが望むどんなコマンドでも実行することができます。同じImageから1000以上のコンテナを実行できます。
Dockerのコアコンセプトは、この場合はコンテナと見なすことができる「マシン」を簡単に作成できるようにすることです。コンテナは再利用性に役立ち、コンテナを簡単に作成および削除できます。
画像はあらゆる時点でのコンテナの状態を表しています。したがって、基本的なワークフローは次のとおりです。
簡単に言うと、 image が class の場合、 container はクラスのインスタンスであり、 object はランタイムです。
コンテナは、どの制限を適用するかをOSに指示する方法を知っているアプリケーション(例えば、docker)を使用して事前設定された一連の制限の下でホストOSによって実行される単なる実行可能バイナリです。
典型的な制限は、プロセス分離関連、セキュリティ関連(SELinux保護の使用など)、およびシステムリソース関連(メモリ、ディスク、CPU、ネットワーク)です。
最近まで、Unixベースのシステムのカーネルだけが、厳しい制限の下で実行可能ファイルを実行する機能をサポートしていました。そのため、今日のほとんどのコンテナートークでは、主にLinuxまたは他のUnixディストリビューションが使用されています。
Dockerは、OS(Linuxの大部分)に実行可能ファイルを実行するための制限を指示する方法を知っているアプリケーションの1つです。実行ファイルはDockerイメージに含まれていますが、これは単なるtarファイルです。その実行ファイルは通常、Linuxディストリビューション(Ubuntu、centos、Debianなど)の中で1つ以上のアプリケーションを実行するように事前設定されたものの簡略版です。
ほとんどの人はLinuxベースを実行可能ファイルとして使用しますが、ホストOSが実行できるものであれば他のバイナリアプリケーションでもかまいません。 ( スクラッチを使った単純なベースイメージの作成 を参照)。 dockerイメージ内のバイナリがOSであろうと単なるアプリケーションであろうと、それはOSホストにとっては別のプロセスであり、事前設定されたOS境界によって支配されている包含プロセスです。
Dockerのように、実行中にプロセスに適用する境界をホストOSに指示できるその他のアプリケーションには、 _ lxc _ 、 libvirt 、および systemd があります。 Dockerはこれらのアプリケーションを使用してLinux OSと間接的に対話していましたが、現在はDockerは " libcontainer "という独自のライブラリを使用してLinuxと直接対話しています。
そのため、コンテナは、 chroot が実行していたものと同様に、制限付きモードで実行されているプロセスにすぎません。
IMOがDockerを他のコンテナー技術と一線を画しているのは、そのリポジトリー(Docker Hub)とコンテナーの取り扱いを非常に容易にするそれらの管理ツールです。
https://en.m.wikipedia.org/wiki/Docker_(Linux_container_engine) を参照してください。
多くの回答がこれを指摘したように:あなたbuildDockerfileを取得してimage and you runimageを取得してcontainer 。
ただし、次の手順は、Dockerイメージとコンテナーがどのようなものであるかをよく理解するのに役立ちました。
1)Dockerfileのビルド:
docker build -t my_image dir_with_dockerfile
2)画像を.tar
ファイルに保存します
docker save -o my_file.tar my_image_id
my_file.tar
は画像を保存します。 tar -xvf my_file.tar
で開くと、すべてのレイヤーが表示されます。各レイヤーを深く掘り下げると、各レイヤーに追加された変更を確認できます。 (これらはDockerfileのコマンドにかなり近いはずです)。
3)コンテナの内部を見るには、次のことができます。
Sudo docker run -it my_image bash
そして、あなたはそれがOSに非常によく似ていることがわかります。
Image はOOPのクラス定義と同じで、レイヤーはそのクラスの異なるメソッドとプロパティです。
コンテナ は、オブジェクトがインスタンス化またはクラスのインスタンスになるのと同じように、実際のイメージのインスタンス化です。
プログラミング面と同様に、
画像 はソースコードです。
ソースコード をコンパイルしてビルドすると、アプリケーションと呼ばれます。
「イメージのインスタンスが作成されるとき」と同様に、「 コンテナ 」と呼ばれます。
Dockerイメージは、アプリケーションとその実行に必要な環境をまとめたものです。コンテナーは、イメージの実行中のインスタンスです。
画像はdockerの梱包部分で、「ソースコード」や「プログラム」に似ています。コンテナはdockerの実行部分であり、「プロセス」に似ています。
質問では、「プログラム」部分だけが言及されています、そしてそれはイメージです。 dockerの「実行中」の部分はコンテナです。コンテナーが実行されて変更が加えられると、プロセスが独自のソースコードに変更を加えて新しいイメージとして保存したかのようになります。
要するに:
コンテナは、共通のOSを共有し、イメージ(Dockerイメージ)を実行するカーネル内の部門(仮想)です。
コンテナーは、コードを実行するためにパッケージとすべての必要な依存関係を一緒に持つ、自立的なアプリケーションです。
Dockerコンテナーはイメージのインスタンスを実行しています。画像とプログラム、コンテナとプロセスを関連付けることができます:)
画像は、オブジェクトへのコンテナとしてのクラスに対するものです。
オブジェクトはクラスのインスタンスなので、コンテナは画像のインスタンスです。
最初に説明した方が良いと思います。
次のコマンドを実行するとします:Docker run hello-world。何が起こるのですか ?
これは、docker cliを呼び出します。これは、dockerコマンドを受け取り、docker serverコマンドを呼び出すように変換する役割を果たします。 docker serverがimageを実行するコマンドを取得するとすぐに、天気imagesキャッシュimageそのような名前を保持します。 hello-worldが存在しないと仮定します。 docker serverはdockerハブに移動します(dockerハブは単なる画像の無料リポジトリです)尋ねます、ちょっとハブ、持っていますかhello-worldと呼ばれるimage?ハブの応答-はい。お願いしますダウンロードプロセスが開始されます。 docker imageがダウンロードされるとすぐに、docker serverがimage cache。
Dockerイメージとdocker containerとは何かを説明する前に、コンピューターのオペレーティングシステムとソフトウェアの実行方法について紹介しましょう。
たとえば、コンピューターでchromeを実行すると、オペレーションシステムが呼び出され、オペレーションシステム自体がカーネルを呼び出して、このプログラムを実行するように求められます。カーネルは、ハードディスクからファイルを実行します。
2つのプログラムchromeとnodejsがあると想像してください。 chromeの実行にはpythonバージョン2が必要で、nodejsの実行にはpythonバージョン3が必要です。コンピューターにpython v2のみをインストールした場合、chromeのみが実行されます。
両方のケースを機能させるには、なんとかしてネームスペースと呼ばれる運用システム機能を使用する必要があります。名前空間は、プロセス、ハードドライブ、ネットワーク、ユーザー、ホスト名などを分離する機会を提供する機能です。
したがって、Imageについて話すとき、実際にはファイルシステムのスナップショットについて話します。 imageは、特定のcontainerを構築するための指示とメタデータを含む物理ファイルです。 Container自体はimageのインスタンスであり、これにのみ使用可能な名前空間を使用してハードドライブを分離しますコンテナ。 containerは、それに割り当てられた異なるリソースをグループ化するプロセスまたはプロセスのセットです。
Dockerfileは、tarball(Dockerイメージ)を生成するあなたのbashスクリプトのようなものです。
Dockerコンテナはtarballの展開版のようなものです。あなたは別のフォルダ(コンテナ)に好きなだけコピーを持つことができます
ダミープログラミングの例えとして、Dockerには store から来るImageFactoryを保持する抽象的なImageFactoryがあると考えることができます。
そのImageFactoryからアプリを作成したい場合は、新しいコンテナーが用意されているので、必要に応じてそれを変更できます。 DotNetImageFactoryは不変になります。これは、抽象ファクトリクラスとして機能し、必要なインスタンスのみを配信するためです。
IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();
Image - コンテナの構成要素です。これは実際には仮想の一種のスナップショットですが、より軽量です。
コンテナ - アプリケーションとその関連依存関係をリソース分離プロセスで実行できるように、オペレーティングシステムを仮想化する方法です。
Dockerを使用している間は、現時点ではベースイメージを取得しています。それを起動し、適切な変更を加え、それらの変更を別のイメージを形成するレイヤーに保存します。コンテナーは基本的にはイメージのインスタンスです。つまり、実行中のイメージはコンテナです。人が画像を作成した場合、その人は現時点で実際にコンテナを実行しています。同じ画像を一度にいくつか実行中のコンテナを持つことができます。
次のコードを使ってすべての画像を見ることができます。
ドッカー画像
実行中のコンテナは次のように表示されます。
docker ps
実行中かどうかにかかわらず、すべてのコンテナを見たい場合は、次のようにします。
docker ps -a