Docker イメージの操作方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、コンテナを作成および実行するための基礎となる Docker イメージを探ります。Docker Hub からイメージを取得する方法、異なるイメージ バージョンを使用してコンテナを実行する方法、イメージを一覧表示および削除する方法、イメージ レイヤーを理解する方法、イメージを検索する方法、および基本的なイメージ タグ付けを行う方法について学びます。この実践的な経験は、Docker イメージを効果的に操作するための必須スキルを提供します。Docker に慣れていない場合は心配しないでください。詳細な説明付きで各ステップを案内します。

Docker Hub からイメージを取得する

Docker Hub は、コードに関しては GitHub に似た Docker イメージの公開リポジトリです。ここでは、多くの人気のあるソフトウェア アプリケーションやオペレーティング システム用の事前構築済みイメージを見つけることができます。まずは公式の Nginx イメージを取得(ダウンロード)しましょう。

システム上のターミナルを開きます。以下のようなプロンプトが表示されるはずです。

labex:project/ $

次に、Nginx イメージを取得しましょう。以下のコマンドを入力して Enter キーを押します。

docker pull nginx

このコマンドは、Docker に対して Docker Hub から Nginx イメージの最新バージョンをダウンロードするように指示します。以下のような出力が表示されるはずです。

Using default tag: latest
latest: Pulling from library/nginx
5040bd298390: Pull complete
d7a91cdb22f0: Pull complete
9cac4850e5df: Pull complete
Digest: sha256:33ff28a2763feccc1e1071a97960b7fef714d6e17e2d0ff573b74825d0049303
Status: Downloaded newer image for nginx:latest

ここで起こっていることを解説しましょう。

  1. "Using default tag: latest" - バージョンを指定しない場合、Docker は最新バージョンが必要だと仮定します。
  2. 次の数行では、Docker がイメージの異なる「レイヤー」をダウンロードしている様子が表示されます。各レイヤーは、ファイルシステムの変更のセットを表しています。
  3. "Digest" は、この正確なバージョンのイメージに固有の識別子です。
  4. 最後の行は、イメージが正常にダウンロードされたことを確認しています。

イメージをダウンロードしたので、システムにイメージがあることを確認しましょう。Docker がローカルに持っているすべてのイメージを一覧表示することで確認できます。

docker images

以下のような出力が表示されるはずです。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    605c77e624dd   2 weeks ago    141MB

これは次のことを示しています。

  • REPOSITORY: イメージの名前 (nginx)
  • TAG: イメージのバージョン (latest)
  • IMAGE ID: このイメージに固有の識別子
  • CREATED: このバージョンのイメージが作成された日付
  • SIZE: イメージが占有するディスク スペースのサイズ

正確な数字が異なっていても心配しないでください。重要なのは、nginx のエントリが表示されることです。

システムにある他のイメージが気になる場合は、「jenkins/jenkins」や「gcr.io/k8s-minikube/kicbase」のエントリが表示されるかもしれません。これらは、この実験では使用しない事前インストール済みのイメージです。

イメージの異なるバージョンを実行する

Docker を使えば、タグを使ってイメージの特定のバージョンを実行できます。タグは、イメージの特定のバージョンのエイリアスのようなものです。Python イメージを使ってこの概念を調べてみましょう。

まず、最新の Python イメージを取得しましょう。

docker pull python

Nginx イメージを取得したときと同じような出力が表示されます。これは Python の最新バージョンをダウンロードしています。

次に、Python の特定のバージョン、たとえば 3.7 バージョンを取得しましょう。

docker pull python:3.7

python の後に :3.7 を追加したことに注目してください。これは、最新バージョンではなく、特定に 3.7 バージョンを取得するよう Docker に指示しています。

Python イメージを一覧表示して、異なるバージョンを見てみましょう。

docker images python

以下のような出力が表示されるはずです。

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
python       3.7       1f1a7b570fbd   2 weeks ago    907MB
python       latest    98ccd1643c71   2 weeks ago    920MB

これで 2 つの Python イメージがあります。1 つは latest とタグ付けされており(これは実際には、この実験を行っている時期に応じて Python 3.9 または 3.10 です)、もう 1 つは 3.7 とタグ付けされています。

これらの異なるバージョンを使ってコンテナを実行して、違いを見てみましょう。

docker run --rm python:latest python --version

このコマンドはいくつかのことを行います。

  1. docker run は新しいコンテナを作成して起動します。
  2. --rm は、コンテナが終了した後にコンテナを削除するよう Docker に指示します。
  3. python:latest は使用するイメージを指定します。
  4. python --version はコンテナ内で実行するコマンドです。

出力に最新の Python バージョンが表示されるはずです。

次に、Python 3.7 で同じことを行いましょう。

docker run python:3.7 python --version

今回は、出力に Python 3.7.x が表示されるはずです。ここで x は Python 3.7 の最新のパッチ バージョンです。

これらのコマンドは、同じソフトウェアの異なるバージョンを異なるイメージ タグを使ってどのように使用できるかを示しています。特定のバージョンの Python(または他のソフトウェア)が必要なアプリケーションを実行する必要がある場合、これは非常に便利です。

イメージの一覧表示と削除

Docker を使用する際、時間の経過とともにイメージが蓄積されていきます。これらのイメージをどのように管理するか、つまり一覧表示する方法や不要になったイメージを削除する方法を知ることが重要です。

まず、システム上のすべてのイメージを一覧表示しましょう。

docker images

これまでに取得したすべてのイメージの一覧が表示されるはずです。その中には、Nginx や Python イメージも含まれています。

次に、Python 3.7 イメージを削除してスペースを確保したいとしましょう。これは docker rmi コマンド(rmi は「remove image」の略)を使用して行うことができます。

docker rmi python:3.7

このコマンドが成功すると、以下のような出力が表示されます。

Untagged: python:3.7
Untagged: python@sha256:1f93c63...
Deleted: sha256:1f1a7b57...
Deleted: sha256:8c75ecde...
...

ただし、代わりに以下のようなエラー メッセージが表示される場合もあります。

Error response from daemon: conflict: unable to remove repository reference "python:3.7" (must force) - container <container_id> is using its referenced image <image_id>

このエラーは、このイメージから作成されたコンテナ(実行中または停止中)が存在する場合に発生します。システムの整合性を維持するため、Docker は使用中のイメージの削除を防いでいます。

これを解消するには、まずこのイメージを使用しているすべてのコンテナを削除する必要があります。すべてのコンテナ(停止しているものも含む)を一覧表示しましょう。

docker ps -a

python:3.7 イメージから作成されたコンテナを探します。見つかった場合は、docker rm コマンドを使用して削除します。

docker rm <container_id>

<container_id> を削除したいコンテナの実際の ID に置き換えてください。

今度はもう一度イメージを削除してみましょう。

docker rmi python:3.7

今回は成功するはずです。

Python イメージを再び一覧表示して、イメージが削除されたことを確認しましょう。

docker images python

一覧に Python 3.7 イメージがもう表示されないはずです。

イメージ レイヤーの理解

Docker イメージは、階層型のファイルシステムを使って構築されます。各レイヤーは、ファイルシステムの変更のセットを表しています。この階層型のアプローチにより、Docker はストレージとネットワークの使用効率を高めることができます。この概念を調べてみましょう。

まず、先ほど取得した Nginx イメージのレイヤーを調べましょう。

docker inspect --format='{{.RootFS.Layers}}' nginx

以下のような出力が表示されるはずです。

[sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8 sha256:b5357ce95c68acd9c9672ec76e3b2a2ff3f8f62a2bcc1866b8811572f4d409af]

これらの長い文字列(SHA256 ハッシュと呼ばれます)のそれぞれが、イメージ内の 1 つのレイヤーを表しています。各レイヤーは、イメージを構築するために使用される Dockerfile 内のコマンドに対応しています。

レイヤーをよりよく理解するために、簡単なカスタム イメージを作成しましょう。まず、現在のディレクトリに新しい Dockerfile という名前のファイルを作成します。

nano Dockerfile

このファイルに、以下の内容を追加します。

FROM nginx
RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html

この Dockerfile は 2 つのことを行います。

  1. 先ほど取得した Nginx イメージから始めます (FROM nginx)
  2. イメージに新しいファイルを追加します (RUN echo...)

ファイルを保存して終了します(nano では、Ctrl+X を押してから Y を押し、その後 Enter を押すことで行えます)。

次に、このイメージを構築しましょう。

docker build -t custom-nginx.

サンプル出力:

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 5ef79149e0ec
Step 2/2 : RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
 ---> Running in 2fa43e649234
Removing intermediate container 2fa43e649234
 ---> 73b62663b5c3
Successfully built 73b62663b5c3
Successfully tagged custom-nginx:latest

このコマンドは、Dockerfile に基づいて新しいイメージを構築し、それを custom-nginx とタグ付けします。末尾の . は、Docker に対して現在のディレクトリにある Dockerfile を探すよう指示します。

次に、カスタム イメージのレイヤーを調べましょう。

docker inspect --format='{{.RootFS.Layers}}' custom-nginx

元の Nginx イメージよりも 1 つ多いレイヤーがあることに気付くでしょう。この追加のレイヤーは、RUN コマンドによって行われた変更を表しています。

レイヤーを理解することは重要です。その理由は以下の通りです。

  1. レイヤーはキャッシュされるため、似たようなイメージの構築を高速化します。
  2. レイヤーはイメージ間で共有されるため、ディスク スペースが節約されます。
  3. イメージをプッシュまたはプルする際、変更されたレイヤーのみを転送する必要があります。

Docker Hub でイメージを検索する

Docker Hub には膨大な数のイメージが保管されています。Docker Hub のウェブサイトでイメージを検索することもできますが、Docker はコマンドライン ツールも提供しており、ターミナルから直接イメージを検索できます。

まず、Nginx イメージを検索してみましょう。

docker search nginx

これにより、Nginx に関連するイメージの一覧が返されます。出力にはいくつかの列が含まれています。

  • NAME: イメージの名前
  • DESCRIPTION: イメージの簡単な説明
  • STARS: Docker Hub でのイメージの星の数(人気を示す)
  • OFFICIAL: これが Docker によって維持される公式イメージかどうか
  • AUTOMATED: このイメージが GitHub リポジトリから自動的に構築されているかどうか

たとえば、以下のようなものが表示されるかもしれません。

NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15763     [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker c...   2088                 [OK]
...

公式の Nginx イメージは通常、この一覧の上部に表示されます。

次に、Python の特定のバージョンを検索してみましょう。

docker search python:3.8

この検索が期待通りに機能しないことに気付くでしょう。Docker の検索は、特定のタグ(たとえば 3.8)の検索をサポートしていません。代わりに、名前または説明に "python:3.8" が含まれるイメージを検索します。

特定のバージョンのイメージを見つけるには、次の方法がより良い場合が多いです。

  1. 一般的なイメージ名を検索する(たとえば、docker search python
  2. より詳細な情報を得るために Docker Hub のウェブサイトを訪問する
  3. docker pull を使用してイメージをダウンロードし、その後ローカルで調べる

覚えておいてください。docker search はイメージを見つけるための迅速な方法ですが、より詳細な情報を得るには、Docker Hub のウェブサイトの方が多くの場合便利です。

イメージの保存と読み込み

Docker を使えば、イメージを tar ファイルとして保存し、後で読み込むことができます。これは、レジストリを使わずにシステム間でイメージを転送したり、イメージをバックアップする際に便利です。

まず、Nginx イメージをファイルに保存しましょう。

docker save nginx > nginx.tar

このコマンドは、Nginx イメージを現在のディレクトリにある nginx.tar という名前のファイルに保存します。> 記号は、docker save コマンドの出力をファイルにリダイレクトするために使用されます。

現在のディレクトリの内容を一覧表示することで、ファイルが作成されたことを確認できます。

ls -lh nginx.tar

nginx.tar ファイルがサイズ(100MB 以上であるはず)とともに一覧表示されるはずです。

次に、Nginx イメージをシステムから削除して、それがないシステムにイメージを転送することをシミュレートしましょう。

docker rmi nginx

イメージが削除されたことを確認します。

docker images nginx

結果が表示されないはずで、これは Nginx イメージがシステムから削除されたことを示しています。

次に、tar ファイルからイメージを再度読み込みましょう。

docker load < nginx.tar

< 記号は、nginx.tar ファイルの内容を docker load コマンドの入力としてリダイレクトするために使用されます。

読み込みが完了した後、Nginx イメージが戻っていることを確認します。

docker images nginx

削除する前と同じように、一覧に Nginx イメージが再び表示されるはずです。

イメージの保存と読み込みのプロセスは、以下のような場合に非常に役立ちます。

  • インターネットに接続できないシステムにイメージを転送する場合
  • 特定のバージョンのイメージをバックアップする場合
  • レジストリを使わずに他人とカスタム イメージを共有する場合

イメージのタグ付けの基本

タグ付けは、Docker イメージにエイリアスを作成する方法です。これは、主にバージョニングやイメージの整理に使用されます。イメージをタグ付けする方法を調べてみましょう。

まず、Nginx イメージに新しいタグを作成しましょう。

docker tag nginx:latest my-nginx:v1

このコマンドは、nginx:latest と同じイメージを指す新しいタグ my-nginx:v1 を作成します。各部分の意味は以下の通りです。

  • nginx:latest はソース イメージとタグ
  • my-nginx は作成する新しいイメージ名
  • v1 は割り当てる新しいタグ

次に、イメージを一覧表示して新しいタグを確認しましょう。

docker images

一覧に nginx:latestmy-nginx:v1 の両方が表示されるはずです。これらは同じ Image ID を持っていることに注意してください。これは、実際には同じイメージであり、名前だけが異なるからです。

この新しいタグを使ってコンテナを実行することができます。

docker run -d --name my-nginx-container my-nginx:v1

このコマンドは以下のことを行います。

  • -d はコンテナをデタッチド モード(バックグラウンドで)で実行します。
  • --name my-nginx-container は新しいコンテナに名前を付けます。
  • my-nginx:v1 はコンテナを作成するために使用するイメージとタグです。

コンテナが実行されていることを確認しましょう。

docker ps

実行中のコンテナの一覧にコンテナが表示されるはずです。

タグ付けはいくつかの理由で便利です。

  1. バージョン管理:イメージにバージョン番号(v1、v2 など)を付けることができます。
  2. 環境分離:異なる環境(開発、ステージング、本番)用にイメージにタグを付けることができます。
  3. 読みやすさ:カスタム タグにより、イメージの目的が明確になります。

タグはエイリアスにすぎないことを忘れてください。新しいイメージを作成するわけではなく、既存のイメージを指す新しい名前を作成するだけです。

まとめ

この実験では、Docker イメージを扱う際のさまざまな側面を調べました。以下のことが学べました。

  1. Docker Hub からイメージを取得する方法
  2. 異なるイメージ バージョンを使用してコンテナを実行する方法
  3. イメージを一覧表示して削除する方法
  4. イメージ レイヤーを理解する方法
  5. Docker Hub でイメージを検索する方法
  6. イメージを保存して読み込む方法
  7. 基本的なイメージのタグ付けを行う方法

これらのスキルは、プロジェクトで Docker イメージを効果的に管理するための基礎を形成します。Docker の学習を続けるにつれて、これらの操作がコンテナ化されたアプリケーションの構築と展開に不可欠であることがわかります。

忘れないでください。Docker イメージは Docker の動作の核心です。それらは、アプリケーションをパッケージ化して配布するための一貫性のある、移植性の高い、効率的な方法を提供します。これらのイメージ操作をマスターすることで、Docker に精通する道のりが大きく進みます。

これらのコマンドを練習し続け、さまざまなイメージを探り求めてください。Docker を使う機会が多ければ多いほど、快適に使えるようになり、熟練した技術者になれます。Docker を楽しんでご活用ください!