DockerイメージはDockerコンテナーの基盤です。イメージが基盤であるため、イメージの新しいバージョンがリリースされたときにDockerコンテナを更新する方法を考えたことはありますか?
もう不思議ではありません!このチュートリアルでは、ローカルのDockerイメージリポジトリを更新し、コンテナを混乱させることなく新しいバージョンに更新する方法を学習します。
前提条件
このチュートリアルは、実践的なデモンストレーションになります。フォローする場合は、次のものがあることを確認してください。
- Linux環境–チュートリアルではLinux(Ubuntu Focal)を使用してDockerを実行しますが、同じ一般的な手順をWindowsまたはmacOSに適用することもできます。
- Dockerエンジン20.10.8(Linux)またはDockerデスクトップ3.5.2(macOSおよびWindows)をインストールします。
べき等Dockerイメージの実行
Dockerイメージには、OSパッケージや依存関係など、それに関連付けられたアプリケーションを実行するために必要なすべてのソフトウェアが含まれています。 Dockerは、 Dockerfileと呼ばれるファイル内の命令を介してイメージをアセンブルします 、べき等のインストール手順が含まれています。
べき等命令は、インストール命令を実行した結果のイメージが常に同じ出力になることを意味します。
べき等画像を作成する利点は、システムに依存しないことです。結果の画像は常に同じになります。コンテナの実行も、実行がどこで行われるかに関係なく、常に同じになります。
新しいイメージバージョンは通常、Dockerコンテナベースを構築するための命令のいくつかの改善を意味します。例:
- 新しいバージョンのアプリケーションソースコードで古いバージョンを置き換えることができます。
- 依存関係の管理の改善:必要なスペースの削減またはパフォーマンスの向上;
- セキュリティの向上:イメージには、脆弱性を回避するためのセキュリティパッチが含まれています。
Dockerイメージの更新から最後のメリットを得るには、Dockerイメージを更新し、それらの更新をコンテナーに適用する方法を知っている必要があります。
ローカルDockerイメージの更新
まず、ローカルのDockerイメージを更新することから始めます。例のpython
のアプリケーション コンテナはPythonコードアプリケーションを実行します。ローカルDockerイメージを更新するということは、アプリケーションが新しく更新されたイメージに依存できることを意味します。
まず、ローカル環境で現在利用可能な画像を知る必要があります。次のコマンドを実行して、ローカルイメージを確認します。 タグ 列は、画像の利用可能なバージョンを示します。
docker images
イメージのローカルバージョンができたので、リモートレジストリで利用可能な最新のイメージを見つける必要があります。 Dockerエンジンがローカルイメージを更新するためにクエリを実行する複数のリモートDockerレジストリ(Dockerイメージのリポジトリ)があります。 Dockerは、デフォルトでDockerHubから画像をプルします しかし、複数の選択肢があり、それらのほとんどはプライベートです。いくつかの代替リポジトリを以下に示します。
- アマゾンウェブサービス(AWS)ECRパブリックギャラリー
- ネクサスソナタイプ
- VMハーバー
リポジトリページをナビゲートして、目的のイメージを探します。例として更新する公式のPythonイメージです。 pythonと入力します DockerHubで目的のイメージを検索し、それを開いて使用可能なタグを検索します。このチュートリアルの例はPythonイメージのものです。
すべてのタグにはプッシュ日付もあります。プッシュ日は、イメージがレジストリにアップロードされた日付です。画像のタグに注意してください および名前 、どちらも次の手順で必要になります。
新しいバージョンタグができたので、イメージを更新します。新しいイメージに更新するには、最初に新しいバージョンをプルする必要があります。 docker pull
を実行します コマンドの後にコロンと新しい画像の名前とタグが続きます:以前にメモした名前とタグ。この例の名前とタグはpython:slim-buster
です。 。完全なコマンドと結果の出力を以下に示します。
docker pull python:slim-buster
デフォルト以外のDockerイメージレジストリ(DockerHub)からイメージをプルするには、代わりに完全なイメージURIを指定する必要があります。例:Pythonをプルするには (AWS)ECRパブリックギャラリー、
dockerpull public.ecr.aws/bitnami/python:3.7
を実行します
Dockerコンテナを更新する方法を学ぶ
コンテナを作成すると、コンテナイメージは変更できません。イメージは変更できないため、実行中のコンテナーを実際に更新することはできません。新しいイメージバージョンを使用して、実行中のコンテナを交換用コンテナで再作成します。
すでに最新バージョンを使用しているので、更新が必要な古いイメージを使用してコンテナを再作成します。
再作成する必要のあるコンテナーを見つけるには、古いイメージを実行している既存のコンテナーをリストします。 docker ps
コマンドはコンテナを一覧表示します。 --filter
を使用 フラグ、リストするコンテナーを指定します。フィルタリングには複数の利用可能なオプションがあり、ancestor
コンテナを構築するためのベースとして使用される画像でフィルタにフラグを立てます。例の開始コンテナーはPython3.7.2用であり、フィルターとして適用します。 -a
スイッチは利用可能なすべてのコンテナを表示します。
docker ps -a --filter "ancestor=python:3.7.2"
docker ps
の出力を使用できます docker stop
を実行するための入力として リストされているすべてのコンテナーでコマンドを実行します。フラグ-q
が含まれているため、listingコマンドはコンテナのIDのみを返します。コマンドの出力は、停止したコンテナのIDのリストです。
docker stop $(docker ps -aq --filter "ancestor=python:3.7.2")
コンテナを停止した後、古いイメージを削除する前に、Dockerにシステムからコンテナを効果的に削除するように依頼する必要があります。
docker rm $(docker ps -aq --filter "ancestor=python:3.7.2")
非推奨のイメージに関連付けられているすべてのコンテナを削除した後、docker rmi
を使用して古いイメージを削除できます。 コマンド。
docker rmi python:3.7.2
更新イメージを使用した新しいコンテナの作成
次に、以前に削除された古いコンテナを、更新されたイメージに基づいた新しいコンテナに最終的に置き換えます。今回は、新しいイメージバージョンを使用してコンテナを作成します。コンテナはべき等であるため、すべてが以前と同じように機能することが期待できます。
docker run
を使用して新しいコンテナを実行します コマンドと、コンテナに必要な更新されたイメージの名前とタグ。この例では、-it
フラグはDockerにコンテナをインタラクティブモードで実行するように指示するため、コンテナ内でコマンドを実行して、更新された機能を確認できます。
docker run -it python:slim-buster
新しいDockerコンテナが新しいPythonバージョン(バージョン3.9.7)を実行していることに注意してください。
結論
このチュートリアルでは、カバーの裏側を覗いて、Dockerコンテナーを更新する方法の背後にある魔法である煙とミラーを学びました。更新はありません!代わりに、古いバージョンのすべてのトレースを削除し、新しいバージョンを使用してそれらを新しいコンテナーに置き換えます。そして、べき等性のおかげで、コンテナは通常どおり機能し続けます:TA-DA!
では、次に更新する予定のコンテナは何ですか?