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 ウェブサイトの「ファイルリファレンスの作成」を参照してください。

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

  • アプリケーションファイル、アプリケーションファイルの依存関係、.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 Systems Manager (SSM) パラメータストア

  • Dockerrun.aws.json v3 ファイル

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

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

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

注記

これらのステップを完了するには、AWS Systems Manager を設定する必要があります。詳細については、『AWS Systems Manager ユーザーガイド』を参照してください。

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

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. AWS Systems Manager パラメータストアを使用してプライベートリポジトリの認証情報を保存し、Elastic Beanstalk が必要に応じて認証情報を取得できるようにします。これを行うには、put-parameter コマンドを実行します。

    aws ssm put-parameter --name USER --type String —value "username" aws ssm put-parameter --name PASSWD --type String —value "passwd"
  3. 次の env.config ファイルを作成し、前述のディレクトリ構造に示すように、.ebextensions ディレクトリに配置します。

    注記

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

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

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

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

    01loging.sh スクリプトは、まず get-config ツールを呼び出してリポジトリの認証情報を取得し、次に docker login を呼び出してリポジトリに対して認証を行います。

    注意
    • すべてのスクリプトファイルには、実行アクセス許可が必要です。フックファイルの実行アクセス許可を設定するために chmod +x を使用します。

    • フックファイルは、バイナリファイル、またはインタプリタパスを含む #! 行で始まるスクリプトファイル (#!/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 AMI Docker プラットフォームバージョン (Amazon Linux 2 より前) を使用している場合、「Amazon Linux AMI での Docker 設定 (以前の Amazon Linux 2)」の関連情報を読んでください。

    認証ファイルの詳細については、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 を実行します。

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 ウェブサイトの Dockerfile Reference を参照してください。

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

    注記

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

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

    認証ファイルを Dockerrun.aws.json v1 ファイルの Authentication パラメータに含む 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" }