D1.2 community.docker Collection 🐳
Τι περιέχει
community.docker
├── Modules (τα πιο σημαντικά)
│ ├── docker_container → διαχείριση containers
│ ├── docker_image → διαχείριση images
│ ├── docker_network → διαχείριση networks
│ ├── docker_volume → διαχείριση volumes
│ ├── docker_compose_v2 → Docker Compose stacks
│ ├── docker_login → registry authentication
│ ├── docker_image_build → build images
│ └── docker_container_info → πληροφορίες container
│
├── Plugins
│ ├── connection: docker → σύνδεση σε containers
│ └── inventory: docker → dynamic inventory
│
└── Roles
└── docker_swarm → Docker Swarm setup
Εγκατάσταση & Επαλήθευση
# Έλεγχος αν είναι ήδη εγκατεστημένο
ansible-galaxy collection list | grep docker
# Εγκατάσταση αν χρειάζεται
ansible-galaxy collection install community.docker
# Επαλήθευση modules
ansible-doc community.docker.docker_container | head -30
ansible-doc -l | grep community.docker
Module 1: docker_container
Το πιο σημαντικό module — διαχείριση containers:
tasks:
# ── Βασική εκκίνηση ───────────────────────
- name: Start nginx container
community.docker.docker_container:
name: nginx_web # ← όνομα container
image: nginx:latest # ← image:tag
state: started # ← started/stopped/absent/present
# ── Με ports ──────────────────────────────
- name: nginx με port mapping
community.docker.docker_container:
name: nginx_web
image: nginx:latest
state: started
ports:
- "80:80" # host:container
- "443:443"
# ── Με environment variables ───────────────
- name: App με env vars
community.docker.docker_container:
name: myapp
image: myapp:1.0
state: started
env:
DATABASE_URL: "postgresql://user:pass@db/myapp"
NODE_ENV: production
PORT: "3000"
no_log: true
# ── Με volumes ────────────────────────────
- name: PostgreSQL με volume
community.docker.docker_container:
name: postgres
image: postgres:15
state: started
volumes:
- postgres_data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
# ── Με networks ───────────────────────────
- name: App σε custom network
community.docker.docker_container:
name: myapp
image: myapp:1.0
state: started
networks:
- name: frontend
- name: backend
# ── Με restart policy ─────────────────────
- name: Container με auto-restart
community.docker.docker_container:
name: myapp
image: myapp:1.0
state: started
restart_policy: always # always/unless-stopped/on-failure
# ── Με health check ───────────────────────
- name: Container με healthcheck
community.docker.docker_container:
name: myapp
image: myapp:1.0
state: started
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
# ── Με resource limits ────────────────────
- name: Container με limits
community.docker.docker_container:
name: myapp
image: myapp:1.0
state: started
memory: "512m" # ← RAM limit
cpus: "0.5" # ← CPU limit
# ── Πλήρες παράδειγμα ─────────────────────
- name: Production container
community.docker.docker_container:
name: myapp
image: "myapp:{{ app_version }}"
state: started
restart_policy: unless-stopped
ports:
- "{{ app_port }}:3000"
env:
NODE_ENV: production
DATABASE_URL: "{{ db_url }}"
SECRET_KEY: "{{ vault_secret_key }}"
volumes:
- "myapp_data:/app/data"
- "/etc/localtime:/etc/localtime:ro"
networks:
- name: frontend
- name: backend
labels:
app: myapp
version: "{{ app_version }}"
env: production
memory: "1g"
cpus: "1.0"
log_driver: json-file
log_options:
max-size: "10m"
max-file: "3"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
no_log: true
State Options:
state: started → container τρέχει (δημιουργεί αν δεν υπάρχει)
state: stopped → container σταματημένο (δεν διαγράφει)
state: absent → container διαγραμμένο
state: present → container υπάρχει (δεν το ξεκινά αναγκαστικά)
Module 2: docker_image
tasks:
# ── Pull image ────────────────────────────
- name: Pull nginx image
community.docker.docker_image:
name: nginx
tag: latest
source: pull # ← pull από registry
# ── Pull συγκεκριμένης έκδοσης ────────────
- name: Pull specific version
community.docker.docker_image:
name: postgres
tag: "15.4"
source: pull
# ── Build από Dockerfile ──────────────────
- name: Build custom image
community.docker.docker_image:
name: myapp
tag: "{{ app_version }}"
source: build
build:
path: /opt/myapp # ← φάκελος με Dockerfile
dockerfile: Dockerfile # ← default: Dockerfile
pull: true # ← pull base image πρώτα
nocache: false # ← χρησιμοποίησε cache
args: # ← build arguments
APP_VERSION: "{{ app_version }}"
NODE_ENV: production
# ── Tag image ─────────────────────────────
- name: Tag image
community.docker.docker_image:
name: myapp:{{ app_version }}
repository: registry.example.com/myapp
tag: "{{ app_version }}"
source: local
push: true # ← push στο registry μετά
# ── Remove image ──────────────────────────
- name: Remove old image
community.docker.docker_image:
name: myapp
tag: "{{ old_version }}"
state: absent
# ── Pull με authentication ────────────────
- name: Pull από private registry
community.docker.docker_image:
name: registry.example.com/myapp
tag: latest
source: pull
environment:
DOCKER_CONFIG: /root/.docker # ← χρησιμοποίησε docker login
Module 3: docker_network
tasks:
# ── Δημιουργία network ────────────────────
- name: Create frontend network
community.docker.docker_network:
name: frontend
state: present
# ── Custom subnet ─────────────────────────
- name: Create backend network
community.docker.docker_network:
name: backend
state: present
ipam_config:
- subnet: "172.20.0.0/16"
gateway: "172.20.0.1"
# ── Bridge network με options ─────────────
- name: Create app network
community.docker.docker_network:
name: app_network
state: present
driver: bridge
driver_options:
com.docker.network.bridge.name: app_br0
# ── Remove network ────────────────────────
- name: Remove old network
community.docker.docker_network:
name: old_network
state: absent
# ── Loop — πολλά networks ─────────────────
- name: Create all networks
community.docker.docker_network:
name: "{{ item }}"
state: present
loop:
- frontend
- backend
- monitoring
Module 4: docker_volume
tasks:
# ── Δημιουργία volume ─────────────────────
- name: Create data volume
community.docker.docker_volume:
name: postgres_data
state: present
# ── Με labels ─────────────────────────────
- name: Create labeled volume
community.docker.docker_volume:
name: app_data
state: present
labels:
app: myapp
env: production
backup: "true"
# ── Remove volume ─────────────────────────
- name: Remove old volume
community.docker.docker_volume:
name: old_data
state: absent
# ── Loop — πολλά volumes ──────────────────
- name: Create all volumes
community.docker.docker_volume:
name: "{{ item }}"
state: present
loop:
- postgres_data
- redis_data
- app_uploads
- nginx_certs
Module 5: docker_login
tasks:
# ── Login στο Docker Hub ──────────────────
- name: Login to Docker Hub
community.docker.docker_login:
username: "{{ docker_hub_username }}"
password: "{{ vault_docker_hub_token }}"
state: present
no_log: true
# ── Login σε private registry ─────────────
- name: Login to private registry
community.docker.docker_login:
registry_url: "https://registry.example.com"
username: "{{ registry_username }}"
password: "{{ vault_registry_password }}"
state: present
no_log: true
# ── Logout ────────────────────────────────
- name: Logout from registry
community.docker.docker_login:
username: "{{ docker_hub_username }}"
state: absent
Module 6: docker_container_info
tasks:
# ── Πληροφορίες container ─────────────────
- name: Get container info
community.docker.docker_container_info:
name: myapp
register: container_info
# ── Χρήση πληροφοριών ─────────────────────
- name: Show container status
ansible.builtin.debug:
msg:
- "Name : {{ container_info.container.Name }}"
- "Status : {{ container_info.container.State.Status }}"
- "Running: {{ container_info.container.State.Running }}"
- "IP : {{ container_info.container.NetworkSettings.IPAddress }}"
- "Image : {{ container_info.container.Config.Image }}"
# ── Conditional βάσει status ───────────────
- name: Restart αν δεν τρέχει
community.docker.docker_container:
name: myapp
state: started
when:
- container_info.exists
- not container_info.container.State.Running
Module 7: docker_compose_v2
tasks:
# ── Deploy stack ──────────────────────────
- name: Deploy Docker Compose stack
community.docker.docker_compose_v2:
project_src: /opt/myapp # ← φάκελος με docker-compose.yml
state: present # ← present/absent
# ── Με custom file ────────────────────────
- name: Deploy με custom compose file
community.docker.docker_compose_v2:
project_src: /opt/myapp
files:
- docker-compose.yml
- docker-compose.prod.yml
state: present
# ── Pull πριν deploy ──────────────────────
- name: Deploy με pull
community.docker.docker_compose_v2:
project_src: /opt/myapp
pull: always # ← always/missing/never
state: present
# ── Remove stack ──────────────────────────
- name: Remove stack
community.docker.docker_compose_v2:
project_src: /opt/myapp
state: absent
remove_volumes: true # ← διέγραψε και τα volumes
Quick Reference — Modules Summary
┌─────────────────────────────────────────────────────────┐
│ community.docker Modules │
├───────────────────────────┬─────────────────────────────┤
│ docker_container │ run/stop/rm containers │
│ docker_image │ pull/build/rm images │
│ docker_network │ create/rm networks │
│ docker_volume │ create/rm volumes │
│ docker_login │ registry authentication │
│ docker_container_info │ container details │
│ docker_compose_v2 │ compose stacks │
│ docker_image_info │ image details │
│ docker_prune │ cleanup unused resources │
└───────────────────────────┴─────────────────────────────┘
Σύνοψη D1.2
community.docker Collection
├── Εγκατάσταση:
│ ansible-galaxy collection install community.docker
│
├── Κύρια modules:
│ ├── docker_container → ❤️ το πιο σημαντικό
│ │ └── state: started/stopped/absent/present
│ ├── docker_image → pull/build/push/rm
│ ├── docker_network → create/rm networks
│ ├── docker_volume → create/rm volumes
│ ├── docker_login → registry auth (no_log!)
│ ├── docker_container_info → status & details
│ └── docker_compose_v2 → full stack deployment
│
└── Idempotency: ✅ όλα τα modules