Container nodes in Cisco Modeling Labs (CML) 2.9 complement digital machines, providing larger flexibility and effectivity. Engineers profit from having light-weight, programmable, and quickly deployable choices inside their simulation environments. Whereas digital machines (VMs) dominate with community working techniques, containers add flexibility, enabling instruments, visitors injectors, automation, and full purposes to run easily together with your CML topology. Conventional digital machines are nonetheless efficient, however customized containers introduce a transformative agility.
Constructing photos that behave predictably and combine cleanly with simulated networks is far simpler with containers. As anybody who has tried to drop a inventory Docker picture into CML shortly discovers, this isn’t an easy course of. Typical Docker photos lack the required CML-compatible metadata, community interface behaviors, and lifecycle properties. Utilizing containers with CML is the lacking ingredient.
This weblog publish offers a sensible, engineering-first walkthrough for constructing containers which can be really CML-ready.

Word about enhancements to CML: When containers have been launched, just one picture per node definition was allowed. With the CML 2.10 launch, this restriction has been lifted. Particularly, the next enhancements can be added:
Per picture definition, Docker tag names resembling:
debian:bookworm, debian:buster and debian:trixie
Are all legitimate tags for a similar “debian-docker” node definitions—three legitimate picture definitions for one node definition.
Specification of Docker tags as an alternative choice to picture names (.tar.gz recordsdata) and SHA256 has sums. On this case, CML will attempt to obtain the picture from a container registry, e.g., Docker Hub, if not in any other case specified.
Improved launch logic to keep away from “perpetual launches” in case the SHA256 sum from the picture definition didn’t match the precise hash sum within the picture.
Why do customized containers in CML matter?
Conventional CML workflows depend on VM-based nodes operating IOSv, IOS-XRv, NX-OS, Ubuntu, Alpine, and different working techniques. These are wonderful for modeling community working system habits, however they’re heavyweight for duties resembling integrating CLI instruments, internet browsers, ephemeral controllers, containerized apps, microservices, and testing harnesses into your simulations.
Containers begin shortly, eat fewer sources, and combine easily with customary NetDevOps CI/CD workflows. Regardless of their benefits, integrating customary Docker photos into CML isn’t with out its challenges, every of which requires a tailor-made resolution for seamless performance.
The hidden challenges: why a Docker picture isn’t sufficient
CML doesn’t run containers in the identical method a vanilla Docker Engine does. As an alternative, it wraps containers in a specialised runtime atmosphere that integrates with its simulation engine. This results in a number of potential pitfalls:
Entry factors and init systemsMany base photos assume they’re the one course of operating. In CML, community interfaces, startup scripts, and boot readiness ought to be offered. Additionally, CML expects a long-running foreground course of. In case your container exits instantly, CML will deal with the node as “failed.”
Interface mappingContainers usually use eth0, but CML attaches interfaces sequentially primarily based on topology (eth0, eth1, eth2…). Your picture ought to deal with extra interfaces added at startup, mapping them to particular OS configurations.
Capabilities and usersSome containers drop privileges by default. CML’s bootstrap course of may have particular entry privileges to configure networking or begin daemons.
Filesystem layoutCML makes use of optionally available bootstrap belongings injected into the container’s filesystem. A normal Docker picture gained’t have the precise directories, binaries, or permissions for this. If wanted, CML can “inject” a full suite of command-line binaries (“busybox”) right into a container to supply a correct CLI atmosphere.
Lifecycle expectationsContainers ought to output log data to the console in order that performance might be noticed in CML. For instance, an online server ought to present the entry log.
Misalign any of those, and also you’ll spend hours troubleshooting what seems to be a easy “it really works with run” situation.
How CML treats containers: A psychological mannequin for engineers
CML’s container capabilities revolve round a node-definition YAML file that describes:
The picture to load or pull
The bootstrap course of
Surroundings variables
Interfaces and the way they bind
Simulation habits (startup order, CPU/reminiscence, logging)
UI metadata
When a lab launches, CML:
Deploys a container node
Pulls or masses the container picture
Applies networking definitions
Injects metadata, IP handle, and bootstrap scripts
Displays node well being by way of logs and runtime state
Consider CML as “Docker-with-constraints-plus-network-injection.” Understanding CML’s strategy to containers is foundational, however constructing them requires specifics—listed below are sensible suggestions to make sure your containers are CML-ready.
Ideas for constructing a CML-ready container
The container photos constructed for CML 2.10 and ahead are created on GitHub. We use a GitHub Motion CI workflow to completely automate the construct course of. You possibly can, in reality, use the identical workflow to construct your individual customized photos able to be deployed in CML. There’s loads of documentation and examples which you can construct off of, offered within the repository* and on the Deep Wiki.**
Necessary observe: CML treats every node in a topology as a single, self-contained service or utility. Whereas it is likely to be tempting to instantly deploy multi-container purposes, usually outlined utilizing docker-compose , into CML by making an attempt to separate them into particular person CML nodes, this strategy is usually not advisable and may result in vital issues.
1.) Select the precise base
Begin from an already current container definition, like:
nginx (single-purpose community daemon utilizing a vanilla upstream picture).
Firefox (graphical person interface, customized construct course of).
Or a customized CI-built base together with your customary automation framework.
Keep away from utilizing photos that depend on SystemD except you explicitly configure it; SystemD inside containers might be tough.
2.) Outline a correct entry level
Your container should:
Run a long-lived course of.
Not daemonize within the background.
Help predictable logging.
Hold the container “alive” for CML.
Right here’s a easy supervisor script:
#!bin/sh
echo “Container beginning…”
tail -f /dev/null
Not glamorous, however efficient. You possibly can substitute tail -f /dev/null together with your service startup chain.
3.) Put together for a number of interfaces
CML could connect a number of interfaces to your topology. CML will run a DHCP course of on the primary interface, however except that first interface is L2-adjacent to an exterior connector in NAT mode, there’s NO assure it’s going to purchase one! If it can’t purchase an IP handle, it’s the lab admin’s duty to supply IP handle configuration per the day 0 configuration. Sometimes, ip config … instructions can be utilized for this goal.
Superior use instances you possibly can unlock
When you conquer customized containers, CML turns into dramatically extra versatile. Some in style use instances amongst superior NetDevOps and SRE groups embrace:
Artificial visitors and testing
Automation engines
Nornir nodes
pyATS/Genie check harness containers
Ansible automation controllers
Distributed purposes
Primary service-mesh experiments
API gateways and proxies
Container-based middleboxes
Safety instruments
Honeypots
IDS/IPS parts
Packet inspection frameworks
Deal with CML as a “full-stack lab,” enhancing its capabilities past a mere community simulator.
Make CML your individual lab
Creating customized containers for CML turns the platform from a simulation instrument into an entire, programmable check atmosphere. Whether or not you’re validating automation workflows, modeling distributed techniques, prototyping community capabilities, or just constructing light-weight utilities, containerized nodes assist you to adapt CML to your engineering wants—not the opposite method round.
For those who’re prepared to increase your CML lab, the easiest way to begin is straightforward: construct a small container, copy and modify an current node definition, and drop it right into a two-node topology. When you see how easily it really works, you’ll shortly notice simply how far you possibly can push this characteristic.
Would you prefer to make your individual customized container for CML? Tell us within the feedback!
* Github Repository – Automation for constructing CML Docker Containers
** DeepWiki – CML Docker Containers (CML 2.9+)
Join Cisco U. | Be part of the Cisco Studying Community immediately without cost.
Observe Study with Cisco
X | Threads | Fb | LinkedIn | Instagram | YouTube
Use #CiscoU and #CiscoCert to hitch the dialog.

















