コンテナイメージを運んで、別環境で起動してみよう !

スペシャリストから学ぶコンテナ技術 第 4 回

2021-10-05
デベロッパーのためのクラウド活用方法

Author : 原田 和則 / 林 政利

こんにちは、テクニカルソリューションアーキテクトの原田です。

さて、スペシャリストから学ぶコンテナ技術シリーズもいよいよ 第 4 回です。
今回は、前回 作成したアプリケーション入りコンテナイメージをコンテナレジストリにアップロードしてみます。
そして、ローカル環境とは別の環境を用意して、そこにコンテナイメージをダウンロードして、コンテナを動かしてみたいと思います。
さらに、別環境でもコンテナ内のアプリケーションが同じ動作をするか確かめてみたいと思います。

今回初めてこの連載をご覧になる方、また、過去の連載を読み直したい方は、こちらからご確認ください。

本記事は、前回同様、原田とコンテナスペシャリスト ソリューションアーキテクトの 林 (@literalice) の共同執筆となります。


前回 (第 3 回) のおさらい

アプリケーション入りコンテナイメージの作成

前回は、Docker を使って、アプリケーション入りのコンテナイメージを実際に作成し、その後、作成したコンテナイメージからコンテナを実際に起動してみました。
コンテナイメージの作成方法として、具体的に 2 つ紹介しました。

  • docker commit コマンドを使ったコンテナイメージの作成

コンテナ内作業でアプリケーションの動作確認をセットアップしたあと docker commit でコンテナイメージを作成する方法です。

  • docker build コマンドを使ったコンテナイメージの作成

コンテナイメージのセットアップやアプリケーション起動手順を記載した Dockerfile を用意して docker build でコンテナイメージ作成する方法です。

どちらの方法でも、最終的にアプリケーション入りのコンテナイメージが作成されるという結果は変わりませんが、手作業を極力減らすことで作業ミスを減らすことができたり、自動化の仕組みに載せやすいといった観点などで、実ワークロードでは、後者の「 Dockerfile と docker build を使いコンテナイメージを作成する」ことがほとんどです。

作成したコンテナイメージからコンテナの起動

docker run コマンドを使い、作成したコンテナイメージからコンテナを実際に起動し、アプリケーションが動くことを確認しました。具体的にはコンテナ起動時に、Hello World という文字列が標準出力に表示されることを確認しました。


今回 (第 4 回) でやること

今回は、作成済みのアプリケーション入りコンテナイメージをコンテナレジストリにアップロードし、ローカル環境とは別の環境を用意して、そこにコンテナイメージをダウンロードして、コンテナを動かしてみます。そして、別環境でもコンテナ内のアプリケーションが同じ動作をすることを確認してみたいと思います。

具体的には以下の 5 つの作業を行います。

  1. コンテナレジストリの用意
  2. ローカル環境からコンテナイメージをプライベートリポジトリにアップロード
  3. 別環境 (AWS Cloud9) の用意
  4. コンテナイメージをコンテナレジストリから別環境 (AWS Cloud9) にダウンロード
  5. 別環境 (AWS Cloud9) 上でコンテナの起動

1. コンテナレジストリの用意

コンテナレジストリとは?コンテナリポジトリとは?

前回、コンテナイメージを自分の環境に持ってきたり、逆に、自分が作成したコンテナイメージを誰かに渡す時は、直接コンテナイメージを授受するのではなく、コンテナレジストリ (Container Registry) を仲介して、ダウンロードやアップロードを行うとお伝えしました。

このコンテナレジストリは、プライベートレジストリとして個人利用や組織内利用といったプライベート用途で利用することも、また、パブリックレジストリとして世界中に公開することも可能です。

また、この「コンテナレジストリ」というのはコンテナイメージの保管場所の総称のことで、コンテナイメージの実体は「コンテナリポジトリ」という場所に保存されます。この「レジストリ」と「リポジトリ」は、同じカタカナ 5 文字で、意味も似ているのでちょっとややこしいですね。

AWS も、コンテナレジストリとして、Amazon Elastic Container Registry (Amazon ECR) というサービスを提供しており、プライベートレジストリとしても、パブリックレジストリとしてもご利用いただけます。

プライベートリポジトリの作成

今回は、コンテナイメージの保存先として、Amazon ECR のプライベートリポジトリを利用してみます。ここでは、そのプライベートリポジトリの作成を行います。

プライベートリポジトリは、「AWS マネジメントコンソールで作成」したり、「AWS CLI で作成」したりなどいくつか方法がありますが、今回は「AWS CLI」で作成してみたいと思います。

※ 本記事は、ハンズオンではありませんが、一緒にお試しになりたい方は以下をあらかじめご用意ください。

さっそく、 aws ecr create-repository コマンドでプライベートリポジトリを作成してみましょう。
今回は、東京リージョンで hello-node-app という名前のプライベートリポジトリを作成します。

$ aws ecr create-repository \
    --repository-name hello-node-app \
    --region ap-northeast-1
    
~ 実行結果(一部マスキングしています) ~
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxx:repository/hello-node-app",
        "registryId": "xxxxxxxxx",
        "repositoryName": "hello-node-app",
        "repositoryUri": "xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app",
        "createdAt": "2021-09-24T00:30:51+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": false
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

これで作成されたはずですが、念の為、AWS マネジメントコンソールでも確認してみます。

作成したプライベートリポジトリの確認

AWS マネジメントコンソールにログイン後、トップページのサービス一覧から「Elastic Container Registry」をクリックすると図のページに遷移します。

クリックすると拡大します

確かに hello-node-app という プライベートリポジトリが作成されていることが確認できました。

次は、このプライベートリポジトリにコンテナイメージをアップロードしましょう。


2. コンテナイメージをプライベートリポジトリにアップロード

docker コマンドのおさらい

コンテナイメージをコンテナリポジトリにアップロードするには docker push コマンドを使用します。ちなみに、ダウンロードは docker pull コマンド、コンテナイメージからのコンテナ起動は docker run コマンドでしたね。アップロードは push、ダウンロードは pull、起動は run で直感的で覚えやすいですね。

しかも、中身がどんなコンテナイメージ、つまり、中身が Java のアプリケーションでも、Pythonでも、今回のように Node.js でもコンテナイメージさえ作成してしまえば、コンテナイメージの運搬からコンテナ (アプリケーション) の起動などを docker コマンドで一貫性を持って行うことができます。

プライベートレジストリの認証

さっそく、コンテナイメージのアップロードをしたいところですが、いきなり docker push コマンドを実行しても、残念ながらアップロードはできません。コンテナに限らず、普段の業務でも、どこかにデータをアップロードや送信する時は、意識するかしないかは別にして「認証」を行っていることがほとんどだと思います。身近な例だと、メールの送受信もそうですね。

つまり、コンテナイメージのアップロードにも「認証」が必要になります。じゃあ、その認証はどうすればいいのかというと、Amazon ECR の場合は、AWS マネジメントコンソールで必要なコマンドが確認できます。

図のように「プッシュコマンドの表示」をクリックすると、必要なコマンドが表示されます。

クリックすると拡大します

表示されたプッシュコマンド例
クリックすると拡大します

それでは、表示されたコマンドを参考にプライベートレジストリの認証を行っていきましょう。

一番最初のコマンドをそのままコピペして実行します。
※ お試しになられる方は、XXXXXXXX の部分をご自身の AWS アカウント ID に置き換えてください

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

Login Succeeded と出れば認証成功です。これで、Docker コマンド (Docker CLI) が Amazon ECR にアクセスできるようになりました。

※ コマンドが存在しないというエラーが返ってきた場合は、ローカル環境に AWS CLI バージョン 2 がインストールされていることをご確認ください。

アップロードするコンテナイメージの確認

プッシュコマンド一覧の、次に表示されているコマンドは、コンテナイメージのビルド (docker build) なのですが、コンテナイメージはすでに作成済みなため、このコマンドはスキップします。代わりに、ローカルに保存されている作成済みのコンテナイメージを確認します。

ローカルに保存されているコンテナイメージの一覧は docker images コマンドで表示できます。(前回作成したコンテナイメージは hello-node-app という名前なので、その名前で grep しています)

$ docker images | grep hello-node-app 
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
hello-node-app                  v1                  1076c985e0d9        2 months ago        161MB
hello-node-app                  v2                  b978ea3f75e2        2 months ago        161MB

hello-node-app というリポジトリ名でタグが v1 と v2 の 2 つの コンテナイメージが出てきたと思います。

※ もし何も表示されない場合は、前回の手順でもう一度コンテナイメージのビルドを行ってください。

前回、docker commit で作成したコンテナイメージが v1 (hello-node-app:v1) 。そして、docker build で作成したコンテナイメージが v2 (hello-node-app:v2) です。

今回は、docker build で作成したコンテナイメージ (hello-node-app:v2) をプライベートリポジトリにアップロードします。

アップロードするコンテナイメージの確認

以下の 2 つのコマンドを実行し、コンテナイメージをプライベートリポジトリにアップロードします。
※ お試しになられる方は、XXXXXXXX の部分をご自身の AWS アカウント ID に置き換えてください

$ docker tag hello-node-app:v2 XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2
$ docker push XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2

~ 実行結果(一部マスキングしています) ~
The push refers to repository [XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app]
b8de71f49a4c: Pushed 
9bf96362e33c: Pushed 
6f15325cc380: Pushed 
1e77dd81f9fa: Pushed 
030309cad0ba: Pushed 
v2: digest: sha256:4d6a068636eb11075ee319d28903cd7cdd78061a85e7f57d90f5e486e5e7186f size: 1362

最初のコマンドは、docker tag コマンドで ローカル内のコンテナイメージ名を変更しています。

具体的には、hello-node-appXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app という名前に変更することで、「このコンテナイメージは、Amazon ECR の東京リージョン (ap-northeast-1) の XXXXXXXX という AWS アカウント ID の hello-node-app というプライベートリポジトリを利用するコンテナイメージですよ」ということを表しています。

ちなみに、タグは、今回は v2 のまま変更しません。

2 つ目のコマンド (docker push) で、実際にコンテナイメージのアップロードを行っています。

さきほどの説明の通り、コンテナイメージ名 (XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app) 自体に、プライベートリポジトリの場所 (Amazon ECR、東京リージョン、XXXXXXXX という AWS アカウント ID) も記載されているため、docker push <コンテナイメージ名:タグ> だけでアップロードできます。

これでコンテナイメージのアップロードが完了です。
念の為、AWS マネジメントコンソールでも確認してみます。

図のように「hello-node-app」をクリックすると、実際に保存されているコンテナイメージの一覧が確認でき、v2 というタグがついたコンテナイメージがアップロードされていることが分かります。

クリックすると拡大します

クリックすると拡大します

以上で、作成したコンテナイメージをプライベートリポジトリにアップロードすることができました。

最後に、ローカル環境と別の環境を用意して、そこでコンテナを動かしてみたいと思います。


3. 別環境 (AWS Cloud9) の用意

別のコンテナ実行環境を用意して、プライベートリポジトリからさきほどのアップロードしたコンテナイメージをダウンロードして、コンテナを起動してみたいと思います。

さて、別環境をどうやって用意するかですが、今回は、Web ブラウザからコードの記述・実行・デバッグが行えるクラウドベースの統合開発環境 (IDE) の AWS Cloud9 を利用します。

※ AWS Cloud9 環境は こちらの「3. 準備 - Cloud9 環境の作成」を参考に作成いただけます。Web ブラウザ でこちらのような画面が表示されたら完成です。

※ 次以降のコマンドは AWS Cloud9 上 (Webブラウザ上) で実行していきます。


4. コンテナイメージをコンテナレジストリから別環境 (AWS Cloud9) にダウンロード

AWS Cloud9 にはあらかじめ Docker や AWS CLI など今回必要なツール群がインストールされているため、追加セットアップ作業の必要はありません。

さっそく、さきほどアップロードしたコンテナイメージをダウンロードしましょう。

プライベートレジストリの認証

まずは、アップロードの時と同様に、Amazon ECR にアクセスできるように認証を行います。
(さきほどのローカル環境で実行したのと全く同じコマンドです)

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
~ 省略 ~
Login Succeeded

Amazon ECR プライベートリポジトリからコンテナイメージのダウンロード

次に、プライベートリポジトリからコンテナイメージをダウンロードします。ダウンロードは docker pull コマンドでしたね。(XXXXXXXX は、自身の AWS アカウント ID に置き換えてください)

アップロード (docker push) の時と同様に、コンテナイメージ名の中にプライベートリポジトリの場所が記載されているため、docker pull <コンテナイメージ名:タグ> だけでダウンロードできます。

$ docker pull XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2

~ 実行結果(一部マスキングしています) ~
v2: Pulling from hello-node-app
6e0aa5e7af40: Pull complete 
d47239a868b3: Pull complete 
49cbb10cca85: Pull complete 
f7b99e2d53c7: Pull complete 
4ae2a8e16239: Pull complete 
Digest: sha256:4d6a068636eb11075ee319d28903cd7cdd78061a85e7f57d90f5e486e5e7186f
Status: Downloaded newer image for XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2
XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2

これでコンテナイメージのダウンロードが完了しました。

ダウンロードしたコンテナイメージの確認

docker images コマンドで、コンテナイメージが AWS Cloud9 上に保存されていることを確認します。

$ docker images | grep hello-node-app
REPOSITORY                                                     TAG          IMAGE ID       CREATED        SIZE
XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app   v2           b978ea3f75e2   2 months ago   161MB

XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app という名前のコンテナイメージ (タグは v2) が、AWS Cloud9 上に保存されていることが確認できますね。

これで、コンテナレジストリを仲介して、別環境 (AWS Cloud9) に、コンテナイメージを運ぶことができたので、さっそくコンテナを起動してみましょう。


5. 別環境 (AWS Cloud9) 上でコンテナの起動

ダウンロードしたコンテナイメージ (XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2) からコンテナを起動してみましょう。

コンテナを起動するコマンドは docker run でしたね。

$ docker run -t XXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hello-node-app:v2
Hello, world

Hello, world と出力されていますね。
確かに、別環境でも、コンテナ内で起動したアプリケーションが同様に動作したことが確認できました。

アプリケーションが動くのに必要な、アプリケーションコード、ランタイム、ライブラリなどの依存物を 1 つにパッケージングしたものがコンテナであり、前回は簡単なアプリケーション入りコンテナイメージを作成しました。

そして、今回はそのコンテナイメージを、コンテナリポジトリにアップロードして、別環境に運んだだけなので、コンテナイメージの中身自体に変更は一切加えていません。つまり、このコンテナは別環境でも同じ動作するという再現性があります。

今回作成したのが Hello, world と表示するだけのシンプルなアプリケーションのため、あまり実感はないかもしれませんが、この再現性により、ローカル環境で起動したコンテナも、別環境で起動したコンテナも全く同じ動作をしています。


作成した AWS リソースの削除


まとめ

過去 4 回の連載の中で、コンテナとは何か?といった全般的な話や、Docker が生まれた背景といった豆知識的な話。そして、コンテナイメージの作成・運搬・実行といった少し実践的な話など、多岐に渡るお話ができたと思います。ただ、実務でコンテナを使いこなしていくには、まだまだ情報が足りないと思われている読者の方も多いのではないでしょうか。

本記事でこの連載には一旦区切りをつけ、皆様のフィードバックを頂戴する期間を設けさせていただき、来年以降、量・質ともにパワーアップして戻ってきたいと思います。

コンテナの学習には、AWS Black Belt Online Seminar での AWS コンテナサービスシリーズ もぜひご活用ください。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

原田 和則
アマゾン ウェブ サービス ジャパン合同会社
テクニカルソリューションアーキテクト

インフラエンジニアとして経験を積む中で、クラウドに携わりたい想いで AWS へ。
業種業態、技術領域を問わず、様々なお客様の AWS 活用支援を行っています。

林 政利 (@literalice)
アマゾン ウェブ サービス ジャパン合同会社
コンテナスペシャリスト ソリューションアーキテクト

フリーランスや Web 系企業で業務システムや Web サービスの開発、インフラ運用に従事。近年はベンダーでコンテナ技術の普及に努めており、現在、AWS Japan で Amazon ECS や Amazon EKS でのコンテナ運用や開発プロセス構築を中心にソリューションアーキテクトとして活動中。

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する