# Deploy a Docker image to Google Cloud using Cloud Run

> In this article, I would like to document how I deploy a Docker image to Google Cloud using Cloud Run.

## Build the docker image

Refer to my article [Dockerizing a Node.js web application](https://blog.adafycheng.dev/dockerizing-a-nodejs-web-application) for developing a Node.js application and building a docker image.

## Configure Google Cloud

### Create a Google Cloud Project

If you have already created a project, you can skip this section and go directly to [Configure a Google Cloud Project](#configure-a-google-cloud-project).

1. In Google Cloud Shell, perform the following steps:

    1. Lists credentialed accounts and make sure the desired account is set active.

        ```shell
        gcloud auth list
        ```

    2. Create a project.

        ```shell
        gcloud projects create PROJECT_ID
        ```

        * *Replace PROJECT_ID with your desired project ID.*
        
2. Enable Billing in Google Cloud Console.

### Configure a Google Cloud Project

1. List all projects.

    ```shell
    gcloud projects list
    ```
   
2. Set the default project.

    ```shell
    gcloud config set project PROJECT_ID
    ```

    * *Replace PROJECT_ID with your project ID.*

3. Print the project ID.

    ```shell
    echo $GOOGLE_CLOUD_PROJECT
    ```

4. Set the default [zone](https://cloud.google.com/compute/docs/regions-zones) if it is not set:

    ```shell
    gcloud config set compute/zone COMPUTE_ZONE
    ```

    * *Replace COMPUTE_ZONE with your compute zone, such as europe-west2-c.*

5. Set the default [region](https://cloud.google.com/compute/docs/regions-zones) if it is not set:

    ```shell
    gcloud config set compute/region COMPUTE_REGION
    ```

    * *Replace COMPUTE_REGION with your compute region, such as europe-west2.*

6. Show the configuration.

    ```shell
    gcloud config list
    ```

7. Enable APIs in Google Cloud Shell.

    1. Enable Cloud Run.

        ```shell
        run.googleapis.com
        ```

## Deploy to Google Cloud

### Deployment

1. Submit the docker image to Container Registry.

    ```shell
    gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/website
    ```

    * *Replace PROJECT_ID with your project ID.*
    
2. List all container images in this project to verify that the docker image has been submitted successfully.

    ```shell
    gcloud container images list
    ```

3. Deploy the Container Image to Cloud Run.

    ```shell
    gcloud run deploy CONTAINER_NAME \
    --image gcr.io/$GOOGLE_CLOUD_PROJECT/DOCKER_IMAGE_NAME:DOCKER_IMAGE_VERSION \
    --platform managed \
    --region GCR_REGION \
    --allow-unauthenticated
    ```

    * *Replace CONTAINER_NAME with the desired Container Name.*

    * *Replace DOCKER_IMAGE_NAME with your docker image name.*
   
    * *Replace DOCKER_IMAGE_VERSION with the version of your docker image name.*

    * *Replace PROJECT_ID with your project ID.*
    
    * *Replace GCR_REGION with your region, such as europe-west2.*

   Here below is a working example:

    ```shell
    gcloud run deploy portfolio-website \
    --image gcr.io/$GOOGLE_CLOUD_PROJECT/website:latest \
    --platform managed \
    --region europe-west1 \
    --allow-unauthenticated
    ```

### Verification

* Check that the web application is running by opening URL of the Cloud Run Service in a web browser.

  ![Check Cloud Run URL in GCP](https://cdn.hashnode.com/res/hashnode/image/upload/v1650208242495/rvIiJUlK7.png)

  ![Verify docker deployment in GCP](https://cdn.hashnode.com/res/hashnode/image/upload/v1650208266206/tj3uEO-5Z.png)

## References
1. [Source code in GitHub](https://github.com/adafycheng/portfolio-website-react)
2. [Live demo at Google Cloud](https://gcp-portfolio.adafycheng.dev)

