Introduction
Serverless computing enable developers to focus on building features without the burden of server management. Google Cloud Run offers a great solution for deploying containerized applications “serverlessly”.
This blog post focus on technical details of Cloud Run, it’s a guide of a process to initiate a Docker container, create a container registry, push your image, and run it on Cloud Run – using the command-line interface (CLI).
Understanding Cloud Run
Cloud Run is a fully managed serverless (like AWS Lambda) platform for running stateless containers. It eliminates the need to provision, manage, and scale servers, allowing developers to concentrate on building and deploying applications. Here are some key advantages of Cloud Run:
Serverless Simplicity: Cloud Run operates as a platform-as-a-service (PaaS) solution, abstracting away server management, infrastructure provisioning, and automatic scaling. This simplifies the development process by allowing programmers to focus on their application logic without being burdened by server-related tasks.
Cost Efficiency: The pay-as-you-go pricing model associated with this service guarantees cost-effectiveness, as users are only charged for the computational resources their application actually utilizes. This eliminates the need to pay for excess capacity upfront, leading to a more efficient allocation of financial resources.
Automatic Scaling: Cloud Run dynamically adjusts the number of instances allocated to your application based on real-time traffic fluctuations. This ensures that your application can gracefully handle spikes in user demand while maintaining optimal performance throughout.
Container-Friendly: Cloud Run offers a smooth and compatible service for deploying containerized applications. This means that developers can readily use their existing containerized applications built with Docker and similar technologies, without needing to make significant changes for deployment on Cloud Run.
Global Reach: Google Cloud Run’s multi-regional deployment capability facilitates the geographically distributed hosting of applications. This enables applications to be served from geographically closer regions to end users, minimizing latency and enhancing the overall user experience for a global audience.
Requirements
To initiate a Cloud Run application, it is essential to confirm that you have these requirements.
A Google Cloud Account and Project: If you don’t have a Google Cloud account, sign up for a free trial at https://cloud.google.com/. Once you have an account, create a project where you will deploy your Cloud Run service.
Google Cloud SDK Installed and Configured: The Google Cloud SDK is a command-line tool that interacts with Google Cloud services. Install and configure the SDK following the instructions at https://cloud.google.com/sdk/docs/install.
Docker Installed: Docker is an essential tool for building container images. Download and install Docker from the official website (https://www.docker.com/).
Building Your Dockerized Application
1. The Dockerfile:
The foundation of containerization is in the Dockerfile. This text-based document serves as a blueprint is necessary to construct a container image. In the section, your will understand the fundamental structure of a Dockerfile.
FROM: This line specifies the base image upon which your container will be built. Common base images include node:18-alpine
for Node.js applications or python:3.11-slim
for Python applications, etc.
WORKDIR: This line sets the working directory within the container where your application code will reside. Usually it’s set as /usr/app
or /app
directly.
COPY: This instruction copies files and directories from your local machine to the container’s file system. You’ll typically use this to copy your application code and dependencies. If you want to automatically decompress a tarball use ADD
instead.
RUN: This instruction executes commands within the container during the build process. This might involve installing dependencies using package managers like npm
or pip
.
CMD: This line defines the default command that will be executed when the container starts. This is typically your application’s entry point, such as starting a web server.
2. Building the Docker Image:
Once you’ve crafted your Dockerfile, navigate to your project directory in the terminal and execute the following command to build your Docker image:docker build -t my-app-image .
Replace my-app-image
with a descriptive name for your image. This command instructs Docker to build the image based on the instructions in your Dockerfile and tags it with the specified name.
Deploying Your Application to Cloud Run
1. Creating a Google Container Registry (GCR):
GCR is a private container registry service within Google Cloud Platform that stores and manages your container images. To create a GCR registry, navigate to the Google Cloud Console, select your project, and go to “Container Registry” in the Navigation Menu. Click “CREATE REGISTRY” and provide a unique name for your registry.
2. Pushing the Image to GCR:
Before deploying your application to Cloud Run, you need to push your Docker image to your GCR registry. Here’s how to achieve this:
Authenticate your Docker client: gcloud auth configure-docker
This command authenticates your Docker client with your Google Cloud account, enabling you to push images to your GCR registry.
Push the image: docker push gcr.io/[PROJECT_ID]/my-app-image
Replace [PROJECT_ID]
with your actual Google Cloud project ID. This command pushes your container image to the specified GCR repository.
3. Deploying to Cloud Run:
Cloud Run provides a command-line tool, gcloud run
, that simplifies deployment. Use the following command to deploy your containerized application to Cloud Run:gcloud run deploy my-app \ --image gcr.io/[PROJECT_ID]/my-app-image \ --platform managed \ --region [REGION]
Explanation of Flags:
my-app
: Replace this with the desired name for your Cloud Run service. This name will be used to identify your service within Cloud Run.--image gcr.io/[PROJECT_ID]/my-app-image
: This flag specifies the location of your container image. Replace[PROJECT_ID]
with your project ID and ensure the image name matches the one you used during the build process.--platform managed
: This flag indicates that you want to use Cloud Run’s fully managed platform, which handles server provisioning and scaling automatically.--region [REGION]
: This flag specifies the region where you want to deploy your Cloud Run service. Choose a region geographically close to your target audience for optimal performance.
4. Verifying Deployment and Accessing Your Application:
Once the deployment is complete, you can verify the status using the following command:gcloud run services describe my-app
This command displays details about your Cloud Run service, including its URL.
Congratulations! You’ve successfully deployed your Dockerized application to Cloud Run using the gcloud command-line tool. Now, you can access your application by visiting the URL displayed in the gcloud run services describe
output.
Advanced Considerations
Cloud Run offers a rich set of features beyond basic deployments. Here are some additional considerations for exploring further:
- Environment Variables: You can configure environment variables to pass settings and secrets to your containerized application at runtime.
- Scaling Configuration: Cloud Run allows you to customize autoscaling behavior based on metrics like CPU usage or requests per second.
- Service Accounts: Granting service accounts with appropriate permissions enables your application to interact with other Google Cloud services.
- Monitoring and Logging: Cloud Run integrates with Cloud Monitoring and Cloud Logging for comprehensive application health insights.
Conclusion
Cloud Run empowers developers to leverage the benefits of containerization within a serverless paradigm. This white paper has equipped you with the technical knowledge to build Docker images, leverage GCR for secure storage, and deploy your applications to Cloud Run using the command line. As you delve deeper into Cloud Run’s capabilities, you’ll unlock a world of possibilities for building and scaling modern, serverless applications.
Additional Resources
- Cloud Run Documentation: https://cloud.google.com/run/docs
- Google Cloud SDK: https://cloud.google.com/sdk
- Google Container Registry: https://console.cloud.google.com/marketplace/product/google-cloud-platform/container-registry
Bonus: Running Cloud Run Deployments with GitHub Actions
GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that automates workflows within your GitHub repositories. Here’s an example to how you can integrate Cloud Run deployments with GitHub Actions:
Requirements:
- A GitHub repository containing your application code and Dockerfile.
- A Google Cloud project linked to your GitHub repository.
- Workload Identity Federation configured with your chosen service account and linked to the GitHub repository. (https://cloud.google.com/blog/products/identity-security/enabling-keyless-authentication-from-github-actions)
- The service account must have the necessary roles to:
- Push container images to your GCR registry.
- Impersonate the Cloud Run service account.
- Deploy Cloud Run services.
Workflow Configuration:
Create a YAML file named .github/workflows/deploy-to-cloud-run.yml
in your GitHub repository. This file defines the workflow for deploying your application to Cloud Run.
Here’s a basic example workflow:
name: Deploy to Cloud Run
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Login to Google Cloud
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.GOOGLE_CLOUD_CREDENTIALS }}
- name: Build Docker Image
run: docker build -t gcr.io/$PROJECT_ID/my-app-image .
- name: Push Docker Image to GCR
run: docker push gcr.io/$PROJECT_ID/my-app-image
- name: Deploy to Cloud Run
run: gcloud run deploy my-app \
--image gcr.io/$PROJECT_ID/my-app-image \
--platform managed \
--region $REGION \
--no-allow-unauthenticated
Explanation of Workflow Steps:
- The workflow triggers on a push event to the
main
branch. - The
build-and-deploy
job runs on an Ubuntu virtual machine. - The
actions/checkout@v3
action checks out the code from the GitHub repository. - The
google-github-actions/auth@v2
action authenticates with Google Cloud using a service account secret stored in GitHub Secrets (namedGOOGLE_CLOUD_CREDENTIALS
in this example). - The workflow builds the Docker image using
docker build
. - The image is then pushed to your GCR registry using
docker push
. - Finally, the
gcloud run deploy
command deploys the application to Cloud Run, specifying the image location, platform, region, and disabling unauthenticated access.
Benefits of GitHub Actions:
- Automates deployments on code pushes, streamlining the deployment process.
- Integrates seamlessly with your existing GitHub workflow.
- Improves development velocity and reduces manual intervention.
Conclusion
By combining Cloud Run’s serverless power with the automation capabilities of GitHub Actions, you can establish a robust and efficient CI/CD pipeline for deploying containerized applications.