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