web-dev-qa-db-ja.com

Dockerイメージとコンテナーの違いは何ですか?

Dockerを使うときは、まずベースイメージから始めます。起動して変更を作成すると、それらの変更は別のイメージを形成するレイヤーに保存されます。

それで結局私は私のPostgreSQLインスタンスのためのイメージと私のWebアプリケーションのためのイメージを持っています。

だから質問は:コンテナとは何ですか?

661
bibstha

画像のインスタンスはコンテナと呼ばれます。あなたはイメージを持っています。それはあなたが説明したような一連のレイヤーです。この画像を起動すると、この画像の実行中のコンテナがあります。同じ画像の実行中のコンテナを多数持つことができます。

すべての画像をdocker imagesで見ることができますが、実行中のコンテナをdocker psで見ることができます(そしてすべてのコンテナをdocker ps -aで見ることができます)。

したがって、イメージの実行中のインスタンスはコンテナです。

912
Thomas Uhrig

Dockerデプロイメントの自動化 :に関する私の記事から

Dockerイメージとコンテナー

Dockerlandには、imagescontainersがあります。この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

注意すべき点:

  1. IMAGE IDは、画像の真の識別子の最初の12文字です。特定の画像の多くのタグを作成できますが、それらのIDはすべて同じです(上記を参照)。
  2. VIRTUAL SIZEはvirtualです。これは、すべての個別の基になるレイヤーのサイズを合計しているためです。これは、その列のすべての値の合計が、それらすべてのイメージで使用されるディスク容量よりもはるかに大きいことを意味します。
  3. REPOSITORY列の値は、-tコマンドのdocker buildフラグ、または既存のイメージのdocker tag- ingから取得されます。意味のある命名法を使用して画像に自由にタグ付けできますが、Dockerはdocker Pushまたはdocker pullのレジストリの場所としてタグを使用することを知っています。
  4. タグの完全な形式は[REGISTRYHOST/][USERNAME/]NAME[:TAG]です。上記のubuntuの場合、REGISTRYHOSTはregistry.hub.docker.comであると推測されます。したがって、my-applicationという名前の画像をdocker.example.comのレジストリに保存する場合は、その画像docker.example.com/my-applicationにタグを付ける必要があります。
  5. TAG列は、fullタグの[:TAG]部分です。これは残念な用語です。
  6. latestタグは魔法ではありません。タグを指定しない場合の単なるデフォルトのタグです。
  7. IMAGE IDでのみ識別可能なタグなし画像を作成できます。これらは<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バージョンを実行しているため、画像を保存するプライベートな場所があります。繰り返しますが、注意すべき点がいくつかあります。

  1. IMAGE IDと同様に、CONTAINER IDはコンテナの真の識別子です。同じ形式ですが、異なる種類のオブジェクトを識別します。
  2. docker psは、runningコンテナのみを出力します。 docker ps -aを使用して、すべてのコンテナ(runningまたはstopped)を表示できます。
  3. NAMESを使用して、--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であり、将来のリリースで対処される可能性があります。ただし、画像とコンテナを明確に理解していれば、これらの状況はいくつかの方法で回避できます。

  1. docker rm [CONTAINER_ID]を使用して、停止した不要なコンテナを常に削除します。
  2. docker rmi [IMAGE_ID]を使用して、役に立たない停止したコンテナの背後の画像を常に削除します。
525
paislee

コンテナーを実行中のイメージと考えるのが最も簡単ですが、これは まったく 正確ではありません。

画像は実際にはコンテナに変えることができるテンプレートです。イメージをコンテナに変換するために、Dockerエンジンはイメージを取得し、読み書き可能なファイルシステムを一番上に追加し、ネットワークポート、コンテナ名、ID、リソース制限などのさまざまな設定を初期化します。実行中のコンテナには現在実行中のプロセスがありますが、コンテナを停止することもできます(またはDockerの用語では 終了 )。終了したコンテナは再起動することができ、その設定とファイルシステムの変更を保持するため、 not はイメージと同じです。

104
Adrian Mouat

簡単に言えば。

画像 -

コンテナーを作成するために使用されるファイルシステムおよび構成(読み取り専用)アプリケーション。 より詳しく

コンテナ -

これらはDockerイメージの実行中のインスタンスです。コンテナは実際のアプリケーションを実行します。コンテナには、アプリケーションとそのすべての依存関係が含まれています。カーネルを他のコンテナと共有し、ホストOS上のユーザースペースで独立したプロセスとして実行されます。 より詳しく


注意する他の重要な用語:


Dockerデーモン -

Dockerコンテナーの構築、実行、および配布を管理する、ホスト上で実行されているバックグラウンドサービス。

Dockerクライアント -

ユーザーがDockerデーモンと対話できるようにするコマンドラインツール。

Dockerストア -

Storeは、とりわけDockerイメージのレジストリです。あなたはすべての利用可能なDockerイメージのディレクトリとしてレジストリを考えることができます。

this blogからの写真は千語の価値があります。

Enter image description here

(より深い理解のために これ を読んでください。)

概要:

  • Dockerハブから image を引き出すか、またはDockerfileからビルドする=> Dockerイメージを作成する(編集不可)。
  • 画像を実行する(docker run image_name:tag_name)=>実行中の画像、すなわちコンテナを編集可能にします
91
Imran

ワークフロー全体を説明するのが役に立つかもしれません。

すべては Dockerfile で始まります。 DockerfileはImageのソースコードです。

Dockerfileが作成されたら、それをビルドしてコンテナーの image を作成します。このイメージは、Dockerfileである「ソースコード」の「コンパイル済みバージョン」です。

コンテナのイメージを取得したら、 registry を使用してそれを再配布する必要があります。レジストリはgitリポジトリのようなものです - 画像をプッシュしたりプルしたりすることができます。

次に、このイメージを使って container を実行できます。実行中のコンテナは、多くの点で仮想マシンと非常に似ています(ただし ハイパーバイザ はありません)。

この記事 はdockerコンテナに関する多くの基本的なことを説明しています(DockerとPuppetについて話していますが、どんな状況でも使える概念はたくさんあります)

78
Tk421

ワークフロー

これは、さまざまなコマンドとそれに関連する入出力を示すエンドツーエンドのワークフローです。これで画像とコンテナの関係が明確になります。

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

実行できる画像を一覧表示するには、次のコマンドを実行します。

docker image ls

コンテナを一覧表示するには、コマンドを実行します。

docker ps
38

ここですべての質問を読んだにも関わらずimageおよびlayerの概念を理解できず、最終的にこれにつまずいた Dockerの優れたドキュメント (だよ!)。

この例は、概念全体を理解するための鍵です。これは長い記事なので、明確にするために本当に把握する必要がある重要なポイントを要約しています。

  • イメージ:Dockerイメージは一連の読み取り専用から構築されますレイヤー

  • Layer:各レイヤーは、画像のDockerfile内の命令を表します。

Example:以下のDockerfileには4つのコマンドが含まれており、それぞれがレイヤーを作成します。

Ubuntuから:15.04

コピー/ app

RUN make/app

CMD python /app/app.py

重要、各レイヤーはその前のレイヤーとの違いのみです。

  • コンテナ。新しいコンテナを作成すると、下にあるレイヤーの上に新しい書き込み可能なレイヤーを追加します。この層は、多くの場合「コンテナ層」と呼ばれます。新しいファイルの書き込み、既存のファイルの変更、ファイルの削除など、実行中のコンテナに加えられたすべての変更は、このthin writable container layerに書き込まれます。

したがって、コンテナーとイメージの主な違いは、最上部の書き込み可能なレイヤーです。新しいデータを追加したり、既存のデータを変更したりするコンテナへの書き込みはすべて、この書き込み可能なレイヤーに保存されます。コンテナが削除されると、書き込み可能なレイヤーも削除されます。基になる画像は変更されません。

ディスク上のサイズの観点からの画像とコンテナの理解

実行中のコンテナのおおよそのサイズを表示するには、docker ps -sコマンドを使用できます。 2つの出力としてsizevirtual sizeを取得します。

  • サイズ:各コンテナの書き込み可能なレイヤーに使用されるデータ(ディスク上の)の量

  • 仮想サイズ:コンテナが使用する読み取り専用画像データに使用されるデータの量。複数のコンテナは、読み取り専用の画像データの一部またはすべてを共有できます。 これらは加算的ではありません。つまりすべての仮想サイズを追加して、イメージで使用されるディスク上のサイズを計算することはできません

もう1つの重要な概念は、コピーオンライト戦略です

ファイルまたはディレクトリがイメージ内の下位レイヤーに存在し、別のレイヤー(書き込み可能なレイヤーを含む)が読み取りアクセスを必要とする場合、既存のファイルを使用します。最初に別のレイヤーがファイルを変更する必要がある場合(イメージの構築時またはコンテナーの実行時)、ファイルはそのレイヤーにコピーされ、変更されます。

私のような他の人の助けになることを願っています。

37
HopeKing

Dockerfile >(ビルド)> Image >(実行)> コンテナ

  • Dockerfile :お使いのオペレーティングシステムを好きなように準備し、すべてのソフトウェアをインストール/設定する一連のdocker命令が含まれています。

  • Image :コンパイル済みDockerfile。コンテナーを実行する必要があるたびにDockerfileを再作成する手間を省きます。そしてそれはあなたの規定コードを隠す方法です。

  • コンテナ :仮想オペレーティングシステムそれ自体で、あなたはそれにsshして、まるでそれが実環境であるかのように、あなたが望むどんなコマンドでも実行することができます。同じImageから1000以上のコンテナを実行できます。

23
Mahmoud Zalt

Dockerのコアコンセプトは、この場合はコンテナと見なすことができる「マシン」を簡単に作成できるようにすることです。コンテナは再利用性に役立ち、コンテナを簡単に作成および削除できます。

画像はあらゆる時点でのコンテナの状態を表しています。したがって、基本的なワークフローは次のとおりです。

  1. 画像を作成する
  2. コンテナを起動する
  3. コンテナに変更を加える
  4. コンテナを画像として保存する
11
kweku360

簡単に言うと、 image class の場合、 container はクラスのインスタンスであり、 object はランタイムです。

11
kogoia

コンテナは、どの制限を適用するかを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) を参照してください。

11
AleQ

多くの回答がこれを指摘したように:あなた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に非常によく似ていることがわかります。

6
Akavall

Image はOOPのクラス定義と同じで、レイヤーはそのクラスの異なるメソッドとプロパティです。

コンテナ は、オブジェクトがインスタンス化またはクラスのインスタンスになるのと同じように、実際のイメージのインスタンス化です。

3
Rohit Salecha

プログラミング面と同様に、

画像 はソースコードです。

ソースコード をコンパイルしてビルドすると、アプリケーションと呼ばれます。

「イメージのインスタンスが作成されるとき」と同様に、「 コンテナ 」と呼ばれます。

3
Nandakumar

Dockerイメージは、アプリケーションとその実行に必要な環境をまとめたものです。コンテナーは、イメージの実行中のインスタンスです。

画像はdockerの梱包部分で、「ソースコード」や「プログラム」に似ています。コンテナはdockerの実行部分であり、「プロセス」に似ています。

質問では、「プログラム」部分だけが言及されています、そしてそれはイメージです。 dockerの「実行中」の部分はコンテナです。コンテナーが実行されて変更が加えられると、プロセスが独自のソースコードに変更を加えて新しいイメージとして保存したかのようになります。

3
div

要するに:

コンテナは、共通のOSを共有し、イメージ(Dockerイメージ)を実行するカーネル内の部門(仮想)です。

コンテナーは、コードを実行するためにパッケージとすべての必要な依存関係を一緒に持つ、自立的なアプリケーションです。

Dockerコンテナーはイメージのインスタンスを実行しています。画像とプログラム、コンテナとプロセスを関連付けることができます:)

1
Rahul Bagad

画像は、オブジェクトへのコンテナとしてのクラスに対するものです。

オブジェクトはクラスのインスタンスなので、コンテナは画像のインスタンスです。

1
Rodolfo

最初に説明した方が良いと思います。

次のコマンドを実行するとします:Docker run hello-world。何が起こるのですか ?

これは、docker cliを呼び出します。これは、dockerコマンドを受け取り、docker serverコマンドを呼び出すように変換する役割を果たします。 docker serverimageを実行するコマンドを取得するとすぐに、天気imagesキャッシュimageそのような名前を保持します。 hello-worldが存在しないと仮定します。 docker serverdockerハブに移動します(dockerハブは単なる画像の無料リポジトリです)尋ねます、ちょっとハブ、持っていますかhello-worldと呼ばれるimage?ハブの応答-はい。お願いしますダウンロードプロセスが開始されます。 docker imageがダウンロードされるとすぐに、docker serverimage cache

Dockerイメージとdocker containerとは何かを説明する前に、コンピューターのオペレーティングシステムとソフトウェアの実行方法について紹介しましょう。

たとえば、コンピューターでchromeを実行すると、オペレーションシステムが呼び出され、オペレーションシステム自体がカーネルを呼び出して、このプログラムを実行するように求められます。カーネルは、ハードディスクからファイルを実行します。

2つのプログラムchromeとnodejsがあると想像してください。 chromeの実行にはpythonバージョン2が必要で、nodejsの実行にはpythonバージョン3が必要です。コンピューターにpython v2のみをインストールした場合、chromeのみが実行されます。

両方のケースを機能させるには、なんとかしてネームスペースと呼ばれる運用システム機能を使用する必要があります。名前空間は、プロセス、ハードドライブ、ネットワーク、ユーザー、ホスト名などを分離する機会を提供する機能です。

したがって、Imageについて話すとき、実際にはファイルシステムのスナップショットについて話します。 imageは、特定のcontainerを構築するための指示とメタデータを含む物理ファイルです。 Container自体はimageのインスタンスであり、これにのみ使用可能な名前空間を使用してハードドライブを分離しますコンテナcontainerは、それに割り当てられた異なるリソースをグループ化するプロセスまたはプロセスのセットです。

0

Dockerfileは、tarball(Dockerイメージ)を生成するあなたのbashスクリプトのようなものです。

Dockerコンテナはtarballの展開版のようなものです。あなたは別のフォルダ(コンテナ)に好きなだけコピーを持つことができます

0
haalcala

ダミープログラミングの例えとして、Dockerには store から来るImageFactoryを保持する抽象的なImageFactoryがあると考えることができます。

そのImageFactoryからアプリを作成したい場合は、新しいコンテナーが用意されているので、必要に応じてそれを変更できます。 DotNetImageFactoryは不変になります。これは、抽象ファクトリクラスとして機能し、必要なインスタンスのみを配信するためです。

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();
0
Teoman shipahi
  1. Image - コンテナの構成要素です。これは実際には仮想の一種のスナップショットですが、より軽量です。

  2. コンテナ - アプリケーションとその関連依存関係をリソース分離プロセスで実行できるように、オペレーティングシステムを仮想化する方法です。

Dockerを使用している間は、現時点ではベースイメージを取得しています。それを起動し、適切な変更を加え、それらの変更を別のイメージを形成するレイヤーに保存します。コンテナーは基本的にはイメージのインスタンスです。つまり、実行中のイメージはコンテナです。人が画像を作成した場合、その人は現時点で実際にコンテナを実行しています。同じ画像を一度にいくつか実行中のコンテナを持つことができます。

次のコードを使ってすべての画像を見ることができます。

ドッカー画像

実行中のコンテナは次のように表示されます。

docker ps

実行中かどうかにかかわらず、すべてのコンテナを見たい場合は、次のようにします。

docker ps -a

0
Prakash