AWS CLI での Amazon ECR の使用
以下では、Docker CLI と AWS CLI を使用してコンテナイメージをプライベート Amazon ECR リポジトリに初めてプッシュするために必要な手順について説明します。
さまざまな AWS SDK、IDE ツールキット、および Windows PowerShell コマンドラインツールなどの AWS リソースを管理するためのその他のツールの詳細については、http://aws.amazon.com/tools/
前提条件
開始する前に、必ず「Amazon ECR を使用してセットアップする」の手順を完了してください。
最新の AWS CLI と Docker がまだインストールされておらず、使用する準備ができていない場合は、次の手順を使用してこれら両方のツールをインストールします。
AWS CLI をインストールする
AWS コマンドラインツールを使用して、システムのコマンドラインでコマンドを発行することで、Amazon ECR および他の AWS タスクを実行できます。これは、コンソールを使用するよりも高速でより便利になります。コマンドラインツールは、AWS のタスクを実行するスクリプトの作成にも便利です。
AWS CLI を Amazon ECR で使用するには、最新の AWS CLI バージョンをインストールします (Amazon ECR の機能は、バージョン 1.9.15 の AWS CLI から利用可能)。AWS CLI のバージョンは、aws --version コマンドで確認できます。AWS CLI のインストールまたは最新バージョンへのアップグレードについては、AWS Command Line Interface ユーザーガイドの「AWS Command Line Interfaceのインストール」を参照してください。
Docker をインストールする
Docker は、Ubuntu のような最新の Linux ディストリビューションから macOS や Windows まで、さまざまなオペレーティングシステムで使用できます。特定のオペレーティングシステムに Docker をインストールする方法の詳細については、Docker インストールガイド
Docker を使用するには、ローカルの開発システムは必要ありません。Amazon EC2 をすでに使用している場合は、Amazon Linux 2 インスタンスを起動し、Docker をインストールして開始できます。
Docker をインストール済みの場合は、この手順をスキップして「ステップ 1: Docker イメージを作成する」に進んでください。
Amazon EC2 インスタンスに Docker をインストールするには
-
Amazon Linux 2 AMI を使用してインスタンスを起動します。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「インスタンス起動ウィザードを使用したインスタンスの起動」を参照してください。
-
インスタンスに接続します。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「Linux インスタンスへの接続」を参照してください。
-
インスタンスでインストールされているパッケージとパッケージキャッシュを更新します。
sudo yum update -y
-
最新の Docker Community Edition パッケージをインストールします。
sudo amazon-linux-extras install docker
-
Docker サービスを開始します。
sudo service docker start
-
ec2-user
をdocker
グループに追加すると、sudo
を使用せずに Docker コマンドを実行できます。sudo usermod -a -G docker ec2-user
-
ログアウトし、再びログインして、新しい
docker
グループアクセス権限を取得します。これは、現在の SSH ターミナルウィンドウを閉じて、新しいウィンドウでインスタンスに再接続することで達成できます。新しい SSH セッションには適切なdocker
グループ権限があります。 -
ec2-user
がsudo
を使用せずに Docker コマンドを実行できることを確認します。docker info
注記 場合によっては、Docker デーモンにアクセスするための
ec2-user
に対するアクセス権限を提供するため、インスタンスを再起動する必要があります。次のエラーが表示された場合は、インスタンスを再起動してください。Cannot connect to the Docker daemon. Is the docker daemon running on this host?
ステップ 1: Docker イメージを作成する
このセクションでは、シンプルなウェブアプリケーションの Docker イメージを作成し、ローカルシステムまたは EC2 インスタンスでテストしてから、コンテナレジストリ (Amazon ECR や Docker Hub など) にプッシュして、ECS タスク定義で使用できるようにします。
シンプルなウェブアプリケーションの Docker イメージを作成するには
-
Dockerfile
という名前のファイルを作成します。Dockerfile は、Docker イメージに使用する基本イメージと、そのイメージにインストールして実行するものを記述するマニフェストです。Dockerfile の詳細については、「Dockerfile リファレンス」を参照してください。 touch Dockerfile
-
前の手順で作成した
Dockerfile
を編集し、以下のコンテンツを追加します。FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh
この Dockerfile は Ubuntu 18.04 イメージを使用します。
RUN
の手順により、パッケージキャッシュが更新され、ウェブ サーバー用のいくつかのソフトウェアがインストールされてから、「Hello World!」 のコンテンツがウェブサーバーのドキュメントルートに書き込みされます。EXPOSE
の命令はコンテナ上のポート 80 を公開し、CMD
の命令はウェブサーバーを起動します。 -
Dockerfile から Docker イメージを作成します。
注記 Docker の一部のバージョンでは、下に示す相対パスの代わりに、次のコマンドで Dockerfile への完全パスが必要になる場合があります。
docker build -t hello-world .
-
docker images を実行して、イメージが正しく作成されたことを確認します。
docker images --filter reference=hello-world
出力:
REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
-
新しく構築されたイメージを実行します。
-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 server's fully qualified domain name
" メッセージは無視できます。 -
ブラウザーを開き、Docker を実行している、コンテナのホストサーバーを参照します。
-
EC2 インスタンスを使用している場合、これはサーバーの [Public DNS] 値であり、SSH でインスタンスに接続するときに使用するアドレスと同じです。インスタンスのセキュリティグループでポート 80 上の受信トラフィックを許可していることを確認します。
-
Docker をローカルに実行している場合は、ブラウザで http://localhost/
を参照します。 -
Windows または macOS コンピュータで docker-machine を使用している場合は、docker-machine ip コマンドを使用して Docker のホスト VirtualBox VM の IP アドレスを見つけ、
machine-name
を、使用中の Docker マシンの名前に置き換えます。docker-machine ip
machine-name
ウェブページに「Hello, World!」が 表示されます。
-
-
[Ctrl + C] キーを押して、Docker コンテナを停止します。
ステップ 2: デフォルトレジストリに対して認証する
AWS CLI のインストールと設定が完了したら、デフォルトレジストリに対して Docker CLI を認証します。これにより、docker コマンドは Amazon ECR を使用してイメージをプッシュおよびプルできます。AWS CLI には、認証プロセスをシンプルにする get-login-password コマンドが用意されています。
get-login-password
は、AWS CLI を使用する際に Amazon ECR プライベートレジストリへの認証に推奨される方法です。AWS CLI が AWS と通信するように設定されていることを確認してください。詳細については、AWS Command Line Interface ユーザーガイドの「AWS CLI の設定の基本」を参照してください。
Amazon ECR 認証トークンを docker
login コマンドに渡すとき、ユーザー名の AWS
値を使用し、認証先の Amazon ECR レジストリの URI を指定します。複数のレジストリに対して認証する場合は、レジストリごとにコマンドを繰り返す必要があります。
エラーが発生した場合、または get-login-password コマンドが使用できない場合は、AWS CLI の最新バージョンを使用していることを確認してください。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
.dkr.ecr.aws_account_id
region
.amazonaws.com -
Get-ECRLoginCommand (AWS Tools for Windows PowerShell)
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin
.dkr.ecr.aws_account_id
region
.amazonaws.com
ステップ 3: レポジトリを作成する
これで Amazon ECR にプッシュするイメージが用意できたので、それを保持するレポジトリを作成する必要があります。この例では、hello-world
イメージを後でプッシュする、hello-world:latest
と呼ばれるレポジトリを作成します。レポジトリを作成するには、次のコマンドを実行します。
aws ecr create-repository \ --repository-name
hello-world
\ --image-scanning-configuration scanOnPush=true
\ --regionregion
ステップ 4: イメージを Amazon ECR にプッシュする
ここで、前のセクションで作成した Amazon ECR リポジトリにイメージをプッシュできます。docker CLI を使ってイメージをプッシュしますが、この作業を正しく完了するために満たす必要がある前提条件がいくつかあります。
-
docker の最小バージョン (1.7) がインストールされている。
-
Amazon ECR 認証トークンが docker login で設定されている。
-
Amazon ECR リポジトリが存在し、リポジトリにプッシュするアクセス権がユーザーにある。
これらの前提条件が満たされたら、アカウントのデフォルトレジストリで新しく作成されたレポジトリにイメージをプッシュできます。
イメージにタグを付けて Amazon ECR にプッシュするには
-
ローカルに保存したイメージをリストし、タグを付けてプッシュするイメージを識別します。
docker images
出力:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
-
リポジトリにプッシュするイメージにタグを付けます。
docker tag hello-world:latest
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-world:latest -
イメージをプッシュします。
docker push
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-world:latest出力:
The push refers to a repository [
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-world] (len: 1) e9ae3c220b23: Pushed a6785352b25c: Pushed 0998bf8fb9e9: Pushed 0a85502c06c9: Pushed latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b 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-world:latest
出力:
latest: Pulling from hello-world 0a85502c06c9: Pull complete 0998bf8fb9e9: Pull complete a6785352b25c: Pull complete e9ae3c220b23: Pull complete Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b Status: Downloaded newer image foraws_account_id
.dkr.region
.amazonaws.com/hello-world:latest
ステップ 6: イメージを削除する
いずれかのリポジトリで、イメージが必要なくなったと判断した場合、batch-delete-image コマンドで削除できます。イメージを削除するには、イメージがあるレポジトリ、およびイメージの imageTag
または imageDigest
の値を指定する必要があります。次の例では、イメージタグが hello-world
で、latest
リポジトリにあるイメージを削除します。
aws ecr batch-delete-image \ --repository-name hello-world \ --image-ids imageTag=latest \ --region
region
出力:
{ "failures": [], "imageIds": [ { "imageTag": "latest", "imageDigest": "sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b" } ] }
ステップ 7: リポジトリを削除する
イメージのリポジトリ全体が必要ないと判断した場合は、リポジトリを削除できます。デフォルトでは、イメージを含むリポジトリを削除することはできません。ただし、--force
フラグを使用すると、この操作を行うことができます。イメージ (およびその中に含まれるすべてのイメージ) を含むリポジトリを削除するには、次のコマンドを実行します。
aws ecr delete-repository \ --repository-name hello-world \ --force \ --region
region