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 ✅