Networking
Comprehensive Podman networking configuration, custom networks, connectivity options, and network troubleshooting.
Network Basics
Default Networking
# Default bridge network
podman run -d nginx # Uses default bridge
podman run -d --network=bridge nginx # Explicit bridge network
# List networks
podman network ls
podman network ls --format table
# Inspect default network
podman network inspect podman
Network Types
# Bridge network (default)
podman run -d --network=bridge nginx
# Host network (share host networking)
podman run -d --network=host nginx
# No networking
podman run -d --network=none alpine
# Container network (share with another container)
podman run -d --name web nginx
podman run -d --network=container:web alpine
Custom Networks
Creating Networks
# Create bridge network
podman network create mynet
# Create with specific subnet
podman network create --subnet=192.168.100.0/24 customnet
# Create with gateway
podman network create \
--subnet=192.168.100.0/24 \
--gateway=192.168.100.1 \
gatewaynet
# Create with DNS
podman network create \
--subnet=10.0.0.0/24 \
--dns=8.8.8.8 \
--dns=8.8.4.4 \
dnsnet
# Create internal network (no external access)
podman network create --internal privatenet
Network Configuration Options
# Create network with custom options
podman network create \
--subnet=172.20.0.0/16 \
--gateway=172.20.0.1 \
--ip-range=172.20.240.0/20 \
--driver=bridge \
--opt com.docker.network.bridge.name=custom-bridge \
--opt com.docker.network.driver.mtu=1500 \
production-net
# Create network with IPv6
podman network create \
--subnet=fd00::/64 \
--ipv6 \
ipv6net
# Create macvlan network
podman network create \
--driver=macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--opt parent=eth0 \
macvlan-net
Container Networking
Basic Network Usage
# Run container on custom network
podman run -d --network=mynet nginx
# Connect container to multiple networks
podman run -d --name web nginx
podman network connect mynet web
podman network connect privatenet web
# Disconnect from network
podman network disconnect mynet web
# Run with specific IP
podman run -d --network=mynet --ip=192.168.100.10 nginx
Port Publishing
# Publish single port
podman run -d -p 8080:80 nginx
# Publish to specific interface
podman run -d -p 127.0.0.1:8080:80 nginx
podman run -d -p 192.168.1.100:8080:80 nginx
# Publish multiple ports
podman run -d -p 80:80 -p 443:443 nginx
# Publish all exposed ports
podman run -d -P nginx
# Publish UDP port
podman run -d -p 53:53/udp dnsmasq
# Port ranges
podman run -d -p 8080-8090:8080-8090 myapp
Network Aliases
# Set hostname
podman run -d --hostname=webserver nginx
# Network aliases
podman run -d --network=mynet --network-alias=web nginx
podman run -d --network=mynet --network-alias=api node-app
# Multiple aliases
podman run -d --network=mynet \
--network-alias=web \
--network-alias=frontend \
--network-alias=nginx \
nginx
Pod Networking
Pod Network Sharing
# Create pod with port mapping
podman pod create --name webapp -p 8080:80
# Containers in pod share network
podman run -d --pod webapp --name web nginx
podman run -d --pod webapp --name api node-app
# Internal communication via localhost
podman exec web curl localhost:3000 # Reaches api container
Pod Custom Networks
# Create pod on custom network
podman pod create --name services --network=mynet
# Pod with multiple networks
podman pod create --name multi-net
podman pod create --network=frontend-net --name multi-net
podman pod create --network=backend-net --name multi-net
DNS and Service Discovery
DNS Configuration
# Custom DNS servers
podman run -d --dns=8.8.8.8 --dns=8.8.4.4 alpine
# DNS search domains
podman run -d --dns-search=company.com alpine
# DNS options
podman run -d --dns-opt=ndots:2 alpine
# Custom hosts
podman run -d --add-host=api:192.168.1.100 alpine
Service Discovery
# Containers can resolve each other by name on custom networks
podman network create appnet
# Start database with name
podman run -d --network=appnet --name database postgres
# App can connect to 'database' by name
podman run -d --network=appnet \
-e DATABASE_HOST=database \
myapp
# Test connectivity
podman run --rm --network=appnet alpine \
nslookup database
Advanced Networking
Network Drivers
# Bridge driver (default)
podman network create --driver=bridge bridgenet
# Macvlan driver
podman network create \
--driver=macvlan \
--opt parent=eth0 \
macvlannet
# None driver
podman network create --driver=null nullnet
# Host driver
podman run --network=host nginx
Network Namespaces
# Create container with custom namespace
podman run -d --userns=keep-id nginx
# Share network namespace with host
podman run -d --network=host nginx
# Share with another container
podman run -d --name primary nginx
podman run -d --network=container:primary alpine
Firewall and Security
# Create isolated network
podman network create --internal secure-net
# No external connectivity
podman run -d --network=secure-net alpine
# Custom iptables rules (advanced)
podman network create \
--opt com.docker.network.bridge.enable_icc=false \
isolated-bridge
Network Troubleshooting
Connectivity Testing
# Test container connectivity
podman exec container_name ping google.com
podman exec container_name curl http://example.com
# Test internal connectivity
podman exec web ping database
podman exec web telnet database 5432
# Check listening ports
podman exec container_name netstat -tulpn
podman exec container_name ss -tulpn
Network Inspection
# Inspect network
podman network inspect mynet
podman network inspect bridge
# Container network info
podman inspect container_name | grep -A 20 NetworkSettings
# Check container IP
podman inspect --format '{{.NetworkSettings.IPAddress}}' container_name
# List container networks
podman inspect --format '{{.NetworkSettings.Networks}}' container_name
Debugging Tools
# Network debugging container
podman run --rm -it --network=mynet nicolaka/netshoot
# Inside debugging container:
# nslookup service_name
# ping container_name
# curl http://container_name:port
# tcpdump -i eth0
# Quick network test
podman run --rm --network=mynet alpine \
sh -c 'ping -c 3 8.8.8.8 && nslookup google.com'
Performance and Optimization
Network Performance
# Set MTU for better performance
podman network create \
--opt com.docker.network.driver.mtu=9000 \
jumbo-net
# Disable userland proxy for better performance
echo '{"userland-proxy": false}' | sudo tee /etc/containers/daemon.json
# Test network performance
podman run --rm -it --network=mynet \
nicolaka/netshoot iperf3 -c target_host
Network Monitoring
# Monitor network traffic
podman run --rm -it --network=host \
nicolaka/netshoot tcpdump -i any
# Container network stats
podman stats --format "table {{.Container}}\t{{.NetIO}}"
# Real-time network monitoring
podman run --rm -it --pid=host --network=host \
nicolaka/netshoot iftop
Production Networking
Multi-tier Architecture
# Frontend network
podman network create frontend-net
# Backend network
podman network create backend-net
# Database network
podman network create database-net
# Web tier (public + frontend)
podman run -d --network=frontend-net -p 80:80 --name web nginx
# App tier (frontend + backend)
podman run -d --network=frontend-net --name app myapp
podman network connect backend-net app
# Database tier (backend only)
podman run -d --network=backend-net --name db postgres
Load Balancing Setup
# Create load balancer network
podman network create lb-net
# Backend application network
podman network create app-net
# Load balancer
podman run -d --network=lb-net -p 80:80 --name lb nginx
# Backend applications
for i in {1..3}; do
podman run -d --network=app-net --name app$i myapp
done
# Connect load balancer to backend network
podman network connect app-net lb
Secure Network Configuration
# Create secure internal network
podman network create \
--internal \
--subnet=10.0.0.0/24 \
secure-internal
# DMZ network
podman network create \
--subnet=172.16.0.0/24 \
dmz-net
# Web server in DMZ
podman run -d --network=dmz-net -p 80:80 nginx
# Database in secure internal network
podman run -d --network=secure-internal postgres
Network Automation
Network Scripting
#!/bin/bash
# setup-networks.sh
# Create application networks
podman network create --subnet=10.1.0.0/24 frontend
podman network create --subnet=10.2.0.0/24 backend
podman network create --subnet=10.3.0.0/24 database
# Deploy services
podman run -d --network=frontend --name web nginx
podman run -d --network=backend --name api myapi
podman run -d --network=database --name db postgres
# Connect services across networks
podman network connect backend web
podman network connect database api
echo "Network setup complete"
podman network ls
Network Cleanup
#!/bin/bash
# cleanup-networks.sh
# Stop all containers
podman stop $(podman ps -q)
# Remove all containers
podman rm $(podman ps -aq)
# Remove custom networks
podman network prune -f
# Remove unused networks
podman network ls --filter type=custom -q | xargs podman network rm
IPv6 Networking
IPv6 Configuration
# Enable IPv6 in daemon
echo '{"ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64"}' | \
sudo tee /etc/containers/daemon.json
# Create IPv6 network
podman network create \
--ipv6 \
--subnet=2001:db8::/64 \
ipv6-net
# Run container with IPv6
podman run -d --network=ipv6-net nginx
# Test IPv6 connectivity
podman exec container_name ping6 2001:4860:4860::8888
Quick Reference
Essential Network Commands
# Network management
podman network ls
podman network create mynet
podman network rm mynet
podman network inspect mynet
# Container networking
podman run -d --network=mynet nginx
podman network connect mynet container
podman network disconnect mynet container
# Port publishing
podman run -d -p 8080:80 nginx
podman run -d --network=host nginx
Common Network Patterns
# Isolated application stack
podman network create appnet
podman run -d --network=appnet --name db postgres
podman run -d --network=appnet --name web nginx
# Multi-tier with port publishing
podman network create --internal backend
podman run -d --network=backend --name db postgres
podman run -d --network=backend -p 80:80 --name web nginx
# Service discovery
podman run -d --network=mynet --name api myapi
podman run -d --network=mynet \
-e API_URL=http://api:3000 \
frontend