Dockerは、実行中のプロセスを表すために2種類の形式(イメージとコンテナー)を使用し、どちらもコンピューターのドライブにデータを保存します。 Dockerがデータを処理するために提供するコマンドと、それらを使用してイメージファイルとコンテナーファイルにアクセスする方法について説明します。
画像とコンテナの違い
画像は、docker build
を実行したときに作成するものです;これらはDockerHubなどのコンテナレジストリに保存され、アプリを実行するためのすべてのファイルとコードが含まれています。それらは、仮想マシンオペレーティングシステムのISOファイルのように考えることができます。
コンテナはイメージから作成され、アプリケーションを実行する実際の仮想マシンのようなものです。同じイメージから複数のコンテナーが並行して実行されている場合があります。各コンテナには独自のファイルシステムがあり、オプションで、ホストからコンテナにデータをバインドする「ボリュームマウント」で作成されます。
Dockerイメージストレージの操作
画像は、画像の内容全体をドライブに保存します。インターネットから画像を取得するたびに、通常は永久にダウンロードおよび保存されます。画像は非常に大きくなる可能性があるため、特にストレージが限られているラップトップの場合、これは時間の経過とともに増加する可能性があります。
画像データに直接アクセスする場合は、通常、次の場所に保存されます。
- Linux:
/var/lib/docker/
- Windows:
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
:コンテナのバージョンに関する情報を表示します。save & load
:画像を保存してtar
にロードします アーカイブ。-
rm
:画像を直接削除します。 pull/push
:リモートレジストリからの更新。history
:変更ログを提供します。
Dockerコンテナストレージの操作
docker inspect
を使用して、コンテナに関するすべての情報を表示できます 、ファイルシステムドライバとデータ、および既存のすべてのマウントとボリュームが表示されます。
docker inspect containerID
コンテナは2つの方法でデータを保存します。 1つは、イメージからコピーされ、各コンテナに固有のベースファイルシステムです。 Dockerは、「下位ディレクトリ」と「上位ディレクトリ」を使用します。これらは、1つのハイブリッドファイルシステムにマージされる個別のレイヤーです。下のディレクトリにはベースイメージデータが格納され、上のディレクトリにはログファイルなどの実行時に変更されたすべてのものが格納されます。いずれの場合も、これらのストレージは、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をホスト上の別のポートにバインドできます。
関連: DockerコンテナにSSHで接続する方法