D1.1 Docker Concepts για Ansible Users 🐳

Η Βασική Διαφορά

┌─────────────────────────────────────────────────────────┐
│  ANSIBLE                                                │
│  ├── Αυτοματοποιεί ΣΥΣΤΗΜΑΤΑ                            │
│  ├── "Ρύθμισε αυτόν τον server"                         │
│  ├── Agentless, SSH-based                               │
│  └── Infrastructure as Code                             │
├─────────────────────────────────────────────────────────┤
│  DOCKER                                                 │
│  ├── Αυτοματοποιεί ΕΦΑΡΜΟΓΕΣ                            │
│  ├── "Τρέξε αυτή την εφαρμογή παντού"                   │
│  ├── Containers — απομονωμένα περιβάλλοντα              │
│  └── Application as Container                           │
├─────────────────────────────────────────────────────────┤
│  ANSIBLE + DOCKER                                       │
│  ├── Ansible εγκαθιστά & ρυθμίζει το Docker             │
│  ├── Ansible διαχειρίζεται containers                   │
│  └── Best of both worlds! ✅                            │
└─────────────────────────────────────────────────────────┘

Docker Concepts — Γρήγορη επανάληψη

Image vs Container

Image    = "συνταγή" — αμετάβλητο template
Container = "φαγητό" — running instance από image

Ansible analogy:
Image     ≈ Role (template για κάτι)
Container ≈ Εφαρμογή που τρέχει από το role

Βασικές εντολές Docker:

# Images
docker pull nginx:latest          # κατέβασε image
docker images                     # λίστα images
docker rmi nginx:latest           # διέγραψε image
docker build -t myapp:1.0 .       # φτιάξε image

# Containers
docker run -d -p 80:80 nginx      # τρέξε container
docker ps                         # running containers
docker ps -a                      # όλα τα containers
docker stop mycontainer           # σταμάτα
docker rm mycontainer             # διέγραψε
docker logs mycontainer           # δες logs
docker exec -it mycontainer bash  # μπες μέσα

Η σύγκριση που χρειάζεσαι

┌─────────────────────┬──────────────────┬──────────────────┐
│ Concept             │ Ansible          │ Docker           │
├─────────────────────┼──────────────────┼──────────────────┤
│ Μονάδα εργασίας     │ Task             │ Layer/Step       │
│ Επαναχρησιμοποίηση  │ Role             │ Image            │
│ Εκτέλεση            │ Play             │ Container        │
│ Ρύθμιση             │ vars/defaults    │ ENV variables    │
│ Αποθήκευση config   │ group_vars       │ docker-compose   │
│ Networking          │ Inventory groups │ Docker networks  │
│ Persistence         │ Files on server  │ Volumes          │
│ Secrets             │ Ansible Vault    │ Docker Secrets   │
└─────────────────────┴──────────────────┴──────────────────┘

Πώς συνεργάζονται Ansible & Docker

┌─────────────────────────────────────────────────────────┐
│  ΕΠΙΠΕΔΟ 1: Infrastructure (Ansible)                    │
│  ├── Εγκατάσταση Docker engine                          │
│  ├── Ρύθμιση Docker daemon                              │
│  ├── Firewall rules για containers                      │
│  └── Docker networks & volumes                          │
├─────────────────────────────────────────────────────────┤
│  ΕΠΙΠΕΔΟ 2: Platform (Ansible + Docker)                 │
│  ├── Pull images από registry                           │
│  ├── Start/stop containers                              │
│  ├── Deploy docker-compose stacks                       │
│  └── Manage container lifecycle                         │
├─────────────────────────────────────────────────────────┤
│  ΕΠΙΠΕΔΟ 3: Application (Docker)                        │
│  ├── Εφαρμογή μέσα σε container                         │
│  ├── Dependencies isolated                              │
│  ├── Environment variables                              │
│  └── Health checks                                      │
└─────────────────────────────────────────────────────────┘

Real-World Workflow

# Χωρίς Ansible + Docker (χειροκίνητα):
ssh server1
apt install docker.io
docker pull nginx
docker run -d -p 80:80 nginx
# → 4 εντολές, μόνο σε 1 server

# Με Ansible + Docker:
ansible-playbook deploy.yml
# → αυτόματα σε 50 servers! ✅
# deploy.yml — απλό παράδειγμα
- name: Deploy nginx container
  hosts: all
  become: true
  tasks:
    - name: Pull & run nginx
      community.docker.docker_container:
        name:  web
        image: nginx:latest
        state: started
        ports:
          - "80:80"

Τα 4 Patterns Ansible + Docker

Pattern 1: Ansible εγκαθιστά Docker

# Ansible ρυθμίζει το host για Docker
- name: Install Docker
  ansible.builtin.apt:
    name: docker.io
    state: present

Pattern 2: Ansible διαχειρίζεται Containers

# Ansible χειρίζεται containers ως resources
- name: Run application container
  community.docker.docker_container:
    name:    myapp
    image:   myapp:1.0
    state:   started
    restart_policy: always

Pattern 3: Ansible deploy Docker Compose

# Ansible deploy ολόκληρα stacks
- name: Deploy stack
  community.docker.docker_compose_v2:
    project_src: /opt/myapp
    state:       present

Pattern 4: Ansible builds Images

# Ansible χτίζει custom images
- name: Build application image
  community.docker.docker_image:
    name:   myapp
    tag:    "{{ app_version }}"
    source: build
    build:
      path: /opt/myapp/docker

Docker Networking για Ansible Users

Docker Networks ≈ Ansible Inventory Groups

[webservers]              docker network: frontend
  web01                     nginx container
  web02                     app container

[dbservers]               docker network: backend
  db01                      postgres container
                            redis container

# Containers στο ίδιο network μιλάνε μεταξύ τους
# με το container name (όχι IP!)
# Δημιουργία Docker networks με Ansible
- name: Create Docker networks
  community.docker.docker_network:
    name:  "{{ item }}"
    state: present
  loop:
    - frontend
    - backend

Docker Volumes για Ansible Users

Docker Volumes ≈ Persistent storage

Χωρίς volume:  container data χάνεται όταν σταματήσει
Με volume:     data παραμένει ✅
# Δημιουργία volumes με Ansible
- name: Create data volume
  community.docker.docker_volume:
    name:  postgres_data
    state: present

# Χρήση volume σε container
- name: Run PostgreSQL
  community.docker.docker_container:
    name:  postgres
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data

Environment Variables vs Ansible Vars

# Ansible vars → Docker ENV
vars:
  db_password: "{{ vault_db_password }}"
  db_name:     myapp
  app_port:    8080

tasks:
  - name: Run app container
    community.docker.docker_container:
      name:  myapp
      image: myapp:latest
      env:                          # ← Docker ENV variables
        DATABASE_URL: "postgresql://user:{{ db_password }}@db/{{ db_name }}"
        PORT:         "{{ app_port }}"
        NODE_ENV:     production
      no_log: true                  # ← κρύψε passwords!

Idempotency στο Docker

# community.docker modules είναι IDEMPOTENT ✅

- name: Run nginx container
  community.docker.docker_container:
    name:  nginx
    image: nginx:latest
    state: started

# 1η εκτέλεση: CHANGED (δημιουργεί container)
# 2η εκτέλεση: SUCCESS (container ήδη τρέχει)
# 3η εκτέλεση: SUCCESS (τίποτα δεν άλλαξε)

# Αν αλλάξεις το image:
# → CHANGED (recreates container με νέο image) ✅

Σύνοψη D1.1

Docker Concepts για Ansible Users
├── Ansible → αυτοματοποιεί ΣΥΣΤΗΜΑΤΑ
├── Docker  → αυτοματοποιεί ΕΦΑΡΜΟΓΕΣ
├── Μαζί   → complete automation stack ✅
│
├── Analogies:
│   ├── Image    ≈ Role
│   ├── Container≈ Running instance
│   ├── Network  ≈ Inventory group
│   └── Volume   ≈ Persistent storage
│
├── 4 Patterns:
│   ├── Ansible installs Docker
│   ├── Ansible manages containers
│   ├── Ansible deploys Compose stacks
│   └── Ansible builds images
│
└── Idempotency: community.docker ✅