D7.1 Docker Networking — Θεωρία για Ansible Users 🌐
Γιατί σε ενδιαφέρει το Docker Networking
Αν ξέρεις Ansible, ξέρεις ήδη ότι τα managed hosts πρέπει να "μιλάνε" μεταξύ τους. Στον κόσμο του Docker, το ίδιο ισχύει για τα containers — αλλά ο τρόπος επικοινωνίας είναι εντελώς διαφορετικός.
📝 Αναλογία:
Ansible Inventory: [webservers] → επικοινωνούν μέσω IP / SSH [databases] Docker Networks: web_net → containers επικοινωνούν μέσω db_net Docker DNS (όνομα container!)
Οι τύποι Docker Networks
Docker Network Drivers
│
├── bridge (default)
│ ├── Ιδιωτικό network μόνο για τον host
│ ├── Containers επικοινωνούν με IP ή όνομα
│ └── Χρήση: ανάπτυξη, single-host apps
│
├── host
│ ├── Container χρησιμοποιεί το network του host
│ ├── ΔΕΝ υπάρχει network isolation
│ └── Χρήση: performance-critical apps
│
├── overlay
│ ├── Spans πολλούς Docker hosts
│ ├── Απαιτεί Docker Swarm ή Kubernetes
│ └── Χρήση: distributed multi-host apps
│
├── macvlan
│ ├── Container παίρνει δικό του MAC address
│ ├── Εμφανίζεται ως "πραγματική" συσκευή στο LAN
│ └── Χρήση: legacy apps που χρειάζονται L2
│
└── none
└── Καμία network connectivity (isolated)
Default bridge vs Custom bridge
Αυτή είναι η σημαντικότερη διάκριση για Ansible users:
Default bridge network (docker0):
┌─────────────────────────────────────────────────┐
│ container A ←→ container B │
│ 172.17.0.2 172.17.0.3 │
│ │
│ ✅ Επικοινωνία μέσω IP │
│ ❌ ΔΕΝ υποστηρίζει DNS (δεν ξέρει ονόματα) │
│ ❌ Όλα τα containers βλέπουν το ένα το άλλο │
└─────────────────────────────────────────────────┘
Custom bridge network (π.χ. app_net):
┌─────────────────────────────────────────────────┐
│ container "web" ←→ container "db" │
│ 10.10.1.2 10.10.1.3 │
│ │
│ ✅ Επικοινωνία μέσω ονόματος: ping db ✅ │
│ ✅ Αυτόματο DNS resolution │
│ ✅ Isolation (μόνο ό,τι ανήκει στο network) │
│ ✅ Καλύτερο security │
└─────────────────────────────────────────────────┘
💡 Κανόνας: Πάντα δημιούργησε custom bridge networks για τις εφαρμογές σου. Ποτέ μην αφήνεις containers στο default bridge.
Container DNS — Πώς «μιλάνε» τα containers
Σε custom bridge network, κάθε container αποκτά αυτόματα DNS entry με το όνομά του:
Custom network: app_net
┌──────────────┐ ping db → 10.10.1.3
│ web │ ─────────────────────────────► ┌──────────────┐
│ (nginx) │ │ db │
│ 10.10.1.2 │ ◄───────────────────────────── │ (postgres) │
└──────────────┘ respond from db:5432 │ 10.10.1.3 │
└──────────────┘
Μέσα στο web container:
$ nslookup db
Server: 127.0.0.11 ← Docker's embedded DNS
Address: 127.0.0.11
Name: db
Address: 10.10.1.3 ← IP του db container ✅
Network isolation — Security
Σωστή αρχιτεκτονική με πολλά networks:
Internet
│
▼
┌─────────────────────────────────────────────────┐
│ frontend_net │
│ ┌─────────┐ ┌─────────┐ │
│ │ nginx │ │ app │ ← βλέπουν μεταξύ τους│
│ └────┬────┘ └────┬────┘ │
└───────┼─────────────┼───────────────────────────┘
│ │
│ backend_net │
│ ┌──────────────────────────────────┐ │
└──►│ app │ ← βλέπει μόνο το db │ │
│ ┌──────┴──┐ │ │
│ │ db │ ← ΔΕΝ βλέπει nginx │ │
│ └─────────┘ │ │
└──────────────────────────────────┘ │
→ nginx ΔΕΝ μπορεί να μιλήσει απευθείας με db ✅
→ app "γεφυρώνει" τα δύο networks ✅
Port Publishing — Πρόσβαση από το host
Container port publishing:
Host (192.168.1.10)
│
│ host port
│ :8080
▼
┌──────────────────────────────────────────┐
│ Docker networking │
│ NAT: 0.0.0.0:8080 → container:80 │
└──────────────────────────────────────────┘
│
│ container port
│ :80
▼
Container (nginx)
Σύνταξη: "host_port:container_port"
Παράδειγμα: "8080:80"
Τύποι:
"80:80" → 0.0.0.0:80 → container:80
"127.0.0.1:80:80" → μόνο localhost
"80" → random host port
Σύνοψη D7.1
Docker Networking — Θεωρία
│
├── Network drivers:
│ ├── bridge → single-host (συνήθης)
│ ├── host → χωρίς isolation
│ ├── overlay → multi-host (Swarm)
│ └── macvlan → L2 connectivity
│
├── Default vs Custom bridge:
│ ├── Default → επικοινωνία μόνο με IP ❌
│ └── Custom → DNS by name ✅ + isolation ✅
│
├── Docker DNS:
│ └── Σε custom network: ping container_name ✅
│
├── Port publishing:
│ └── "host:container" mapping
│
└── Best practice:
├── Πάντα custom networks
└── Isolation ανά layer (frontend/backend)