Introduction
Containers have transformed how we build, ship, and run applications. Ansible brings Infrastructure as Code to container management — automating image builds, container lifecycles, Kubernetes deployments, and multi-environment orchestration from a single playbook.
This guide covers the essential Ansible modules for Docker, Podman, and Kubernetes with practical examples for each platform.
Docker Automation with Ansible
Install Docker with Ansible
- name: Install Docker on Ubuntu
hosts: docker_hosts
become: true
tasks:
- name: Install prerequisites
ansible.builtin.apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
state: present
- name: Add Docker GPG key
ansible.builtin.apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker repository
ansible.builtin.apt_repository:
repo: "deb https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Install Docker
ansible.builtin.apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
state: present
update_cache: true
- name: Start Docker service
ansible.builtin.systemd:
name: docker
state: started
enabled: true
Manage Docker Images
- name: Manage Docker images
community.docker.docker_image:
name: nginx
tag: "1.25"
source: pull
state: present
- name: Build custom image
community.docker.docker_image:
name: myapp
tag: "{{ app_version }}"
source: build
build:
path: ./docker/
dockerfile: Dockerfile
state: present
Run Docker Containers
- name: Run nginx container
community.docker.docker_container:
name: web
image: nginx:1.25
state: started
restart_policy: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /opt/nginx/conf:/etc/nginx/conf.d:ro
- /opt/nginx/html:/usr/share/nginx/html:ro
env:
NGINX_HOST: "example.com"
networks:
- name: app_network
Docker Compose with Ansible
- name: Deploy with Docker Compose
community.docker.docker_compose_v2:
project_src: /opt/myapp
state: present
register: compose_output
- name: Show running containers
ansible.builtin.debug:
msg: "{{ compose_output.services }}"
Docker Network and Volume Management
- name: Create Docker network
community.docker.docker_network:
name: app_network
driver: bridge
ipam_config:
- subnet: 172.20.0.0/16
- name: Create Docker volume
community.docker.docker_volume:
name: app_data
state: present
Podman Automation with Ansible
Podman is the rootless, daemonless alternative to Docker. Ansible supports it through the containers.podman collection:
ansible-galaxy collection install containers.podman
Run Podman Containers
- name: Run container with Podman
containers.podman.podman_container:
name: web
image: docker.io/library/nginx:latest
state: started
ports:
- "8080:80"
volumes:
- /opt/html:/usr/share/nginx/html:ro
- name: Run rootless Podman container
containers.podman.podman_container:
name: app
image: quay.io/myorg/myapp:latest
state: started
user: appuser
env:
DATABASE_URL: "postgresql://db:5432/myapp"
Podman Image Management
- name: Pull image
containers.podman.podman_image:
name: docker.io/library/redis
tag: "7-alpine"
- name: Build from Containerfile
containers.podman.podman_image:
name: myapp
tag: latest
path: ./containers/
build:
file: Containerfile
Generate systemd Units from Podman
- name: Create systemd service from container
containers.podman.podman_container:
name: web
image: nginx:latest
state: started
generate_systemd:
path: /etc/systemd/system/
restart_policy: always
Kubernetes Automation with Ansible
Install the Collection
ansible-galaxy collection install kubernetes.core
Create Kubernetes Resources
- name: Create namespace
kubernetes.core.k8s:
state: present
definition:
apiVersion: v1
kind: Namespace
metadata:
name: myapp-production
- name: Deploy application
kubernetes.core.k8s:
state: present
definition:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: myapp-production
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: "myregistry/myapp:{{ app_version }}"
ports:
- containerPort: 8080
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
- name: Expose service
kubernetes.core.k8s:
state: present
definition:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
namespace: myapp-production
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Apply YAML Files
- name: Apply all manifests from directory
kubernetes.core.k8s:
state: present
src: "{{ item }}"
loop: "{{ lookup('fileglob', 'manifests/*.yml', wantlist=True) }}"
Wait for Deployment
- name: Wait for deployment to be ready
kubernetes.core.k8s_info:
kind: Deployment
name: myapp
namespace: myapp-production
register: deployment
until: deployment.resources[0].status.readyReplicas | default(0) == deployment.resources[0].spec.replicas
retries: 30
delay: 10
Container Module Quick Reference
| Task | Docker Module | Podman Module | Kubernetes Module |
|---|---|---|---|
| Run container | docker_container | podman_container | k8s (Pod/Deployment) |
| Manage images | docker_image | podman_image | — |
| Networks | docker_network | podman_network | k8s (NetworkPolicy) |
| Volumes | docker_volume | podman_volume | k8s (PV/PVC) |
| Compose | docker_compose_v2 | podman_pod | — |
| Registry login | docker_login | podman_login | — |
Tutorials
For Beginners
- Deploy Apache in Docker Container (Debian)
- Deploy Apache in Podman Container (RHEL)
- Deploy Apache in Podman (Improved)
Installation
AWX
- Install AWX Operator for Kubernetes/OpenShift
- Run Latest AWX in Docker
- Build AWX in Docker
- Run and Stop AWX in Docker
- Create AWX Superuser in Docker
Kubernetes
- Create Namespace/Project
- Create Pod
- Create Secret
- Create Service
- Install OpenShift Local on macOS
- Apply Multiple YAML Files
- Assign CPU Resources
- Assign Memory Resources
Troubleshooting
Related Articles
- What is Ansible AWX?
- Keeping Kubernetes Clusters Up to Date
- Ansible Best Practices Guide
- Ansible Roles Guide
Conclusion
Ansible provides a unified automation layer across Docker, Podman, and Kubernetes — from building images and running containers to deploying complex Kubernetes workloads. The community.docker, containers.podman, and kubernetes.core collections give you consistent, declarative control over your entire container infrastructure. Start with simple container management and scale up to full Kubernetes orchestration as your needs grow.