AWS ECRにLaravel用のDockerイメージを作成しpushする

AWS

こんにちは、ニキです。

今回の記事では、ECRにDockerイメージをpushする手順を解説します。

ECRリポジトリにイメージを登録しておくと、ECS等のコンテナサービスから使用できます。

ECRにDockerイメージをpushする手順は以下の流れです。

  • レジストリに対して Docker CLIを認証
  • ECRリポジトリを作成
  • ローカルのDockerイメージにECRリポジトリのURIをタグ付け
  • DockerイメージをECRリポジトリへpush

それでは、解説していきます。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

ECRレジストリに対してDocker CLIを認証

ECRへイメージをpushするために、レジストリに対して Docker CLIを認証します。

すでに認証済みの場合は、このステップは不要です。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com

認証に成功すると以下のように出力されます。

Login Succeeded

ECRリポジトリを作成

ECRリポジトリを作成します。

以下では、hello-repositoryというリポジトリをap-northeast-1に作成しています。profileのrigionと同じでよければ指定不要です。

aws ecr create-repository --repository-name hello-repository --region ap-northeast-1

以下のように出力されます。

{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:aws_account_id:repository/hello-repository",
        "registryId": "aws_account_id",
        "repositoryName": "hello-repository",
        "repositoryUri": "aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository",
        "createdAt": "2023-10-07T13:28:35+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": false
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

ECRコンソール上では、以下のように作成されていることを確認できます。

ECRにDockerイメージをpush

Dockerイメージの作成

以下のようなDockerfileを想定しています。

FROM php:8.2.8-fpm

COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY ./src /var/www/html/example

RUN docker-php-ext-install pdo_mysql

Nginxの設定ファイルに環境変数を用いたいので、テンプレートファイルを使用しています。fastcgi_passの値を開発環境とECSで分ける必要があります。

FROM nginx:1.25.1

COPY ./default.conf.template /etc/nginx/templates/default.conf.template
COPY ./src /var/www/html/example

Nginxの設定ファイルです。PHP_HOSTが環境変数の値に置換されます。

server {
    listen 80;
    listen [::]:80;
    server_name localhost;
    root /var/www/html/example/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass ${PHP_HOST}:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

pushするイメージ作成をするための方法を3パターン紹介します。

ビルドするパターン

DockerfileからDockerイメージを作成します。実際のCDパイプラインでは毎度ビルドするので、この方法で作成するとDockerfileの安心感があります。

docker build --tag AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php --file php.Dockerfile .
docker build --tag AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx --file nginx.Dockerfile .

コンテナから作成するパターン

作成済みのコンテナから作成します。ローカル環境で動作確認しているので、安心感があります。

docker commit php AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php
docker commit php AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx

イメージにタグ付けするパターン

タグ付けを後から行いたい場合に便利な方法です。

docker tag hello-world aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository

以下のようにタグ付けされます。

hello-world                                                              1.25.1                 ff78c7a65ec2   2 months ago   192MB
AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository     latest                 ff78c7a65ec2   2 months ago   192MB

Dockerイメージをpush

DockerイメージをECRリポジトリへpushします。

docker push AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php
docker push AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx

以下のように出力されれば成功です。

Using default tag: latest
The push refers to repository [aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository]
facf79a780de: Pushed
83cb32b689ff: Pushed
482f7b7b1b03: Pushed
3c6148273d48: Pushed
1e451eaa30b3: Pushed
b0ff37385ae9: Pushed
8450f74cd36b: Pushed
latest: digest: sha256:6faff3cb6b8c141d4828ac6c884a38a680ec6ad122c19397e4774f0bb9616f0c size: 1778

ECRコンソールのイメージ一覧の画面に以下のように表示されています。

まとめ

今回の記事では、ECRにDockerイメージをpushする手順を解説しました。

さらに詳しく学びたい方は、以下の書籍がおすすめです。

Docker/Kubernetes 実践コンテナ開発入門

コンテナ技術をこれから学びたい方、あるいはすでに基本的な知識を持っているが実践的なスキルを伸ばしたい方に最適な書籍です。この書籍では、Dockerの基本操作から始まり、Kubernetesでのクラスタ管理、サービスの自動化、スケーリング、ネットワークの設定といった高度な内容に至るまで、手厚くガイドしてくれます。

効率的に学習するならプログラミングスクールの検討もありです。

PRUMエンジニア留学


PRUMエンジニア留学は、実践的なオンラインプログラミングスクールで、未経験者でもエンジニア転職や副業を目指せます。カリキュラムは実務レベルのチーム開発を含み、基礎から応用までを学べます。個別メンタリングや進捗可視化で学習をサポートし、エンジニアとしての実務経験とコミュニケーションスキルも身に付けられます。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
AWS
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました