Prerequisites

Prerequisites

To help you get the most out of this course, you should have basic knowledge and some hands-on experience in the following areas:

  • Go
  • REST API
  • gRPC (not required, but very basic knowledge is expected).
  • Docker and containerization
  • Linux and Ubuntu

Getting Ubuntu VM

The primary course environment is Ubuntu 24.04 LTS on x86-64, either on a local machine or a virtual machine. The application-level labs should also work with Docker Desktop on macOS and with Docker Engine inside WSL2, but the host-monitoring exercises require a Linux host because they read Linux-specific filesystems and metrics.

Tested version matrix

The following baseline was last verified on August 27, 2026. Patch releases within the same Go, Docker Engine, and Docker Compose series should work, but use these exact versions first when troubleshooting a lab.

Component Tested version
Ubuntu 24.04.3 LTS, x86-64
Go 1.26.6
Python 3.12.3
Docker Engine 28.3.3
Docker Compose plugin 2.39.1
Grafana 13.2.0
Loki 3.7.6
Fluent Bit 5.1.1
Nginx 1.31.4
Prometheus 3.14.0
Node Exporter 1.12.1
Jaeger all-in-one 1.76.0

All container examples use explicit image tags so that a lesson does not change when an upstream project publishes a new release. Version upgrades are made intentionally: update one component at a time, run the full logging, metrics, and tracing stack from a clean environment, and update this table and its verification date in the same change. Do not replace a pinned tag with latest.

Ubuntu VM on cloud

This course will require you to run many containers. So, I recommend you to have at least 8GB of RAM and 4 vCPU. If you have more budget, you can rent a bigger VM for your convenience.

The easiest way to get an Ubuntu VM is actually by rent one from any cloud hosting/provider. There are several options that you can choose from:

Compare the current machine specifications and prices on each provider’s official pricing page before renting a VM. Cloud prices, regions, taxes, and product names change over time; the course does not depend on a particular provider or paid plan.

Cloud trial credits

Some providers offer time-limited trial credits to eligible new accounts. Check the current Google Cloud Free Program terms or the equivalent official page for your provider before signing up. Eligibility, credit amounts, duration, payment-method requirements, and billable usage can change, so set a budget alert and delete course resources when you finish.

Ubuntu VM on your laptop

If you don’t want to rent a VM, you may also install Ubuntu on your laptop. Add Ubuntu as a dual boot on your laptop. This is the best option if you have a powerful laptop. But, it is also the most risky option. You might accidentally cause issue with your existing main OS if you are not careful. So, please be careful if you choose this option.

If you want to use any software virtualization, there are several options that you can choose from:

  1. Canonical Multipass

    This is relatively new for me. I’m still experimenting with this. If you are using Macbook Pro with Apple M1, M2, or M3 chip, this is probably the best option for you so far.

  2. Vagrant and VirtualBox

    I used to use Vagrant for teaching internal DevOps bootcamp in my company. But, the experience is really bad thus I don’t recommend this option. Especially if you are not familiar with this and you are using Apple M1, M2, or M3 chip. Rent a VM instead!

Unfortunately, this course won’t discuss much details about how to configure it so that you can access the application running inside the VM from your host machine (e.g. port-forwarding, networking, etc.). But, you can always ask me if you encounter any issues. I might not have solution, but I might be able to help you to find the solution.

Securely accessing lab services on a remote VM

Grafana, Prometheus, Loki, Jaeger, Node Exporter, Fluent Bit, and database exporters are administrative or telemetry services. Their data can reveal host details, application behavior, and identifiers from logs or traces. Do not expose their ports to the public internet.

The Compose examples bind published ports to 127.0.0.1, so they are reachable only from the VM itself. Containers in the same Compose project continue to communicate over the private Docker network by service name, such as http://prometheus:9090; they do not need public host ports.

To open a UI from your own computer, create an SSH tunnel. For example, this forwards your computer’s port 3000 to the VM’s loopback-only Grafana port:

ssh -N -L 3000:127.0.0.1:3000 your-user@your-vm

Keep that terminal open and browse to http://localhost:3000 on your computer. Change both occurrences of 3000 when you need another UI, such as Prometheus (9090) or Jaeger (16686). Allow inbound SSH only from your IP where practical, use SSH keys, and keep every telemetry port closed in the cloud firewall or security group.

If a tunnel does not work, preserve the secure default and diagnose each boundary:

  1. On the VM, run docker compose ps and curl --fail http://127.0.0.1:<port>.
  2. Confirm the Compose mapping starts with 127.0.0.1: by running docker compose port <service> <port>.
  3. On your computer, rerun SSH with -v and check that the local port is not already in use.
  4. Do not fix the problem by changing the binding to 0.0.0.0, opening the telemetry port to the internet, or disabling the firewall.

When you finish a lab, stop its services with docker compose down. Add --volumes only when you also intend to delete the lab’s locally stored dashboards and telemetry.

Using Windows

DON’T!

Just kidding. I’m not familiar with Windows. The last Windows OS I used was Windows Vista. So I won’t be able to help you if you encounter any issues. But, if you want to use Windows, you can use WSL2. I haven’t tried it myself, but I heard it works well.

Software requirements

Install the baseline tools on your Ubuntu VM:

  1. Install Go and confirm go version reports the version from the tested matrix.

  2. Install Python from the Ubuntu package repository and confirm python3 --version reports the version from the tested matrix.

  3. Install Docker Engine on Ubuntu from Docker’s official repository.

  4. Install the Docker Compose plugin and use the docker compose command (with a space), not the retired standalone docker-compose command.

Verify the installation before continuing:

go version
python3 --version
docker version
docker compose version

Supplementary learning resource

Docker

If you are not familiar with Docker, I have few live streaming recording discussing about Docker. But this is only available in Indonesia language. You can watch it here: