ウェブサイト検索

Dockerイメージとコンテナはホスト上のどこに保存されていますか?


Dockerは、実行中のプロセスを表すために2種類のフォーマットを使用します---イメージとコンテナで、両方ともコンピュータのドライブにデータを保存します。私たちは、Dockerがデータを扱うために提供するコマンドについて話し、これらを使用してイメージおよびコンテナファイルにアクセスする方法を説明します。

画像とコンテナの違い

画像は、あなたが走るときに作り出すものです。

docker build

それらはDocker Hubのようなコンテナレジストリに保存されており、アプリを実行するためのすべてのファイルやコードが含まれています。それらは仮想マシンのオペレーティングシステム用のISOファイルのように考えることができます。

コンテナはイメージから作成され、アプリケーションを実行する実際の仮想マシンのようなものです。同じイメージから複数のコンテナを並行して実行することができます。各コンテナには独自のファイルシステムがあり、必要に応じてホストからコンテナにデータを結びつける「ボリュームマウント」で作成されることがあります。

Dockerイメージストレージの操作

画像はドライブに画像の全内容を保存します。インターネットから画像を取り込むたびに、それはダウンロードされて保存され、通常は永遠に保存されます。画像は非常に大きくなることがあるため、特にストレージが限られたラップトップでは、時間が経つにつれて容量が増えてしまう可能性があります。

画像データに直接アクセスしたい場合、通常は次の場所に保存されています:

  • Linux :

    /var/lib/docker/
  • ウィンドウズ :

    C:ProgramDataDockerDesktop
  • macOS :

    ~/Library/Containers/com.docker.docker/Data/vms/0/

しかし、このデータに触れるのは悪いアイデアである可能性が高いです。Dockerのストレージは複雑で、実際にどのストレージドライバーを使用しているかによって大きく異なります。Linuxは現在、デフォルトで

overlay2

ほとんどのディストリビューションでは、ほとんどのエンドユーザーがアクセスできないものです。これに手を加えるとデータの損失につながる可能性があります。

その代わりに、Dockerは画像を管理するための管理コマンドを提供します。ダウンロードした画像のすべてのバージョンは、簡単なコマンドで表示できます:

docker image ls

幸運なことに、Dockerイメージは増分でバージョンを保存しているため、見た目ほど悪くありません。つまり、新しいバージョンをダウンロードするたびに、変更された部分だけが置き換えられます。同じイメージを何度も繰り返し使用する場合、ストレージコストがそれほどかさむことはないでしょう。

ただし、さまざまな画像を多く使用している場合、もはや使用されていない画像が多数保存されている可能性があります。これを整理するために、Dockerはガーベジコレクションを実行するための組み込みコマンドを提供しています。これにより、参照がないすべての画像、つまりタグ付けされていないか、コンテナによって参照されていないものが削除されます。

docker image prune

すべての古い画像を削除するには、-a フラグを付けて実行します:

docker image prune -a

それが主な使用ケースをカバーしていますが、いくつかの便利なコマンドがあります:

  • inspect: コンテナのバージョンに関する情報を表示します。
  • 保存と読み込み: 画像をtarアーカイブに保存し、読み込みます。
  • rm: 画像を直接削除します。
  • プル/プッシュ: リモートレジストリからのアップデート。
  • history: 変更履歴を提供します。

Dockerコンテナストレージの操作

コンテナに関するすべての情報は、docker inspectを使用して表示できます。これにより、ファイルシステムドライバーやデータ、既存のマウントとボリュームがすべて表示されます。

docker inspect containerID

コンテナはデータを二つの方法で保存します。まず最初は、イメージからコピーされたベースファイルシステムで、これは各コンテナ固有のものです。Dockerは「ローアーディレクトリ」と「アッパーディレクトリ」を使用しており、これは一つのハイブリッドファイルシステムに統合される別々のレイヤーです。ローアーディレクトリはベースイメージデータを保存し、アッパーディレクトリは実行時に変更されたすべてのデータ、たとえばログファイルを保存します。いずれにせよ、これらのストレージはDockerが使用するように設定されたファイルシステムドライバに依存します。

次に、マウントがあります。これはホストからコンテナへのディレクトリをバインドし、通常はボリュームと呼ばれるDockerの機能によって自動的に管理されます。これらは通常保存され、エンドユーザーがアクセスできます。実行中のコンテナのデータを変更する必要がある作業を行う場合は、おそらくボリュームまたはバインドマウントを変更するべきです。

ボリュームにアクセスする

バインドマウントは直接アクセスでき、多くのコンテナで使用される設定を保存する場合や、コンテナの再起動をまたいで持続するアクセス可能なデータを保存する場合に最適な選択肢です。

ボリュームに保存されたデータを変更したい場合も可能です。これらはLinuxからアクセス可能な標準フォーマットで保存されています。

/var/lib/docker/volumes/volumeID/_data

ボリュームIDと情報はdocker volume inspectを使用して取得できます。

画像と同様に、ボリュームも古くなることがあります。ボリュームは簡単に削除できますが、バックアップと転送はより複雑なプロセスです。

docker volume prune

docker volume rm volumeID

Dockerコンテナのファイルシステムを修正する

コンテナのファイルシステムを変更したい場合、画像と同様に、これは悪いアイデアです。ほとんどの場合、更新された変更を含む新しいバージョンのコンテナを作成し、アップデートを展開すべきです。

ただし、コンテナを停止せずにすぐに変更を加えたい場合は、コンテナ内でbashシェルを開いてDockerを通じて変更するのが最良の方法です。これを行うのは非常に簡単です。コンテナでdocker execを実行し、コマンドとして「bash」を渡してください:

docker exec -it container bash

ここからは、通常のLinuxコマンドを自由に使用できます。リモートでこれを行いたい場合は、コンテナにSSHサーバーをインストールし、ポート22をホストの別のポートにバインドすることができます。

関連記事: