Compute Engine
Create a VM then deploy your application to the VM.
cd $HOME
git clone https://github.com/saturnism/jvm-helloworld-by-example
cd jvm-helloworld-by-example/helloworld-springboot-tomcat
./mvnw package
gcloud services enable compute.googleapis.com
gcloud compute instances create helloworld \
--scopes=cloud-platform
If you want to use a specific distribution, such as Debian 10, you can add additional parameters:
gcloud compute instances create helloworld \
--image-family debian-10 --image-project debian-cloud
See Compute Engine Machine Types documentation for a list of Machine Types and the associated CPU/Memory resources.
gcloud compute scp target/helloworld.jar helloworld:
If this is your first time connecting to the VM, it will automatically prompt you to generate a new SSH key.
gcloud compute ssh helloworld
sudo apt-get update && sudo apt-get install -y openjdk-11-jdk
java -jar helloworld.jar
By default, most ports on the Compute Engine are firewalled off. If you want to expose port
8080
in this case, you can first add a tag
to the Compute Engine instance, and then add a firewall rule to allow inbound port 8080
traffic for any Compute Engine instance with a certain tag.From outside of the VM (e.g., your computer, or Cloud Shell):
gcloud compute instances add-tags helloworld --tags=webapp
gcloud compute firewall-rules create webapp-rule \
--source-ranges=0.0.0.0/0 \
--target-tags=webapp \
--allow=tcp:8080
Find the external IP address of the Compute Engine VM instance:
gcloud compute instances list
You can now connect to the external IP on port
8080
of the application:EXTERNAL_IP=$(gcloud compute instances describe helloworld \
--format='value(networkInterfaces.accessConfigs[0].natIP)')
curl http://${EXTERNAL_IP}:8080
In production environments, you would most likely want to put a Load Balancer in front, either with a Network (L4) Load Balancer, or a HTTP (L7) Load Balancer.
git clone https://github.com/saturnism/jvm-helloworld-by-example
cd jvm-helloworld-by-example/helloworld-springboot-tomcat
./mvnw package
Enable Container Registry API to be able to push container images to the Container Registry.
gcloud services enable containerregistry.googleapis.com
Use Jib to containerize the application:
PROJECT_ID=$(gcloud config get-value project)
./mvnw compile com.google.cloud.tools:jib-maven-plugin:2.4.0:build \
-Dimage=gcr.io/${PROJECT_ID}/helloworld
gcloud services enable compute.googleapis.com
PROJECT_ID=$(gcloud config get-value project)
gcloud compute instances create-with-container \
helloworld-with-container \
--container-image=gcr.io/${PROJECT_ID}/helloworld \
--scopes=cloud-platform
This will automatically create a Container-Optimized VM, and start the container on VM startup.
By default, most ports on a Compute Engine instance are firewalled off. If you want to expose port
8080
in this case, you can first add a tag
to the Compute Engine instance, and then add a firewall rule to allow inbound port 8080
traffic for any Compute Engine instance with a certain tag.Add a tag:
gcloud compute instances add-tags \
helloworld-with-container --tags=webapp
Add Firewall rule:
gcloud compute firewall-rules create webapp-rule \
--source-ranges=0.0.0.0/0 \
--target-tags=webapp \
--allow=tcp:8080
Find the external IP address of the Compute Engine VM instance:
gcloud compute instances list
You can now connect to the external IP on port
8080
of the application:EXTERNAL_IP=$(gcloud compute instances describe helloworld-with-container \
--format='value(networkInterfaces.accessConfigs[0].natIP)')
curl http://${EXTERNAL_IP}:8080
In production environments, you would most likely want to put a Load Balancer in front, either with a Network (L4) Load Balancer, or a HTTP (L7) Load Balancer.
To deploy a fleet of VMs, you can use Managed Instance Group to deploy a set of VMs running the same container image.
Last modified 3yr ago