Cloud Run

Cloud Runにアプリをデプロイする方法を分かりやすく解説

Google Cloud Runにアプリをデプロイする方法を分かりやすく解説【GCP】

Cloud Runにアプリをデプロイする方法を分かりやすく解説します。

環境情報
  • Docker version:20.10.5
  • Google Cloud SDK:325.0.0

Cloud Runとは【GCPのサーバーレスなコンテナ実行環境】

Google Cloud Runの仕組み

Cloud Runとは、サーバーレス(サーバーの管理が不要)なコンテナ実行環境を提供するGCPのサービスです。

 

Cloud Runを利用することで、アプリのDockerイメージを指定するだけで簡単にアプリをデプロイすることができます。

 

また、GKEと違い、クラスタやKubernetesの設定はGCP側が自動で行ってくれます。

そのため、簡易版のGKEというイメージでもいいのではないかと思います。

 

以下のビデオはCloud Runの概要が簡潔にまとめられているので、参考にしてみて下さい。

 

Cloud Runにアプリをデプロイする方法を分かりやすく解説

Cloud Runにアプリをデプロイする方法を分かりやすく解説します。

今回は、Cloud RunにLaravelアプリをデプロイしてデフォルト画面を表示させるのを目標とします。(Laravelを例として使用しますが、手順自体はどのアプリでも同じです)

必要な手順は以下の通り。

  1. Cloud Runにデプロイするアプリを作成する
  2. Dockerfileを作ってアプリをDockerイメージにする
  3. 作成したDockerイメージにタグ(別名)を付ける
  4. GCR(レジストリ)に作成したイメージをpushする
  5. イメージを指定してCloud Runにアプリをデプロイする

 

1. Cloud Runにデプロイするアプリを作成する

まずはデプロイするアプリをローカルで開発します。

今回は、以下の記事を参考にデフォルト画面が映るだけのLaravelアプリを開発しました。

Laravel開発環境をDockerを使ってサクッと構築する【最小限のコード】
Laravel開発環境をDockerを使ってサクッと構築する【最小限のコード】Laravel開発環境をDockerを使ってサクッと構築する方法を解説します。...

 

ローカル環境で以下のようなデフォルト画面が表示される状態です。

Laravel8のデフォルト画面

2. Dockerfileを作ってアプリをDockerイメージにする

デプロイ用のDockerfileを作ってアプリをDockerイメージにパッキングします。

 

デプロイ用のDockerfileを作成する

まずは以下のDockerfileを作成して下さい。

FROM php:8.0-apache
    
RUN sed -i 's/80/${PORT}/g' /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf \
&& sed -i 's!/var/www/html!/var/www/app/public!g' /etc/apache2/sites-available/000-default.conf

WORKDIR /var/www/app

COPY ./app .

RUN chmod -R 777 ./storage ./bootstrap/cache

RUN a2enmod rewrite

 

簡単にコードの説明をします。

FROMではベースイメージを指定しています。

今回は、ApacheでPHP(Laravel)を動かすためのイメージです。

 

一つ目のsedコマンドは、Apacheが受け付けるポートの書き換えをしています。

なぜ書き換える必要があるかというと、Apacheはデフォルトで80番ポートを受け付けますが、Cloud Runはデフォルトで8080ポートにリクエストを送信するためです。

Apacheのデフォルトの設定のままだと、Cloud Runからのリクエストを処理することができません。

また、ポートの指定には、Cloud Runが提供しているPORT環境変数を使っています。この環境変数を使うことで、コンテナ内でCloud Runが送信するポートを取得することができます。

8080を直接指定していると、Cloud Runのデフォルトポートが変わった際にコードを修正する必要があるため、基本的にはPORT環境変数を使う方が良いでしょう。

参考:コードがリッスンしているポートを特定する

 

二つ目のsedはApacheのドキュメントルートの書き換えです。

Laravelではpublicディレクトリ配下のindex.phpで、プリケーションへ送信された全HTTPリクエストを最初に処理する仕様になっています。

そのため、Apacheのドキュメントルートをpublicディレクトリ配下に変更しています。

参考:Laravel:Publicディレクトリ

 

WORKDIRでは以降のコマンドを実行するディレクトリを指定します。

 

COPYではローカルのアプリのソースコードをコンテナ内の/var/www/appにコピーしています。

 

RUN chmodでは、Laravelのログファイルとキャッシュファイルに対して書き込みを許可しています。

これをやっておかないとLaravelは正しく実行されません。

参考:Laravel:ディレクトリパーミッション

 

最後のa2enmodでは、Apacheのrewriteモジュールを有効にしています。

これにより、Laravelのデフォルトページ(/)以外にアクセスすることが可能となります。(今回はデフォルトページしか表示させないので不要ですが、一応設定しています)

参考:Laravel:Apache

 

Dockerfileを使ってアプリのイメージをbuild(作成)する

次に、GCRにpushするイメージを作成(build)します。

以下のコマンドを実行して下さい。

docker build --file=deploy/Dockerfile -t app-image .

 

これでアプリのソースコードをパッキングしたapp-imageという名前のDockerイメージが作成されます。

 

補足:Cloud Runにデプロイする前にローカルでコンテナの動作確認をする

デプロイするDockerイメージによる動作ををGCR(レジストリ)にpushする前にローカルで確認したい場合は、以下のようなdocker-compose.yamlを定義することで確認できます。(ディレクトリ等は環境に合わせて書き換えて下さい)

version: '3'
services:
  test:
    build:
      context: .
      dockerfile: ./deploy/Dockerfile
    ports:
      - ${TEST_PORT:-80}:8080
    working_dir: /var/www/app
    environment:
      PORT: 8080

 

localhostでアクセスしてLaravelのデフォルト画面が表示できたらDockerfileの設定はOKです。

 

3. 作成したDockerイメージにタグ(別名)を付ける

GCRにpushする前の事前準備として、先ほど作成したイメージにタグを付けます。

以下のコマンドを実行して下さい。

docker tag app-image asia.gcr.io/project-id/app-image:v1
docker tag app-image asia.gcr.io/project-id/app-image:latest

 

※ project-idには自身のGCPのプロジェクトのIDを指定して下さい

 

先ほど作成した「app-image」イメージに対して、「ホスト名」「プロジェクトID」「イメージ名」「タグ」を結合した名前を付けています。

これにより、指定したプロジェクトの指定した場所に指定した名前でDockerイメージをpushすることができます。

 

また、v1を付けたイメージが最新であることを示すために、latestタグも同時に付与しています。

 

4. GCR(レジストリ)に作成したイメージをpushする

以下のコマンドを実行してGCRにアプリのイメージをpush(アップロード)します。

docker push asia.gcr.io/project-id/app-image:v1
docker push asia.gcr.io/project-id/app-image:latest

 

GCRを確認して、イメージがアップロードできていたらOKです。

 

5. イメージを指定してCloud Runにアプリをデプロイする

GCRにpushしたイメージを使ってCloud Runにアプリ(Laravel)をデプロイします。

以下のコマンドを実行して下さい。

gcloud run deploy cloudrun-test --image asia.gcr.io/project-id/app-image:v1 --region asia-east1 --platform managed

 

cloudrun-testは今回デプロイするCloud Runの名前です。任意の値を指定して下さい。

 

–imageには、先ほどGCRにpushしたDockerイメージ名を指定します。

これにより、Cloud Run上にアプリのコンテナが生成されます。

 

–regionはCloud Runを動作させる環境です。

イメージをpushしたGCRと同じ大陸にあるCloud Runにデプロイする場合は料金が発生しません。そのため、基本的にはGCRと同じ地域を指定すると良いでしょう。

参考:Cloud Run:料金

 

platformではCloud Runをどのプラットフォームで動かすかを指定できます。

managedを指定した場合は、インフラ面(Kubernetesの設定など)は全てGCPが管理してくれるので、開発者は何もする必要はありません。(イメージを指定してデプロイコマンドを打つだけ)

 

デプロイが完了したら、ターミナルの最後にService URLが表示されます。

これがCloud RunにデプロイしたサービスにアクセスするためのURLです。

 

実際にこのURLにアクセスしてLaravelのデフォルト画面が表示されるかを確認しましょう。

Laravel8のデフォルト画面

 

表示できました。

 

Cloud Runにアプリをデプロイする方法まとめ

今回はCloud Runにアプリをデプロイする手順を解説しました。

基本的には、以下の5ステップで簡単にアプリをリリースすることができます。

  1. Cloud Runにデプロイするアプリを作成する
  2. Dockerfileを作ってアプリをDockerイメージにする
  3. 作成したDockerイメージにタグ(別名)を付ける
  4. GCR(レジストリ)に作成したイメージをpushする
  5. イメージを指定してCloud Runにアプリをデプロイする

 

この記事がアプリをCloud Runにデプロイする上で少しでも参考になっていれば幸いです。

 

 補足:GKEにデプロイする方法も解説しています

今回は、Cloud Runにアプリをデプロイする方法を解説しましたが、以下の記事ではGKEにアプリをデプロイする方法もまとめてあります。

興味のある方は読んで頂けると嬉しいです。

GKEに簡単なPHPアプリを手動デプロイする方法を分かりやすく解説【ハンズオン】
GKEに簡単なPHPアプリを手動デプロイする方法を分かりやすく解説GKEに簡単なPHPアプリを手動デプロイする方法を分かりやすく解説します。...

 

Cloud Run:参考書籍

参考記事

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA