Cisco Images in Containerlab: IOL, vIOS, ASAv, FTDv, N9Kv and 9800

Choose Cisco Containerlab images by lab: IOL, IOSv, ASAv, FTDv, N9Kv and C9800. Compare local tags, RAM, interfaces and verified limits.

Cisco Containerlab images: IOL, vIOS, ASAv, FTDv, N9Kv and 9800
Cisco Containerlab image families: routers, switches, firewalls and controllers

A switch can accept a feature's configuration and still fail the experiment you built it for. In the PingLabz reference labs, IOL-L2 handled STP and source-aware IGMP snooping, but its wired 802.1X probe never completed the authentication exchange. IOSv-L2 completed EAP-TLS and passed client traffic. Choosing between those images changes what you can learn from the lab.

For a Cisco Containerlab lab, start with the behavior you need to observe. Then check the image tag, topology kind, interface mapping and resource budget. A familiar product name is only part of that choice.

This guide brings eight Cisco variants into one place, alongside the Linux endpoints and sensors installed on the same host. It separates the live inventory from lessons carried forward from earlier lab records, so an installed Nexus image does not quietly become a tested Nexus deployment.

What was actually verified

The inventory was captured on October 16, 2026, Pacific time, with raw timestamps on October 17 UTC. It records 13 installed tags on a Linux/amd64 host running Containerlab 0.79.0. Image metadata, host capacity, KVM permissions and local vIOS launcher resource defaults were checked.

The only nodes deployed for that inventory session were two Alpine endpoints. Their data interfaces were up at MTU 1500, and each received all three ping replies from the other. That establishes a working minimal Containerlab link, not Cisco forwarding.

No Cisco node was booted or tested for this hub. The Cisco results below come from the October 16 reference lessons summarized in the supplied inventory README. A separate session's running ASA was not a test for this article. FTDv, N9Kv and the 9800 were never started by the hub work.

Keep four questions separate: is the image installed, does the guest boot, can you manage it, and does the required traffic pass? Each needs its own evidence.

Live installed image inventory

These are exact local tags and byte sizes from the captured per-image Docker inspection. They describe this host's snapshot, rather than recommended upstream versions or an image download catalog.

Platform or role Exact local tag Image size, bytes
IOL router vrnetlab/cisco_iol:17.18.02 980,499,310
IOL-L2 vrnetlab/cisco_iol:L2-17.18.02 857,699,451
IOSv router vrnetlab/cisco_vios:159-3.M12 795,451,351
IOSv-L2 vrnetlab/cisco_vios:L2-20200929 861,526,841
ASAv vrnetlab/cisco_asav:9-24-1 1,899,166,480
FTDv vrnetlab/cisco_ftdv:10.0.0 6,330,321,132
N9Kv / Nexus 9300v vrnetlab/cisco_n9kv:9300-10.6.2.F 6,688,136,232
Custom Catalyst 9800-CL vrnetlab/cisco_cat9800:17.18.02 8,405,379,220
Alpine endpoint alpine:3.24.2 12,932,203
Zeek zeek/zeek:lts 750,877,480
Suricata jasonish/suricata:8.0.3 649,517,377
Containerlab Web infrastructure ghcr.io/srl-labs/containerlab-web:latest 893,265,749
Hello World utility hello-world:latest 20,399

For comparison, this is an excerpt of the real lab-host docker image ls capture. The ellipses mark omitted rows; the displayed units and spacing are preserved from the evidence.

clab$ docker image ls
IMAGE                                      ID             DISK USAGE   CONTENT SIZE   EXTRA
...
vrnetlab/cisco_asav:9-24-1                 4eaaac131abe        1.9GB          567MB   U    
vrnetlab/cisco_cat9800:17.18.02            36266eb64d15       8.41GB         4.03GB        
vrnetlab/cisco_ftdv:10.0.0                 2a9e8cff229f       6.33GB         2.14GB        
vrnetlab/cisco_iol:17.18.02                bb4250494c98        981MB          254MB        
vrnetlab/cisco_iol:L2-17.18.02             f0b9347f1b78        858MB          226MB        
vrnetlab/cisco_n9kv:9300-10.6.2.F          ecf4d7b01008       6.69GB         3.14GB        
vrnetlab/cisco_vios:159-3.M12              655e7030f7fd        795MB          222MB        
vrnetlab/cisco_vios:L2-20200929            b40aa75edb89        862MB          255MB        
...

Image size is not guest RAM. Shared image layers also mean that adding these sizes will not tell you occupied disk space. The separate Docker disk-usage capture reported 25.52 GB of images and 27.59 GB of build cache. Leave room for overlays and temporary build media as well.

All 13 inspected images reported Linux/amd64. Tags such as lts and latest identify what was present locally; the collection did not pull or update them. An image's creation timestamp is build metadata, not proof of when it was installed or tested.

IOL router: routing, ICMP and IKEv1 IPsec

For Containerlab Cisco IOL work, the router image in this inventory is vrnetlab/cisco_iol:17.18.02.

Setting Local integration
Kind cisco_iol, default router
CPU / RAM Not quantified in the supplied references
Management Normally Ethernet0/0
Data map eth1 → Ethernet0/1; eth4 → Ethernet1/0; four ports per slot

The biggest gotcha is the native console. IOL does not use the QEMU TCP/5000 console path. Sending Ctrl-C/ETX through a host PTY can kill IOL or iouyap. Use a verified attach or socket method, keep one console owner, and use printable text with carriage returns when applying configuration.

The reference record includes a first boot under one minute and successful IKEv1 encrypted host forwarding with NAT overload and exemption. That makes this build a useful starting point for the IPsec Phase 1 up, Phase 2 down lab. Check the data SAs and traffic: QM_IDLE by itself does not prove encrypted forwarding.

For routing faults, the ICMP troubleshooting lab adds return-route, unreachable and MTU questions. A missing route produced ICMP type 3/code 1 in the reference; unreachable rate limiting could hide the terminal error during traceroute.

IOL-L2: STP, multicast snooping and native VLAN tests

Setting Local integration
Image vrnetlab/cisco_iol:L2-17.18.02
Kind / type cisco_iol, type: l2
CPU / RAM Not quantified in the supplied references
Management Normally Ethernet0/0
Data map eth1 → Ethernet0/1; eth4 → Ethernet1/0; eth5 → Ethernet1/1

The main trap is assuming that a supplied startup configuration loaded. It did not load reliably on every switch in the recorded work. Apply the intended baseline through the console when needed, save it, and verify the hostname, VLANs, STP priority and costs before interpreting an election. The IOL console warning above applies here too.

The six-switch STP root-port worked example exercised cost, sender bridge ID and sender port ID. The IGMPv2/v3 lab recorded source-aware, member-only forwarding. A one-way double-tag injection and its native-VLAN hardening are covered in the VLAN-hopping lesson.

Those successes have a boundary. This IOL-L2 build's wired 802.1X probe did not complete EAP/RADIUS, and its DHCP-snooping probe did not produce useful enforcement and bindings. They are results for the tested build, not a verdict on every IOL release.

IOSv router: check the interface before configuring it

Setting Local integration
Image vrnetlab/cisco_vios:159-3.M12
Kind / type cisco_vios, type: router
CPU / RAM 1 vCPU / 512 MiB in the inspected local launcher source
Management GigabitEthernet0/0
Data map eth1 → GigabitEthernet0/1

Interface aliases are the gotcha. Published aliases can differ from this local mapping. Use ethN endpoints in the topology and confirm which guest interface they reach before assigning the link's configuration.

The CPU and RAM values came from a static source inspection, not a guest boot or measured working set. A rebuild or launcher override can change them. The supplied record does not establish router-specific forwarding or boot timing for this image; IOSv-L2's successful switch labs cannot fill that gap.

IOSv-L2: the reference choice for wired 802.1X

Setting Local integration
Image vrnetlab/cisco_vios:L2-20200929
Kind / type cisco_vios, type: switch
CPU / RAM 1 vCPU / 768 MiB in the inspected local launcher source
Management GigabitEthernet0/0
Data map eth1–eth3 → Gi0/1–Gi0/3; eth4 → Gi1/0; eth5 → Gi1/1

The first gotcha is readiness. Wait for the launcher's Startup complete; the cited lab took about three minutes. Temporary Docker unhealthy status occurred during bootstrap, and SSH could appear before the final configuration save. Higher guest NICs only exist when cabled in the topology.

This is the build behind the recorded fresh EAP-TLS authentication and routed client traffic. Start with the 802.1X shared-secret mismatch lab or dynamic VLAN assignment lab. Check formal port authorization and forwarding as well as the RADIUS result: a successful authentication exchange alone can coexist with an unauthorized port.

The DHCP-snooping lab and port-security lab provide other reasons to choose IOSv-L2. Neither justifies treating it as physical switch hardware. In the reference SVI tests, an existing VLAN interface stayed up/up after its last useful member disappeared while forwarding failed. Pair interface status with ARP and traffic tests; no autostate was rejected by that build.

ASAv: NAT and ACL behavior with small flows

Setting Local integration
Image vrnetlab/cisco_asav:9-24-1
Kind cisco_asav
CPU / RAM 1 vCPU / 2048 MiB guest allocation
Management Management0/0
Data map eth1 → GigabitEthernet0/0

For an ASAv Containerlab lab, plan around the first boot. Initial discovery reboots the guest once. The reference advises allowing 10–20 minutes; its recorded 16-minute-27-second startup included a bootstrap stall. Watch readiness instead of deciding that a quiet serial screen means failure.

The earlier run verified SSH, NAT/ACL behavior, packet-tracer and packet captures. The unlicensed image in that record had a 100 Kbps limit, which suits policy questions and small flows rather than throughput measurements. Warm ARP with real traffic before interpreting packet-tracer, and remember that simulations also increment NAT counters.

The ASA NAT troubleshooting lab is a useful next exercise. Keep recovery scoped to that topology: a direct docker restart in the reference run lost data veth links.

FTDv: preparation is a separate step from deployment

Setting Local integration
Image vrnetlab/cisco_ftdv:10.0.0
Kind cisco_ftdv
CPU / RAM 4 vCPUs / 8192 MiB guest allocation
Management Management0/0
Expected data map eth1 → GigabitEthernet0/0; not forwarding-verified

A completed plain Docker build is not the prepared appliance. This builder's process included a privileged first-time QEMU installation and a final commit. Preparation took about 14 minutes, followed by additional build and commit time.

The reference builder reached the CLI, shut down cleanly and committed the prepared image; topology validation also passed. That record does not establish a separately deployed node's SSH, Firepower Device Manager access or forwarding. The prepared setup uses local FDM; FMC registration is separate. Do not assume that an IOS-style startup configuration will import unchanged.

Choose FTDv for a separate FTD/FDM validation exercise, with boot, access and traffic checks still to do.

N9Kv: installed and integrity-checked, with boot still unproven

Setting Local integration
Image vrnetlab/cisco_n9kv:9300-10.6.2.F
Kind cisco_n9kv
CPU / RAM 4 vCPUs / 10240 MiB guest allocation
Management mgmt0
Expected data map eth1 → Ethernet1/1; not verified by this hub

The gotcha is the evidence gap between packaging a disk and running a Nexus. The reference checked source transfer and hash, built the image, checked that the packaged QCOW2 was readable and non-corrupt, and validated the topology.

It did not test device boot, SSH or forwarding. There is no measured Nexus boot time in the supplied record. Treat this tag as an installed candidate for Nexus-specific exploration, with its own acceptance checks required before relying on a feature result.

9800-CL: a custom controller management lab

Setting Local integration
Image vrnetlab/cisco_cat9800:17.18.02
Kind generic_vm, custom integration
CPU / RAM 2 vCPUs / 6144 MiB guest allocation
Guest hardware Virtio disk and NICs; at least four guest NICs
Management GigabitEthernet1 in VRF Mgmt-intf
Data map eth1 → GigabitEthernet2; use ethN topology endpoints

The custom image tag does not create a dedicated cisco_cat9800 kind. This C9800 Containerlab setup uses generic_vm.

Management configuration is the main gotcha: Gi1 needs no switchport before the VRF and IP configuration. The initial console may remain on VGA. Readiness also needs an actual SSH- banner from the guest; QEMU's open TCP/22 forwarding socket is too weak a check. Unused guest NICs do not connect to peers automatically.

The reference recorded a roughly seven-minute fresh bootstrap, authenticated SSH, version and management-interface checks, configuration save, and HTTPS/TLS management access. AP joins, wireless client traffic and data links were not tested. The final readiness-only image layer did not receive another full boot test; its independent health check was tested against the earlier working guest.

Use the Cisco 9800-CL in Containerlab walkthrough for that custom build and management workflow. Its result supports a controller CLI/GUI lab, with wireless forwarding still outside the verified scope.

Which image for which lab?

These choices follow the recorded builds. They are starting points for the named experiments, rather than a feature matrix for every Cisco release.

Lab question Start with What the reference supports or leaves open
Routing faults, ICMP and IKEv1 IPsec IOL router + Alpine Encrypted host forwarding and ICMP fault behavior were recorded; check data SAs and traffic.
STP root-port decisions IOL-L2 Six-switch rapid-PVST cost, sender BID and sender port ID tests; verify the loaded baseline first.
IGMPv2/v3 and source filtering IOL router + IOL-L2 + Alpine Source-aware member-only forwarding worked; Linux compatibility state affected repeat tests.
Wired 802.1X and dynamic VLANs IOSv-L2 Fresh EAP-TLS and forwarding worked; the IOL-L2 probe did not complete the exchange.
DHCP-snooping bindings and enforcement IOSv-L2, with IOL as DHCP server Verify the trusted server path at every switch; IOL-L2 did not give a useful enforcement result.
Native VLAN double-tagging IOL-L2 One-way injection and unused-native-VLAN hardening worked; native-tagging configuration was not tested.
VLAN tags and DTP IOSv-L2 Recorded tagging and mode tests; capture the parent ethN interface to inspect tags.
Port-security violations and recovery IOSv-L2 A second MAC shut down a maximum-one port; maximum two restored the recorded case.
CAM exhaustion or victim-unicast exposure No demonstrated winner 17,991 learned IOSv-L2 entries did not establish saturation or victim traffic exposure.
SVI autostate transitions Hardware, or a separately validated alternative IOSv-L2's up/up SVI could mislead; IOL-L2 was suggested, not proven for this transition.
ASA NAT, ACLs and packet tracing ASAv Earlier small-flow tests worked; allow for first boot and the recorded bandwidth cap.
Nexus-specific exploration N9Kv, pending validation Image integrity and topology validation only; establish boot, access and forwarding.
FTD / FDM exploration FTDv, pending validation Prepared builder reached CLI; deployed-node FDM and forwarding remain unverified.
Controller management and GUI Custom 9800-CL Earlier management checks passed; AP joins and wireless traffic remain untested.

The installed supporting images have narrower roles. Alpine supplies small endpoints; only its simple bidirectional ping was exercised during inventory collection. Its default command was /bin/sh; the smoke topology used sleep infinity to keep the endpoints running.

Zeek's inspected default command was bash, so image presence alone does not make it an active sensor. Earlier labs used it against closed PCAP files. Suricata had /docker-entrypoint.sh and no default command; neither rule loading nor alerts were tested for this hub. Both need an explicit traffic-visibility plan, and neither has a numeric CPU/RAM budget in the supplied references.

Planning a 16-vCPU / 64GB lab box

The captured host exposed 16 CPUs and 67,813,367,808 bytes of RAM. The lab host's real free -h output reported 63 GiB total and 61 GiB available:

clab$ free -h
               total        used        free      shared  buff/cache   available
Mem:            63Gi       1.4Gi        59Gi       5.8Mi       2.8Gi        61Gi
Swap:          2.9Gi          0B       2.9Gi

The root filesystem reported 178 GiB total and 107 GiB available. Those are snapshot readings; other labs can change the available capacity.

Use the guest allocations to compare plans before deployment. The arithmetic below excludes Linux endpoints, sensors and host/wrapper overhead. It is not a set of tested concurrent topologies.

Illustrative selection Guest vCPUs Guest RAM subtotal
Four IOSv-L2 switches + one IOSv router 5 3.5 GiB
One ASAv 1 2 GiB
One custom 9800-CL 2 6 GiB
One N9Kv + one FTDv + one 9800-CL 10 24 GiB

The last row is a useful warning against counting images alone: three appliances request 24 GiB before overhead. It is not a recommendation to start them together. Begin with one appliance and the small endpoints needed to answer a specific question. Leave capacity for the Linux host, captures, sensors and other active labs, and check availability again before deploying.

These appliance figures are guest defaults, not Docker hard limits. The vIOS values came from the inspected local source branches. There is no supported numeric IOL budget here, so a six-switch functional result cannot be turned into a host-capacity estimate.

The Alpine smoke configured and verified 64 MiB of memory per endpoint, 128 MiB total. It requested 0.25 CPU per endpoint, but the recorded inspection did not establish CPU quota enforcement. Treat that as a requested setting rather than a verified limit.

KVM deserves its own check. The inventory found the character device and confirmed read/write access with sudo; the SSH user's direct access check failed. This proved device presence and privileged permissions, not working QEMU acceleration or nested virtualization. Establish that execution path before diagnosing an appliance boot from timing alone.

Pick one behavior to verify next

For an authentication or DHCP-snooping exercise, start with the IOSv-L2 lessons. For STP, multicast snooping or the recorded native-VLAN attack, use the IOL-L2 examples. ASAv provides the earlier NAT/ACL test path; the custom 9800 provides a management and GUI exercise.

A full first-packet walkthrough on ASAv 9.24(1), including the no-route ASP drop and the default-route fix, is in ASAv in Containerlab: Boot, Unlicensed Limits, and the First Ping.

With FTDv and N9Kv, the next useful result is more basic: a documented boot, working management access and a deliberate traffic test. Keep that result attached to the exact image and integration you used. That is what makes the next image choice easier.

Read next