Docker の設定 - AWS Elastic Beanstalk

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

Docker の設定

このセクションでは、Elastic Beanstalk にデプロイする Docker イメージとコンテナを準備する方法について説明します。

Docker Compose ありのドッカー環境

このセクションでは、Elastic Beanstalk にデプロイする Docker イメージとコンテナを準備する方法について説明します。Docker 環境で Elastic Beanstalk にデプロイするウェブアプリケーションには、Docker Compose ツールも使用する場合は docker-compose.yml ファイルを含める必要があります。次のいずれかのアクションを実行して、ウェブアプリケーションをコンテナ化されたサービスとして Elastic Beanstalk にデプロイできます。

  • docker-compose.yml ファイルを作成して、ホストされたレポジトリから Elastic Beanstalk に Docker イメージをデプロイします。すべてのデプロイのソースがパブリックリポジトリ内のイメージである場合、他のファイルは不要です。(デプロイのソースをプライベートリポジトリのイメージにする必要がある場合、認証用の追加の設定ファイルを含める必要があります。詳しくは、「プライベートリポジトリのイメージを使用する」を参照してください。docker-compose.yml ファイルの詳細については、Docker ウェブサイトの「Compose file reference」を参照してください。

  • Dockerfile を作成し、Elastic Beanstalk でカスタムイメージをビルドして実行します。このファイルは、デプロイの要件に応じて必要になりますです。Dockerfile の詳細については、Docker ウェブサイトの「Dockerfile reference」を参照してください。

  • アプリケーションファイル、アプリケーションファイルの依存関係、.zip、および Dockerfile ファイルを含む docker-compose.yml ファイルを作成します。EB CLI を使用してアプリケーションをデプロイする場合には、.zip ファイルが自動的に作成されます。2 つのファイルは、.zip アーカイブのルートまたは最上位レベルにある必要があります。

    docker-compose.yml のみを使用してアプリケーションをデプロイする場合、.zip ファイルを作成する必要はありません。

このトピックは、構文リファレンスです。Elastic Beanstalk を使用して Docker 環境を起動する手順の詳細については、「」を参照してくださいDocker プラットフォームブランチの使用

Docker Compose の詳細およびインストール方法については、Docker サイトの「Docker Compose の概要」および「Docker Compose のインストール」を参照してください。

注記

Docker Compose を使用して Docker 環境を設定しない場合は、docker-compose.yml ファイルを使用しないでください。代わりに、Dockerrun.aws.json ファイル、Dockerfile またはその両方を使用します。

詳細については、「」を参照してくださいDocker プラットフォームの設定 (Docker Compose なし)

プライベートリポジトリからのイメージの使用

Elastic Beanstalk は、プライベートリポジトリからイメージをプルしてデプロイする前に、プライベートリポジトリをホストするオンラインレジストリで認証する必要があります。リポジトリに認証するために、Elastic Beanstalk 環境用の認証情報を保存および取得する、2 つのオプションの例を示します。

  • AWS Secrets Manager

  • Dockerrun.aws.json v3 ファイル

デプロイプロセスを開始する前に、プライベートリポジトリにログインするように Elastic Beanstalk を設定できます。これにより、Elastic Beanstalk はリポジトリからイメージにアクセスし、これらのイメージを Elastic Beanstalk 環境にデプロイできます。

この設定は、Elastic Beanstalk デプロイプロセスのビルド前フェーズでイベントを開始します。.ebextentions 設定ディレクトリでこれをセットアップします。この設定では、docker login を呼び出すプラットフォームフックスクリプトを使用して、プライベートリポジトリをホストするオンラインレジストリを認証します。これらの設定ステップの詳細な内訳を次に示します。

AWS Secrets Manager を使用してプライベートリポジトリに対して認証するよう Elastic Beanstalk を設定するには
注記

これらの手順を完了するには、特定の権限を付与する必要があります。詳細については、以下のリファレンスを参照してください。

  • ステップ 2 では、シークレットを作成する権限が必要です。詳細については、AWS Secrets Manager ユーザーガイドの「例: シークレットを作成する権限」を参照してください。

  • ステップ 3 では、secretsmanager 動的参照を使用してシークレットを取得する権限が必要です。詳細については、「AWS Secrets Manager ユーザーガイド」の「例: シークレット値を取得するアクセス許可」を参照してください。

  1. 次のように .ebextensions ディレクトリ構造を作成します。

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. AWS Secrets Manager を使用してプライベートリポジトリの認証情報を保存し、Elastic Beanstalk が必要に応じて認証情報を取得できるようにします。そのためには、シークレットマネージャーの create-secret AWS CLI コマンドを実行します。

    aws secretsmanager create-secret \ --name MyTestSecret \ --description "My image repo credentials created with the CLI." \ --secret-string "{\"USER\":\"EXAMPLE-USERNAME\",\"PASSWD\":\"EXAMPLE-PASSWORD\"}"
  3. 次の env.config ファイルを作成し、前述のディレクトリ構造に示すように、.ebextensions ディレクトリに配置します。この設定では、aws: elasticbeanstalk: application: environment 名前空間を使い、AWS Secrets Manager への動的参照を利用して USER および PASSWD Elastic Beanstalk 環境変数を初期化します。secretsmanager 動的参照の詳細については、AWS Secrets Manager ユーザーガイドの「AWS CloudFormation リソース内の AWS Secrets Manager シークレットの取得」を参照してください。

    注記

    スクリプト内の USER および PASSWD は、前述の secretsmanager create-secret コマンドで使用したものと同じ文字列と一致する必要があります。

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:secretsmanager:MyTestSecret:SecretString:USER}}' PASSWD: '{{resolve:secretsmanager:MyTestSecret:SecretString:PASSWD}}'
  4. 次の 01login.sh スクリプトファイルを作成し、次のディレクトリに配置します (前述のディレクトリ構造にも示されています)。

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

    ### example 01login.sh #!/bin/bash USER=/opt/elasticbeanstalk/bin/get-config environment -k USER /opt/elasticbeanstalk/bin/get-config environment -k PASSWD | docker login -u $USER --password-stdin

    01login.sh スクリプトは get-config プラットフォームスクリプトを呼び出して、リポジトリの認証情報を取得し、リポジトリにログインします。ユーザー名を USER スクリプト変数に格納します。次の行で、パスワードを取得します。パスワードをスクリプト変数に格納せずに、スクリプトはパスワードを stdin 入力ストリームの docker login コマンドに直接パイプします。--password-stdin オプションでは入力ストリームを使用するため、パスワードを変数に格納する必要はありません。Docker コマンドラインインターフェイスによる認証の詳細については、Docker ドキュメンテーション Web サイトの「docker ログイン」を参照してください。

    メモ
    • すべてのスクリプトファイルには、実行アクセス許可が必要です。フックファイルの実行アクセス許可を設定するために chmod +x を使用します。2022 年 4 月 29 日以降にリリースされたすべての Amazon Linux 2 ベースのプラットフォームバージョンでは、Elastic Beanstalk はすべてのプラットフォームフックスクリプトに対して実行アクセス権限を自動的に付与します。この場合、実行アクセス権限を手動で付与する必要はありません。これらのプラットフォームのバージョンのリストについては、「AWS Elastic Beanstalkガイドリリースノート」の 2022 年 4 月 29 日- Linux プラットフォームリリースノートを参照してください。

    • フックファイルは、バイナリファイル、またはインタプリタパスを含む #! 行で始まるスクリプトファイル (#!/bin/bash など) です。

    • 詳細については、「Elastic Beanstalk Linux プラットフォームの拡張」の「プラットフォームフック」を参照してください。

Elastic Beanstalk がプライベートリポジトリをホストするオンラインレジストリで認証した後、イメージをプルしてデプロイできます。

このセクションでは、プライベートリポジトリに対して Elastic Beanstalk を認証する別の方法について説明します。この方法では、Docker コマンドを使用して認証ファイルを生成し、認証ファイルを Amazon S3 バケットにアップロードします。また、Dockerrun.aws.json v3 ファイルにバケット情報を含める必要もあります。

認証ファイルを生成して Elastic Beanstalk に提供するには
  1. docker login コマンドを使用して認証ファイルを生成します。Docker Hub のリポジトリでは、docker login を実行します。

    $ docker login

    他のレジストリでは、レジストリサーバーの URL を入力します。

    $ docker login registry-server-url
    注記

    Elastic Beanstalk 環境で (Amazon Linux 2 より前の) Amazon Linux AMI Docker プラットフォームバージョンを使用している場合は、「(Amazon Linux 2 より前の) Amazon Linux AMI での Docker 設定」の関連情報をお読みください。

    認証ファイルの詳細については、Docker ウェブサイトのDocker ハブにイメージを保存するおよびdocker ログインを参照してください。

  2. .dockercfg という名前の認証ファイルのコピーを安全な Amazon S3 バケットにアップロードします。

    • Amazon S3 バケットは、バケットを使用している環境と同じ AWS リージョン でホストする必要があります。Elastic Beanstalk は、他のリージョンでホストされている Amazon S3 バケットからファイルをダウンロードすることはできません。

    • インスタンスプロファイル内の IAM ロールに s3:GetObject オペレーションを許可します。詳細については、「」を参照してくださいElastic Beanstalk インスタンスプロファイルの管理

  3. Amazon S3 バケット情報を、Authentication ファイルの Dockerrun.aws.json v3 パラメータに含めます。

    Dockerrun.aws.json v3 ファイルの例を次に示します。

    { "AWSEBDockerrunVersion": "3", "Authentication": { "bucket": "DOC-EXAMPLE-BUCKET", "key": "mydockercfg" } }
    注記

    AWSEBDockerrunVersion パラメータは、Dockerrun.aws.json ファイルのバージョンを示します。

    • Docker Amazon Linux 2 プラットフォームは、Docker Composeを使用する環境用の Dockerrun.aws.json v3 ファイルを使用します。Docker Composeを使用しない環境では Dockerrun.aws.json v1 ファイルを使用します。

    • マルチコンテナ Docker Amazon Linux AMI プラットフォームは、Dockerrun.aws.json v2 ファイルを使用します。

Elastic Beanstalk がプライベートリポジトリをホストするオンラインレジストリで認証した後、イメージをデプロイしてプルできます。

Dockerfile を使用したカスタムイメージの構築

リポジトリでホストされている既存のイメージがない場合は、Dockerfile を作成する必要があります。

以下のスニペットは Dockerfile の例です。「Docker プラットフォームブランチの使用」の手順に従う場合は、この手順の Dockerfile をそのままアップロードできます。この Dockerfile を使用する場合、Elastic Beanstalk はゲーム 2048 を実行します。

Dockerfile に含めることができる命令の詳細については、Docker ウェブサイトの Dockerfile Reference を参照してください。

FROM ubuntu:12.04 RUN apt-get update RUN apt-get install -y nginx zip curl RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN curl -o /usr/share/nginx/www/master.zip -L https://codeload.github.com/gabrielecirulli/2048/zip/master RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048-master/* . && rm -rf 2048-master master.zip EXPOSE 80 CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]
注記

単一の Dockerfile からマルチステージビルドを実行して、より小さなサイズのイメージを生成し、複雑さを大幅に軽減できます。詳細については、Docker ドキュメントのウェブサイトのマルチステージビルドを使用するを参照してください。

Docker プラットフォームの設定 (Docker Compose なし)

Elastic Beanstalk Docker 環境で Docker Compose が使用されていない場合は、次のセクションの追加情報を読んでください。

Docker 環境で Elastic Beanstalk にデプロイするウェブアプリケーションは、Dockerfile または Dockerrun.aws.json ファイルを含んでいる必要があります。以下のいずれかのアクションを行うことによって Docker コンテナから Elastic Beanstalk にウェブアプリケーションをデプロイできます。

  • Dockerfile を作成し、Elastic Beanstalk でカスタムイメージをビルドして実行します。

  • Dockerrun.aws.json ファイルを作成して、ホストされたレポジトリから Elastic Beanstalk に Docker イメージをデプロイします。

  • アプリケーションファイル、アプリケーションファイルの依存関係、.zip、および Dockerfile ファイルを含む Dockerrun.aws.json ファイルを作成します。EB CLI を使用してアプリケーションをデプロイする場合には、.zip ファイルが自動的に作成されます。

    Dockerfile のみ、または Dockerrun.aws.json ファイルのみを使用してアプリケーションをデプロイする場合、.zip ファイルを作成する必要はありません。

このトピックは、構文リファレンスです。Docker 環境の起動の詳細な手順については、「」を参照してくださいDocker プラットフォームブランチの使用

セクション

    Dockerrun.aws.json ファイルは、リモート Docker イメージを Elastic Beanstalk アプリケーションとしてデプロイする方法を記述します。この JSON ファイルは Elastic Beanstalk に固有です。ホストされたレポジトリで使用できるイメージでアプリケーションが実行される場合、Dockerrun.aws.json v1 ファイルでイメージを指定し、Dockerfile を省略できます。

    Dockerrun.aws.json v1 ファイルの有効なキーと値には、以下のオペレーションが含まれます。

    AWSEBDockerrunVersion

    (必須)単一コンテナの Docker 環境にバージョン番号を値「1」として指定します。

    認証

    (プライベートリポジトリの場合にのみ必須) .dockercfg ファイルを保存する Amazon S3 オブジェクトを指定します。

    プライベートリポジトリからのイメージの使用」を参照してください。

    イメージ

    Docker コンテナを作成するときにベースとなる既存の Docker リポジトリの Docker ベースイメージを指定します。Name キーの値を、Docker Hub 上のイメージの場合は <organization>/<image name> 形式で、その他のサイトの場合は <site>/<organization name>/<image name> 形式で指定します。

    Dockerrun.aws.json ファイルでイメージを指定すると、Elastic Beanstalk 環境内の各インスタンスが docker pull を実行してイメージを実行します。必要に応じて Update キーを含めます。デフォルト値は true であり、これはリポジトリをチェックし、イメージに対する更新を検出して、キャッシュされているイメージを上書きするように Elastic Beanstalk に指示します。

    Dockerfile を使用するときは、Dockerrun.aws.json ファイルで Image キーを指定しないでください。Elastic Beanstalk は、存在する場合は Dockerfile に示されているイメージを常に構築して使用します。

    ポート

    (Image キーを指定する場合は必須) Docker コンテナで公開するポートをリストアップします。Elastic Beanstalk は、ContainerPort の値を使用して、ホストで実行されているリバースプロキシに Docker コンテナを接続します。

    複数のコンテナポートを指定できますが、Elastic Beanstalk では最初のポートのみが使用されます。このポートを使用して、コンテナをホストのリバースプロキシに接続し、公衆インターネットからのリクエストをルーティングします。Dockerfile を使用している場合、最初の ContainerPort の値は、DockerfileEXPOSE リストの最初のエントリに一致する必要があります。

    必要に応じて、HostPort でポートのリストを指定することができます。HostPort エントリは、ContainerPort の値がマッピングされるホストポートを指定します。HostPort 値を指定しなかった場合、デフォルトで ContainerPort 値に設定されます。

    { "Image": { "Name": "image-name" }, "Ports": [ { "ContainerPort": 8080, "HostPort": 8000 } ] }
    ボリューム

    EC2 インスタンスのボリュームを Docker コンテナにマッピングします。1 つ以上のボリューム配列をマッピング対象として指定します。

    { "Volumes": [ { "HostDirectory": "/path/inside/host", "ContainerDirectory": "/path/inside/container" } ] ...
    ログ収集

    アプリケーションがログを書き込むコンテナ内のディレクトリを指定します。ログ末尾やバンドルログをリクエストすると、Elastic Beanstalk によって Amazon S3 にこのディレクトリ内のログがすべてアップロードされます。このディレクトリ内の rotated という名前のフォルダに対してログをローテーションさせる場合は、ローテーションさせたログを保管用に Amazon S3 にアップロードするように、Elastic Beanstalk を設定することもできます。詳細については、「」を参照してくださいElastic Beanstalk 環境の Amazon EC2 インスタンスからのログの表示

    コマンド

    コンテナで実行するコマンドを指定します。エントリポイントを指定した場合、コマンドは引数としてエントリポイントに追加されます。詳細については、Docker ドキュメントのCMD を参照してください。

    エントリポイント

    コンテナの開始時に実行するデフォルトのコマンドを指定します。詳細については、Docker ドキュメントの docker ps を参照してください。

    以下のスニペットは、1 つのコンテナの Dockerrun.aws.json ファイルの構文を示す例です。

    { "AWSEBDockerrunVersion": "1", "Image": { "Name": "janedoe/image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx", "Entrypoint": "/app/bin/myapp", "Command": "--argument" }

    Dockerrun.aws.json ファイルのみ、または .zipDockerrun.aws.json ファイルの両方を含んだ Dockerfile アーカイブを Elastic Beanstalk に提供できます。両方のファイルを提供する場合、Dockerfile は Docker イメージを記述し、Dockerrun.aws.json ファイルはデプロイに関する追加情報を提供します。これについては後ほど説明します。

    注記

    2 つのファイルは、.zip アーカイブのルートまたは最上位レベルにある必要があります。ファイルを含むディレクトリからアーカイブを構築しないでください。代わりに、そのディレクトリに移動し、そこでアーカイブを構築します。

    両方のファイルを提供する場合は、Dockerrun.aws.json ファイルにイメージを指定しないでください。Elastic Beanstalk は Dockerfile で記述されているイメージを構築および使用し、Dockerrun.aws.json ファイルに指定されているイメージを無視します。

    認証ファイルを Authentication ファイルの Dockerrun.aws.json v1 パラメータ内に含む Amazon S3 バケットに関する情報を追加します。Authentication パラメータに有効な Amazon S3 バケットとキーが含まれていることを確認します。Amazon S3 バケットは、バケットを使用している環境と同じ AWS リージョン でホストする必要があります。Elastic Beanstalk は、他のリージョンでホストされている Amazon S3 バケットからファイルをダウンロードしません。

    認証ファイルの作成とアップロードについては、「プライベートリポジトリからのイメージの使用」を参照してください。

    次の例は、サードパーティーレジストリでプライベートイメージを使用するように、mydockercfg というバケットに DOC-EXAMPLE-BUCKET という認証ファイルを使用する方法を示しています。

    { "AWSEBDockerrunVersion": "1", "Authentication": { "Bucket": "DOC-EXAMPLE-BUCKET", "Key": "mydockercfg" }, "Image": { "Name": "quay.io/johndoe/private-image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx" }