はじめに
この実験では、docker image push コマンドを使用して Docker イメージをレジストリにアップロードする方法を学習します。このプロセスは、独自のカスタムイメージを他の人と共有したり、異なる環境にデプロイするために不可欠です。
まず、実行中のコンテナ内で行った変更をコミットして新しいイメージを作成します。次に、特定のレジストリに適切にタグ付けする方法を学習します。これは、プッシュする前の重要なステップです。最後に、タグ付けされたイメージをレジストリにプッシュする練習を行います。これには、イメージに関連付けられたすべてのタグをプッシュする方法も含まれます。
コンテナを新しいイメージにコミットする
このステップでは、実行中のコンテナ内で行った変更を新しい Docker イメージにコミットする方法を学びます。これは、ソフトウェアのインストールやファイルの設定などの変更を行った後に、コンテナの状態を保存したい場合に便利です。
まず、簡単な Ubuntu コンテナを実行しましょう。ubuntu イメージを使用します。コンテナ内で変更を加えるため、擬似 TTY を使用して対話的に実行する必要があります。
docker run -it ubuntu
これで、Ubuntu コンテナのシェル内にいるはずです。curl パッケージをインストールするなど、簡単な変更を加えましょう。
apt-get update
apt-get install -y curl
インストールが完了したら、exit と入力してコンテナのシェルを終了します。
exit
コンテナを終了したので、行った変更(curl のインストール)はその特定のコンテナインスタンスにまだ残っています。これらの変更を新しいイメージとして保存するには、コンテナをコミットする必要があります。
まず、終了したばかりのコンテナのコンテナ ID を見つけます。docker ps -a コマンドを使用して、終了したコンテナを含むすべてのコンテナをリストアップできます。
docker ps -a
ubuntu イメージから作成されたコンテナを探し、その CONTAINER ID をメモします。
次に、docker commit コマンドを使用して、このコンテナから新しいイメージを作成します。基本的な構文は docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] です。コンテナをコミットし、新しいイメージに名前とタグを付けます。<CONTAINER_ID> を実際に見つけた ID に置き換えます。
docker commit < CONTAINER_ID > my-ubuntu-with-curl:v1
このコマンドは、v1 タグ付きの my-ubuntu-with-curl という名前の新しいイメージを作成します。ローカルのイメージをリストアップすることで、新しいイメージが作成されたことを確認できます。
docker images
イメージのリストに my-ubuntu-with-curl が表示されるはずです。この新しいイメージには、コンテナ内でインストールした curl パッケージが含まれています。
特定のレジストリ用にイメージにタグを付ける
このステップでは、Docker イメージを特定のコンテナレジストリにプッシュできるようにタグ付けする方法を学びます。イメージをレジストリにプッシュする際、タグはそのレジストリ内でイメージを識別するために使用されます。レジストリ用にイメージにタグ付けする標準的な形式は [registry-hostname[:port]]/repository[:tag] です。
前のステップで、v1 タグ付きの my-ubuntu-with-curl という名前のイメージを作成しました。では、このイメージを架空のレジストリ用にタグ付けしましょう。デモンストレーションのために、localhost:5000 をレジストリアドレスとして使用します。
docker tag コマンドを使用して、既存のイメージに新しいタグを作成できます。基本的な構文は docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] です。
my-ubuntu-with-curl:v1 イメージを架空のレジストリ用にタグ付けしましょう。
docker tag my-ubuntu-with-curl:v1 localhost:5000/my-ubuntu-with-curl:v1
このコマンドは、my-ubuntu-with-curl:v1 と同じイメージを指す新しいタグ localhost:5000/my-ubuntu-with-curl:v1 を作成します。
再度ローカルのイメージをリストアップすることで、新しいタグが追加されたことを確認できます。
docker images
これで、v1 タグ付きの localhost:5000/my-ubuntu-with-curl のエントリが表示されるはずです。これは、イメージがタグ付けされ、localhost:5000 のレジストリにプッシュできる状態になったことを示しています。
タグ付きのイメージをレジストリにプッシュする
このステップでは、タグ付けされた Docker イメージをコンテナレジストリにプッシュする方法を学びます。イメージをプッシュすることで、他の人がそのイメージをプルして使用できるようになります。
ローカルレジストリにイメージをプッシュする前に、レジストリを実行しておく必要があります。この実験では、一時的なローカルレジストリコンテナを実行します。
まず、registry イメージをプルします。
docker pull registry:2
次に、レジストリコンテナを実行します。ホストのポート 5000 をコンテナのポート 5000 にマッピングします。
docker run -d -p 5000:5000 --name local-registry registry:2
このコマンドは、Docker レジストリを実行する local-registry という名前のデタッチドコンテナを起動します。
前のステップで、my-ubuntu-with-curl:v1 イメージに localhost:5000/my-ubuntu-with-curl:v1 というタグを付けました。このタグには、ローカルレジストリのアドレス (localhost:5000) が含まれています。
これで、docker push コマンドを使用して、このタグ付けされたイメージをローカルレジストリにプッシュできます。構文は docker push NAME[:TAG] です。
docker push localhost:5000/my-ubuntu-with-curl:v1
プッシュ操作の進捗状況を示す出力が表示され、プッシュされるレイヤーも含まれます。
プッシュが完了すると、my-ubuntu-with-curl:v1 イメージは localhost:5000 のローカルレジストリに保存されます。
イメージのすべてのタグをプッシュする
このステップでは、特定のイメージに関連付けられたすべてのタグをコンテナレジストリにプッシュする方法を学びます。時には、同じイメージを指す複数のタグ(例:latest、v1.0、stable)が存在することがあります。これらのすべてのタグを 1 つのコマンドでプッシュすることができます。
前のステップで、my-ubuntu-with-curl イメージを作成し、v1 および localhost:5000/my-ubuntu-with-curl:v1 というタグを付けました。このイメージに別のタグを追加しましょう。ローカルレジストリ用に latest というタグを付けます。
docker tag コマンドを再度使用して、latest タグを追加します。
docker tag my-ubuntu-with-curl:v1 localhost:5000/my-ubuntu-with-curl:latest
次に、新しいタグを確認するためにイメージをリストアップします。
docker images
これで、v1 と latest の両方のタグが付いた localhost:5000/my-ubuntu-with-curl が表示され、どちらも同じイメージ ID を指しているはずです。
このイメージのすべてのタグをローカルレジストリにプッシュするには、タグを指定せずにリポジトリ名を使用して docker push コマンドを実行します。
docker push localhost:5000/my-ubuntu-with-curl
Docker は、localhost:5000/my-ubuntu-with-curl リポジトリに関連付けられたすべてのタグを識別し、それぞれをレジストリにプッシュします。v1 と latest の両方のタグのプッシュ進捗状況を示す出力が表示されます。
プッシュが完了すると、イメージの両方のバージョン(v1 と latest)がローカルレジストリで利用可能になります。
まとめ
この実験では、実行中の Docker コンテナ内で行った変更を新しいイメージにコミットする方法を学びました。このプロセスには、コンテナを実行し、その中で変更を加え(ソフトウェアのインストールなど)、コンテナを終了し、コンテナの ID を特定し、そして docker commit コマンドを使用してコンテナの状態に基づいて新しいイメージを作成することが含まれます。また、新しく作成したイメージに名前とタグを付け、docker images を使用してその存在を確認する方法も学びました。



