Amazon ECR におけるライフサイクルを通じたイメージの移行 - Amazon ECR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon ECR におけるライフサイクルを通じたイメージの移行

Amazon ECR を初めて使用する場合は、Docker CLI と AWS CLI で次の手順を使用してサンプルイメージを作成し、デフォルトレジストリに対する認証とプライベートリポジトリの作成を行います。その後、プライベートリポジトリにイメージをプッシュし、プライベートリポジトリからイメージをプルします。サンプルイメージでの作業が完了したら、サンプルイメージとリポジトリを削除します。

AWS CLI の代わりに AWS Management Consoleを使用する場合は、「イメージを保存するための Amazon ECR プライベートリポジトリの作成」を参照してください。

さまざまな AWS SDK、IDE ツールキット、および Windows PowerShell コマンドラインツールなどの AWS リソースを管理するためのその他のツールの詳細については、http://aws.amazon.com/tools/ を参照してください。

前提条件

最新の AWS CLI と Docker がインストールされておらず、使用する準備ができていない場合は、次の手順を使用してこれら両方のツールをインストールします。

AWS CLI のインストール

Amazon ECR で AWS CLI を使用するには、最新バージョンの AWS CLI をインストールします。詳細については、AWS Command Line Interface ユーザーガイドの「AWS Command Line Interface のインストール」を参照してください。

Docker をインストールする

Docker は、Ubuntu のような最新の Linux ディストリビューションから macOS や Windows まで、さまざまなオペレーティングシステムで使用できます。特定のオペレーティングシステムに Docker をインストールする方法の詳細については、Docker インストールガイド を参照してください。

Docker を使用するには、ローカルの開発システムは必要ありません。Amazon EC2 をすでに使用している場合は、Amazon Linux 2023 インスタンスを起動し、Docker をインストールして開始できます。

Docker をインストール済みの場合は、この手順をスキップして「ステップ 1: Docker イメージを作成する」に進んでください。

Amazon Linux 2023 AMI を使用して Amazon EC2 インスタンスに Docker をインストールするには
  1. 最新の Amazon Linux 2023 AMI を使用してインスタンスを起動します。詳細については、「Amazon EC2 ユーザーガイド」の「Launching an instance」を参照してください。

  2. インスタンスに接続します。詳細については、「Amazon EC2 ユーザーガイド」の「Linux インスタンスへの接続」を参照してください。

  3. インスタンスでインストールされているパッケージとパッケージキャッシュを更新します。

    sudo yum update -y
  4. 最新の Docker Community Edition パッケージをインストールします。

    sudo yum install docker
  5. Docker サービスを開始します。

    sudo service docker start
  6. ec2-userdocker グループに追加すると、sudo を使用せずに Docker コマンドを実行できます。

    sudo usermod -a -G docker ec2-user
  7. ログアウトし、再びログインして、新しい docker グループアクセス権限を取得します。これは、現在の SSH ターミナルウィンドウを閉じて、新しいウィンドウでインスタンスに再接続することで達成できます。新しい SSH セッションには適切な docker グループ権限があります。

  8. ec2-usersudo を使用せずに Docker コマンドを実行できることを確認します。

    docker info
    注記

    場合によっては、Docker デーモンにアクセスするための ec2-user に対するアクセス権限を提供するため、インスタンスを再起動する必要があります。次のエラーが表示された場合は、インスタンスを再起動してください。

    Cannot connect to the Docker daemon. Is the docker daemon running on this host?

ステップ 1: Docker イメージを作成する

このステップでは、シンプルなウェブアプリケーションの Docker イメージを作成し、ローカルシステムまたは Amazon EC2 インスタンスでテストします。

シンプルなウェブアプリケーションの Docker イメージを作成するには
  1. Dockerfile という名前のファイルを作成します。Dockerfile は、Docker イメージに使用する基本イメージと、そのイメージにインストールして実行するものを記述するマニフェストです。Dockerfile の詳細については、「Dockerfile リファレンス」を参照してください。

    touch Dockerfile
  2. 前の手順で作成した Dockerfile を編集し、以下のコンテンツを追加します。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest # Install dependencies RUN yum update -y && \ yum install -y httpd # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \ echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh

    この Dockerfile は、Amazon ECR パブリックでホストされているパブリック Amazon Linux 2 イメージを使用します。RUN の手順により、パッケージキャッシュが更新され、ウェブ サーバー用のいくつかのソフトウェアがインストールされてから、「Hello World!」 のコンテンツがウェブサーバーのドキュメントルートに書き込みされます。EXPOSE の命令はコンテナ上のポート 80 を公開し、CMD の命令はウェブサーバーを起動します。

  3. Dockerfile から Docker イメージを作成します。

    注記

    Docker の一部のバージョンでは、下に示す相対パスの代わりに、次のコマンドで Dockerfile への完全パスが必要になる場合があります。

    docker build -t hello-world .
  4. コンテナイメージを一覧表示します。

    docker images --filter reference=hello-world

    出力:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       194MB
  5. 新しく構築されたイメージを実行します。-p 80:80 オプションは、コンテナ上の公開されたポート 80 をホストシステム上のポート 80 にマッピングします。docker run の詳細については、「Docker run reference」を参照してください。

    docker run -t -i -p 80:80 hello-world
    注記

    Apache ウェブサーバーからの出力はターミナルウィンドウに表示されます。"Could not reliably determine the fully qualified domain name" メッセージは無視できます。

  6. ブラウザーを開き、Docker を実行している、コンテナのホストサーバーを参照します。

    • EC2 インスタンスを使用している場合、これはサーバーの [Public DNS] 値であり、SSH でインスタンスに接続するときに使用するアドレスと同じです。インスタンスのセキュリティグループでポート 80 上の受信トラフィックを許可していることを確認します。

    • Docker をローカルに実行している場合は、ブラウザで http://localhost/ を参照します。

    • Windows または Mac コンピューターで docker-machine を使用している場合は、docker-machine ip コマンドを使用して Docker のホスト VirtualBox VM の IP アドレスを見つけ、machine-name を、使用中の Docker マシンの名前に置き換えます。

      docker-machine ip machine-name

    ウェブページに「Hello, World!」が確認できます。表示されます。

  7. [Ctrl + C] キーを押して、Docker コンテナを停止します。

ステップ 2: リポジトリを作成する

これで Amazon ECR にプッシュするイメージが用意できたので、それを保持するレポジトリを作成する必要があります。この例では、hello-repository イメージを後でプッシュする、hello-world:latest と呼ばれるレポジトリを作成します。レポジトリを作成するには、次のコマンドを実行します。

aws ecr create-repository \ --repository-name hello-repository \ --region region

ステップ 3: デフォルトレジストリに対して認証する

AWS CLI のインストールと設定が完了したら、デフォルトレジストリに対して Docker CLI を認証します。これにより、docker コマンドは Amazon ECR を使用してイメージをプッシュおよびプルできます。AWS CLI には、認証プロセスをシンプルにする get-login-password コマンドが用意されています。

get-login-password を使用して Amazon ECR レジストリに対して Docker を認証するには、aws ecr get-login-password コマンドを実行します。認証トークンを docker login コマンドに渡すとき、ユーザー名に AWS 値を使用し、認証先の Amazon ECR レジストリの URI を指定します。複数のレジストリに対して認証する場合は、レジストリごとにコマンドを繰り返す必要があります。

重要

エラーが発生した場合は、AWS CLI の最新バージョンをインストールまたはアップグレードします。詳細については、AWS Command Line Interface ユーザーガイドの「AWS Command Line Interface のインストール」を参照してください。

  • get-login-password (AWS CLI)

    aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  • Get-ECRLoginCommand (AWS Tools for Windows PowerShell)

    (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

ステップ 4: イメージを Amazon ECR にプッシュする

ここで、前のセクションで作成した Amazon ECR リポジトリにイメージをプッシュできます。次の前提条件が満たされた後に、docker CLI を使用してイメージをプッシュします。

  • docker の最小バージョン 1.7 がインストールされている。

  • Amazon ECR 認可トークンが docker login を使用して設定されている。

  • Amazon ECR リポジトリが存在し、リポジトリにプッシュするアクセス権がユーザーにある。

これらの前提条件が満たされたら、アカウントのデフォルトレジストリで新しく作成されたレポジトリにイメージをプッシュできます。

イメージにタグを付けて Amazon ECR にプッシュするには
  1. ローカルに保存したイメージをリストし、タグを付けてプッシュするイメージを識別します。

    docker images

    出力:

    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  2. リポジトリにプッシュするイメージにタグを付けます。

    docker tag hello-world:latest aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
  3. イメージをプッシュします。

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:latest

    出力:

    The push refers to a repository [aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository] (len: 1)
    e9ae3c220b23: Pushed
    a6785352b25c: Pushed
    0998bf8fb9e9: Pushed
    0a85502c06c9: Pushed
    latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE size: 6774

ステップ 5: Amazon ECR からイメージをプルする

イメージを Amazon ECR リポジトリにプッシュした後、そのイメージを他の場所からプルできます。次の前提条件が満たされた後に、docker CLI を使用してイメージをプルします。

  • docker の最小バージョン 1.7 がインストールされている。

  • Amazon ECR 認可トークンが docker login を使用して設定されている。

  • Amazon ECR リポジトリが存在し、リポジトリからプルするアクセス許可がユーザーにある。

これらの前提条件が満たされたら、イメージをプルできます。Amazon ECR からサンプルイメージをプルするには、次のコマンドを実行します。

docker pull aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:latest

出力:

latest: Pulling from hello-repository
0a85502c06c9: Pull complete
0998bf8fb9e9: Pull complete
a6785352b25c: Pull complete
e9ae3c220b23: Pull complete
Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE
Status: Downloaded newer image for aws_account_id.dkr.region.amazonaws.com/hello-repository:latest

ステップ 6: イメージを削除する

いずれかのリポジトリでイメージが不要になった場合は、そのイメージを削除できます。イメージを削除するには、そのイメージが配置されているリポジトリと、そのイメージの imageTag または imageDigest の値を指定します。次の例では、hello-repository リポジトリ内でイメージタグ latest が付いているイメージを削除します。リポジトリからサンプルイメージを削除するには、次のコマンドを実行します。

aws ecr batch-delete-image \ --repository-name hello-repository \ --image-ids imageTag=latest \ --region region

ステップ 7: リポジトリを削除する

イメージのリポジトリ全体が不要になった場合は、リポジトリを削除できます。次の例では、--force フラグを使用して、イメージが含まれるリポジトリを削除します。イメージ (およびその中に含まれるすべてのイメージ) を含むリポジトリを削除するには、次のコマンドを実行します。

aws ecr delete-repository \ --repository-name hello-repository \ --force \ --region region