Milvus
Overview
Milvus is a high-performance, open-source, cloud-native vector database built for similarity search and AI applications. It stores, indexes and searches embedding vectors with low latency, powering retrieval-augmented generation, semantic search, recommendation, image and video search and anomaly detection.
This image runs Milvus on Ubuntu 24.04 on Azure as the official Milvus standalone stack: three containers (the etcd metadata store, the MinIO object backend and the Milvus standalone server), orchestrated by Docker Compose and run by a systemd service that starts on boot.
What you get:
- Milvus standalone 2.6.18 from the official pinned
milvusdb/milvusimage, plus the etcd and MinIO backends - A headless vector database with no web login interface: SDK clients connect on gRPC port
19530, and the built-in WebUI, metrics and health endpoints are served on port9091 - Authentication enabled out of the box. On the first boot of your VM, a one-shot service rotates the database root password to a value unique to that VM and writes it to a root-only file
- A deployment network security group (NSG) that opens port 22 only. Open port
19530(and optionally9091) in your own NSG to reach the database from your application - Docker Engine and the Docker Compose plugin from the official
download.docker.comAPT repository milvus.servicesystemd unit that starts the Compose stack on bootmilvus-firstboot.servicesystemd oneshot that rotates the root password and MinIO secret per VM- A
pymilvus2.6 client in a virtual environment at/opt/milvus/venv - Listeners: gRPC
19530(SDK), HTTP9091(metrics, health and WebUI); internal etcd on loopback only - A dedicated, independently resizable Azure data disk mounted at
/var/lib/milvus. The stateful tier sits on durable storage rather than the operating system disk and can be grown or snapshotted independently - The etcd metadata store, the MinIO object data and the Milvus segment data, all held under
/var/lib/milvus - Ubuntu 24.04 LTS base with the latest security patches applied at build time
- Azure Linux Agent for seamless cloud integration and SSH key injection
- 24/7 SecureAnyCloud support
Prerequisites
Before you deploy this image, you need:
- An active Azure subscription where you can create virtual machines
- Permissions to create VMs, NSGs and data disks in the target resource group and region
- An SSH key pair for access to the virtual machine
- A virtual network and subnet in the target region, with an NSG that allows inbound port 22 from your management network
- The Azure CLI installed locally, if you plan to deploy from the command line
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Milvus by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Choose Standard_B4ms or larger, because the vector index build is memory-intensive. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) only.
Review the dedicated data disk on the Disks tab, then select Review + create and Create.
First-boot initialisation brings the stack up once to rotate the root password and the object store secret, then starts the database for normal use. This takes a few minutes after the VM is created.
Step 2 - Deploy from the Azure CLI
Run the following to create a VM from the SecureAnyCloud Milvus Marketplace image in an existing virtual network and subnet. Replace the angle-bracket values with your own.
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:milvus-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name milvus \
--image sac1647283583153:milvus-ubuntu-24-04:default:latest \
--size Standard_B4ms \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_rsa.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku StandardWhen the VM is running, note its public IP address from the Portal, or run az vm show -d -g <your-rg> -n milvus --query publicIps -o tsv.
Step 3 - Connect to your VM
Connect over SSH as the azureuser administrator, using your key:
ssh -i ~/.ssh/id_rsa azureuser@<vm-ip>A welcome banner prints the most useful commands. The per-VM credentials live in a root-only file, described in Step 5.
Step 4 - Verify the stack
Milvus runs as a systemd service that brings the Docker Compose stack up on boot. Check that the service and the Docker engine are active:
systemctl is-active milvus dockerBoth commands print active. List the three running containers and check that each is healthy:
sudo docker ps --format 'table {{.Names}}\t{{.Status}}'You should see milvus-standalone, milvus-minio and milvus-etcd, each reporting (healthy).
The Milvus server exposes a built-in HTTP health endpoint on loopback port 9091. It returns OK when the database is ready to serve:
curl -s http://127.0.0.1:9091/healthzCheck the pinned server image version:
sudo docker image inspect milvusdb/milvus:v2.6.18 --format '{{index .RepoTags 0}}'This reports milvusdb/milvus:v2.6.18, the version shipped on this image.
Step 5 - Retrieve the rotated root credentials
Authentication is enabled, and the database root password was rotated to a value unique to this VM on first boot. Read the credentials file, which only the root user can read:
sudo cat /root/milvus-credentials.txtThe file lists the root user, the rotated milvus.root.pass, the SDK endpoint on port 19530 and the WebUI URL on port 9091.
Keep this password safe, because it is the administrator credential for your vector database. No shared or default credentials ship in the image.
Step 6 - Connect with pymilvus
The image ships a Python virtual environment with the pymilvus client at /opt/milvus/venv. Use it directly on the VM, or install pymilvus into your own application environment the same way.
The following self-test reads the rotated root password from the credentials file and lists the collections over the authenticated gRPC API. It prints OK on success:
PASS=$(sudo grep '^milvus.root.pass=' /root/milvus-credentials.txt | cut -d= -f2-) sudo /opt/milvus/venv/bin/python -c "from pymilvus import MilvusClient; print(MilvusClient(uri='http://127.0.0.1:19530', token='root:'+'$PASS').list_collections()); print('OK')"To connect from your own application, use the gRPC endpoint with the root user and the rotated password. Open port 19530 in the VM's NSG first (see Step 9), then point your client at the VM public IP.
A typical pymilvus session creates a collection, inserts embedding vectors, builds an index and runs an approximate nearest-neighbour search:
from pymilvus import MilvusClient, DataType client = MilvusClient( uri="http://<vm-ip>:19530", token="root:<password>",
# from /root/milvus-credentials.txt ) schema = client.create_schema(auto_id=False, enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("vector", DataType.FLOAT_VECTOR, dim=8) index_params = client.prepare_index_params() index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={"nlist": 128}) client.create_collection("documents", schema=schema, index_params=index_params) client.insert("documents", [ {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8], "title": "hello"}, ]) client.load_collection("documents") hits = client.search("documents", data=[[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]], anns_field="vector", limit=5, output_fields=["title"]) print(hits)Milvus supports dense and sparse vectors, hybrid search, scalar metadata filtering and a rich set of index and metric types (IVF, HNSW, DiskANN and more). You can tune for recall, latency and cost.
Step 7 - Open the WebUI
Milvus serves a built-in WebUI on the HTTP port 9091 at /webui/. Use it to inspect collections, segments, queries and database health. It is bound to all interfaces inside the VM.
To reach it from your browser, open port 9091 in the VM's NSG and browse to http://<vm-ip>:9091/webui/. The WebUI is read-oriented and complements the SDK. All data operations go through the gRPC API on port 19530.
Step 8 - Check the data disk
The etcd metadata store, the MinIO object data and the Milvus segment data all live on a dedicated Azure data disk mounted at /var/lib/milvus. This keeps the stateful tier off the operating system disk and lets you resize or snapshot the disk independently. Check the mount and its layout:
df -h /var/lib/milvusls /var/lib/milvusYou will see the etcd, minio and milvus subdirectories, which hold the metadata, object and segment data.
To grow the disk, expand the data disk in the Azure Portal, then grow the filesystem on the VM with sudo resize2fs on the underlying device. The milvus.service systemd unit manages the whole stack. Restart it with sudo systemctl restart milvus after any maintenance.
Step 9 - Open the SDK port to your application
The deployment NSG opens port 22 only. To reach Milvus from your application, open the gRPC SDK port 19530 (and optionally 9091 for the WebUI and metrics) to your trusted application subnet.
Never expose the internal etcd port 2379. It is bound to loopback inside the VM and must stay private.
az vm open-port --resource-group <your-rg> --name milvus --port 19530 --priority 1010Restrict the source of the rule to your application subnet rather than the public internet. For any production exposure, prefer a private NIC with TLS termination.
Step 10 - Maintenance
Restart the stack or tail the server logs:
sudo systemctl restart milvus.servicesudo docker logs milvus-standalone --tail 50Ubuntu's unattended-upgrades stays enabled in the image, so OS security updates continue to be applied automatically on your VM.
Support
This image is published and supported by SecureAnyCloud with 24/7 support. Support covers deployment, collection and index design, embedding ingestion, search tuning, metadata filtering, scaling, backups, client integration and upgrade planning.
Contact SecureAnyCloud through the support channel listed on the Azure Marketplace listing.
Milvus is a trademark of LF Projects, LLC. All other product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on Azure
Launch Milvus on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Milvus is a high-performance, open-source, cloud-native vector database built for similarity search and AI applications. It stores, indexes and searches embedding vectors with low latency, powering retrieval-augmented generation, semantic search, recommendation, image and video search and anomaly detection.
This image runs Milvus on AWS as the official Milvus standalone stack: three containers (the etcd metadata store, the MinIO object backend and the Milvus standalone server), orchestrated by Docker Compose and run by a systemd service that starts on boot.
What you get:
- Milvus standalone from the official pinned
milvusdb/milvusimage, plus the etcd and MinIO backends - A headless vector database with no web login interface: SDK clients connect on gRPC port
19530, and the built-in WebUI, metrics and health endpoints are served on port9091 - Authentication enabled out of the box. On the first boot of your instance, a one-shot service rotates the database root password to a value unique to that instance and writes it to a root-only file
- Port
19530(and optionally9091) to open in your own security group to reach the database from your application - Docker Engine and the Docker Compose plugin from the official
download.docker.comrepository milvus.servicesystemd unit that starts the Compose stack on bootmilvus-firstboot.servicesystemd oneshot that rotates the root password and MinIO secret per instance- A
pymilvusclient in a virtual environment at/opt/milvus/venv - Listeners: gRPC
19530(SDK), HTTP9091(metrics, health and WebUI); internal etcd on loopback only - A dedicated, independently resizable data volume mounted at
/var/lib/milvus. The stateful tier sits on durable storage rather than the operating system disk and can be grown or snapshotted independently - The etcd metadata store, the MinIO object data and the Milvus segment data, all held under
/var/lib/milvus - 24/7 SecureAnyCloud support
Prerequisites
Before you deploy this image, you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group that allows inbound port 22 from your management network
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line
Launch the instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance.
Under Application and OS Images, choose AWS Marketplace AMIs and search for Milvus by SecureAnyCloud. Select the SecureAnyCloud listing, choose Select, then choose Continue on the subscription summary.
Pick m5.xlarge (4 vCPU / 16 GiB RAM) or larger, because the vector index build is memory-intensive. Choose your EC2 key pair. Under Network settings, select a security group that allows inbound port 22 from your management network. Then select Launch instance.
First-boot initialisation brings the stack up once to rotate the root password and the object store secret, then starts the database for normal use. This takes a few minutes after the instance is created.
Launch the instance from the AWS CLI
Run the following, replacing the angle-bracket values with your own.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.xlarge \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=milvus-01}]'When the instance is running, note its public IP address by running aws ec2 describe-instances --instance-ids <instance-id> --query "Reservations[].Instances[].PublicIpAddress" --output text.
Connect to your instance
Connect over SSH with your key. The SSH login user depends on the operating system of the AMI variant you launched:
AMI variant SSH login user
Milvus on Ubuntu 24.04 ubuntu
ssh -i <path-to-key>.pem ubuntu@<instance-ip>A welcome banner prints the most useful commands. The per-instance credentials live in a root-only file, described in Step 5.
Verify the stack
Milvus runs as a systemd service that brings the Docker Compose stack up on boot. Check that the service and the Docker engine are active:
systemctl is-active milvus dockerBoth commands print active. List the three running containers and check that each is healthy:
sudo docker ps --format 'table {{.Names}}\t{{.Status}}'You should see milvus-standalone, milvus-minio and milvus-etcd, each reporting (healthy).
The Milvus server exposes a built-in HTTP health endpoint on loopback port 9091. It returns OK when the database is ready to serve:
curl -s http://127.0.0.1:9091/healthzRetrieve the rotated root credentials
Authentication is enabled, and the database root password was rotated to a value unique to this instance on first boot. Read the credentials file, which only the root user can read:
sudo cat /root/milvus-credentials.txtThe file lists the root user, the rotated milvus.root.pass, the SDK endpoint on port 19530 and the WebUI URL on port 9091.
Keep this password safe, because it is the administrator credential for your vector database. No shared or default credentials ship in the image.
Connect with pymilvus
The image ships a Python virtual environment with the pymilvus client at /opt/milvus/venv, which you can use directly on the instance. You can install pymilvus into your own application environment the same way.
The following self-test reads the rotated root password from the credentials file and lists the collections over the authenticated gRPC API. It prints OK on success:
PASS=$(sudo grep '^milvus.root.pass=' /root/milvus-credentials.txt | cut -d= -f2-) sudo /opt/milvus/venv/bin/python -c "from pymilvus import MilvusClient; print(MilvusClient(uri='http://127.0.0.1:19530', token='root:'+'$PASS').list_collections()); print('OK')"To connect from your own application, use the gRPC endpoint with the root user and the rotated password. Open port 19530 in the instance's security group first (see Step 9), then point your client at the instance public IP.
A typical pymilvus session creates a collection, inserts embedding vectors, builds an index and runs an approximate nearest-neighbour search:
from pymilvus import MilvusClient, DataType client = MilvusClient( uri="http://<instance-ip>:19530", token="root:<password>",
# from /root/milvus-credentials.txt ) schema = client.create_schema(auto_id=False, enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("vector", DataType.FLOAT_VECTOR, dim=8) index_params = client.prepare_index_params() index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={"nlist": 128}) client.create_collection("documents", schema=schema, index_params=index_params) client.insert("documents", [ {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8], "title": "hello"}, ]) client.load_collection("documents") hits = client.search("documents", data=[[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]], anns_field="vector", limit=5, output_fields=["title"]) print(hits)Milvus supports dense and sparse vectors, hybrid search, scalar metadata filtering and a rich set of index and metric types (IVF, HNSW, DiskANN and more). You can tune for recall, latency and cost.
Open the WebUI
Milvus serves a built-in WebUI on the HTTP port 9091 at /webui/. Use it to inspect collections, segments, queries and database health.
To reach it from your browser, open port 9091 in the instance's security group and browse to http://<instance-ip>:9091/webui/. The WebUI is read-oriented and complements the SDK. All data operations go through the gRPC API on port 19530.
Check the data volume
The etcd metadata store, the MinIO object data and the Milvus segment data all live on a dedicated data volume mounted at /var/lib/milvus. This keeps the stateful tier off the operating system disk and lets you resize or snapshot the volume independently. Check the mount and its layout:
df -h /var/lib/milvusls /var/lib/milvusYou will see the etcd, minio and milvus subdirectories, which hold the metadata, object and segment data.
To grow the volume, expand the EBS volume in the AWS console (or with aws ec2 modify-volume), then grow the filesystem on the instance with sudo resize2fs on the underlying device. The milvus.service systemd unit manages the whole stack. Restart it with sudo systemctl restart milvus after any maintenance.
Open the SDK port to your application
To reach Milvus from your application, open the gRPC SDK port 19530 (and optionally 9091 for the WebUI and metrics) to your trusted application subnet.
Never expose the internal etcd port 2379. It is bound to loopback inside the instance and must stay private.
aws ec2 authorize-security-group-ingress \
--group-id <security-group-id> \
--protocol tcp --port 19530 \
--cidr <your-application-subnet-cidr>Restrict the source of the rule to your application subnet rather than the public internet. For any production exposure, prefer a private subnet with TLS termination.
Maintenance
Restart the stack, or tail the server logs:
sudo systemctl restart milvus.servicesudo docker logs milvus-standalone --tail 50Automatic security updates stay enabled in the image, so OS security patches continue to be applied on your instance.
Support
This image is published and supported by SecureAnyCloud with 24/7 support. Support covers deployment, collection and index design, embedding ingestion, search tuning, metadata filtering, scaling, backups, client integration and upgrade planning.
Contact SecureAnyCloud through the support channel listed on the AWS Marketplace listing.
Milvus is a trademark of LF Projects, LLC. All other product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch Milvus on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com