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)