In the evolving landscape of application deployment, containerization with Kubernetes (K8s) has become the new standard. As organizations adopt Kubernetes at scale, public image registries often bring new challenges, from rate limits and escalating costs to limited control over sensitive data. 

Harbor bridges this gap as an open-source, enterprise-grade container registry that brings security, performance, and sovereignty to container image management. It seamlessly integrates with existing operational paradigms, providing a robust solution for modern container image management needs.

Open-sourced in 2016, Harbor joined the Cloud Native Computing Foundation (CNCF) on July 31, 2018, and graduated on June 15, 2020, as its eleventh project – a milestone that reflects both its maturity and its vibrant community. 

Today, Harbor remains one of the most widely adopted CNCF projects for secure image management across hybrid and private cloud environments. The active community drives continuous innovation. Each release adds new integrations, security features, and performance improvements, ensuring Harbor evolves alongside enterprise cloud-native needs.

Recent highlights include: 

What is Harbor?

At its core, Harbor provides a centralized repository for managing container images. Think of it as a private, feature-rich registry for your organization, with robust security and management features built in. Key features include:

For organizations looking to deploy both VM-centric deployments as well as Kubernetes, Harbor offers a familiar sense of control and enterprise-readiness that aligns well with existing operational paradigms.

Harbor

Setting Up Harbor

Let’s explore how to set up Harbor, focusing on deploying it on a VM. In this example, we’ve used a VMware vSphere environment to deploy Harbor on a VM. 

Prerequisites

Before you begin, ensure you have:

Deploying Harbor on a VM

We have already created an Ubuntu VM and assigned it to the network. We have also added a DNS entry for our new harbor instance:

Harbor on VM
Harbor address
  1. Download the Harbor Installer:
wget https://github.com/goharbor/harbor/releases/download/v2.x.x/harbor-offline-installer-v2.x.x.tgz

tar xvf harbor-offline-installer-v2.x.x.tgz

cd harbor

Note: Replace v2.x.x with the latest stable version of Harbor.

Download Harbor
  1. Set up certificates for enabling Harbor with HTTPS

For using HTTPS with Harbor, follow the guide to set up the SSL certificates:

Harbor with HTTPS
  1. Configure Harbor:


Navigate to the harbor folder from the extracted tar file and copy the harbor.yml.tmpl to harbor.yml file. Edit the harbor.yml file to configure your Harbor instance. Key parameters to adjust include:

# Example for harbor.yml

hostname: harbor.yourdomain.com

https:

  port: 443

  certificate: /etc/harbor/certs/harbor.yourdomain.com.crt

  private_key: /etc/harbor/certs/harbor.yourdomain.com.key

harbor_admin_password: your_secure_password

data_volume: /data/harbor

These are the parameters we updated for our deployment:

Updated parameters on Harbor
  1. Install Harbor:
    Run the install.sh script. Harbor provides an option to install Trivy, which is a built-in security scanner in Harbor, using the –with-trivy flag. 

sudo ./install.sh --with-trivy

  1. This script will set up Docker Compose, pull all necessary Docker images, and start the Harbor services.
Docker Compose setup
  1. Access Harbor UI:
    Once the installation is complete, you should be able to access the Harbor UI in your web browser at https://harbor.yourdomain.com. Log in with the admin user and the password you set.
Harbor login

Using Harbor as an Image Registry

Once you log in to Harbor, the default landing page is the Projects page. You can create multiple projects in Harbor to separate the artifacts stored by different teams or sub-organizations within an enterprise.

Harbor image registry

Let’s use the default project “library” and use it to host a container image. Navigating into the project “library”, we can see the commands to use to tag and push an image using the Docker command.

Harbor project "library"

To begin, we must log in to Harbor using Docker CLI. 

docker login harbor.yourdomain.com -u <username> -p <password>

We use an existing Docker image that got pulled when deploying Harbor and tag it to the new Harbor registry:

docker tag SOURCE_IMAGE[:TAG] harbor.yourdomain.com/library/REPOSITORY[:TAG]

docker push harbor.yourdomain.com/library/REPOSITORY[:TAG]

Login with Docker CLI
Docker push nginx image

If you navigate back into the Harbor UI, we can see the nginx image is available in Harbor and can be used by developers in the organization to deploy nginx.

Nginx in Harbor
nginx-photon

Conclusion

Harbor’s CNCF graduation underscores the maturity and transparency that enterprises expect from open-source infrastructure, with ongoing innovations like OCI artifact support, SBOM management, and CI/CD integrations. Learn more by joining the community on GitHub.