D7.2 docker_network module 🔗
Το module
Το community.docker.docker_network διαχειρίζεται Docker networks με idempotent τρόπο.
# Απαραίτητο collection
community.docker.docker_network:
name: <network_name>
state: present | absent
driver: bridge | overlay | macvlan | host | none
Δημιουργία Custom Bridge Network
Απλό bridge network
tasks:
# ── Βασική δημιουργία ─────────────────────
- name: Δημιουργία app network
community.docker.docker_network:
name: app_net
state: present
# ← driver: bridge (default)
# ← subnet αυτόματα από Docker
# ── Bridge με συγκεκριμένο subnet ─────────
- name: Δημιουργία network με subnet
community.docker.docker_network:
name: app_net
state: present
driver: bridge
ipam_config:
- subnet: "10.10.1.0/24"
gateway: "10.10.1.1"
iprange: "10.10.1.128/25" # ← από ποιό range δίνει IPs
Πολλαπλά networks — Isolation pattern
tasks:
# ── Frontend network (nginx ↔ app) ────────
- name: Frontend network
community.docker.docker_network:
name: frontend_net
state: present
driver: bridge
ipam_config:
- subnet: "10.10.1.0/24"
# ── Backend network (app ↔ db) ─────────────
- name: Backend network
community.docker.docker_network:
name: backend_net
state: present
driver: bridge
ipam_config:
- subnet: "10.10.2.0/24"
# ── Monitoring network ────────────────────
- name: Monitoring network
community.docker.docker_network:
name: monitoring_net
state: present
Docker network options — Internal & MTU
tasks:
# ── Internal network (no external access) ─
- name: Internal-only network
community.docker.docker_network:
name: internal_net
state: present
internal: true # ← containers ΔΕΝ έχουν internet access
# ── Custom MTU (για VXLAN/overlay) ────────
- name: Network με custom MTU
community.docker.docker_network:
name: vxlan_net
state: present
driver: bridge
driver_options:
com.docker.network.driver.mtu: "1450" # ← VXLAN MTU
# ── Enable IPv6 ───────────────────────────
- name: Network με IPv6
community.docker.docker_network:
name: ipv6_net
state: present
enable_ipv6: true
ipam_config:
- subnet: "10.10.3.0/24"
- subnet: "fd00:10:10:3::/64" # ← IPv6 subnet
Σύνδεση containers σε networks
Το docker_container module ορίζει σε ποια network(s) ανήκει κάθε container:
tasks:
# ── Container σε ένα network ──────────────
- name: Deploy db container
community.docker.docker_container:
name: postgres_db
image: postgres:15-alpine
state: started
restart_policy: unless-stopped
networks:
- name: backend_net # ← μόνο backend!
env:
POSTGRES_DB: mydb
POSTGRES_USER: appuser
POSTGRES_PASSWORD: "{{ vault_db_pass }}"
no_log: true
# ── Container σε δύο networks (gateway) ───
- name: Deploy app container
community.docker.docker_container:
name: myapp
image: "myapp:{{ app_version }}"
state: started
restart_policy: unless-stopped
networks:
- name: frontend_net # ← βλέπει nginx
- name: backend_net # ← βλέπει db
env:
DATABASE_URL: "postgresql://appuser:{{ vault_db_pass }}@postgres_db:5432/mydb"
# ↑ όνομα container = DNS name ✅
no_log: true
# ── Container σε frontend μόνο ────────────
- name: Deploy nginx container
community.docker.docker_container:
name: nginx_proxy
image: nginx:1.25-alpine
state: started
restart_policy: unless-stopped
ports:
- "80:80"
- "443:443"
networks:
- name: frontend_net # ← βλέπει app
# ΔΕΝ ανήκει στο backend_net → δεν βλέπει db ✅
Static IP σε container
tasks:
- name: Network με γνωστό subnet
community.docker.docker_network:
name: static_net
state: present
ipam_config:
- subnet: "192.168.100.0/24"
gateway: "192.168.100.1"
- name: Container με static IP
community.docker.docker_container:
name: myapp
image: "myapp:latest"
state: started
networks:
- name: static_net
ipv4_address: "192.168.100.10" # ← static IP!
- name: Database με static IP
community.docker.docker_container:
name: postgres
image: postgres:15-alpine
state: started
networks:
- name: static_net
ipv4_address: "192.168.100.20" # ← γνωστό IP
Network Inspection & Cleanup
tasks:
# ── Get network info ──────────────────────
- name: Network πληροφορίες
community.docker.docker_network_info:
name: app_net
register: net_info
- name: Εμφάνιση network info
ansible.builtin.debug:
msg:
- "Network : {{ net_info.network.Name }}"
- "Driver : {{ net_info.network.Driver }}"
- "Subnet : {{ net_info.network.IPAM.Config[0].Subnet | default('auto') }}"
- "Internal: {{ net_info.network.Internal }}"
- "Containers: {{ net_info.network.Containers | length }}"
when: net_info.exists
# ── Αφαίρεση network ──────────────────────
- name: Αφαίρεση network
community.docker.docker_network:
name: old_net
state: absent
# ← αποτυγχάνει αν containers ακόμα το χρησιμοποιούν!
# ── Prune unused networks ─────────────────
- name: Prune unused networks
community.docker.docker_prune:
networks: true
register: prune_result
- name: Εμφάνιση prune αποτελεσμάτων
ansible.builtin.debug:
msg: "Αφαιρέθηκαν: {{ prune_result.networks | default([]) | join(', ') | default('κανένα') }}"
macvlan — Container ως "πραγματική" συσκευή
tasks:
# ── macvlan network ───────────────────────
# Container αποκτά δικό του MAC και IP από το LAN!
- name: Macvlan network
community.docker.docker_network:
name: macvlan_net
state: present
driver: macvlan
driver_options:
parent: eth0 # ← physical interface
ipam_config:
- subnet: "192.168.1.0/24"
gateway: "192.168.1.1"
iprange: "192.168.1.200/28" # ← IPs για containers
# ── Container με macvlan (εμφανίζεται στο LAN) ──
- name: Container με macvlan
community.docker.docker_container:
name: legacy_app
image: "legacy:latest"
state: started
networks:
- name: macvlan_net
⚠️ Προσοχή macvlan: Με macvlan, ο Docker host ΔΕΝ μπορεί να επικοινωνήσει με τα macvlan containers από προεπιλογή (kernel restriction). Χρειάζεται macvlan bridge configuration για αυτό.
Πρακτικό παράδειγμα — Networks per environment
---
# docker-networks-setup.yml
- name: Docker Networks Setup
hosts: "{{ target | default('all_managed') }}"
become: true
gather_facts: false
vars:
app_env: "{{ environment | default('production') }}"
network_prefix: "{{ app_env }}"
networks:
- name: "{{ network_prefix }}_frontend"
subnet: "10.100.1.0/24"
internal: false
- name: "{{ network_prefix }}_backend"
subnet: "10.100.2.0/24"
internal: true # ← backend: no internet!
- name: "{{ network_prefix }}_monitoring"
subnet: "10.100.3.0/24"
internal: true
tasks:
- name: "🌐 Δημιουργία Docker networks ({{ app_env }})"
community.docker.docker_network:
name: "{{ item.name }}"
state: present
driver: bridge
internal: "{{ item.internal }}"
ipam_config:
- subnet: "{{ item.subnet }}"
loop: "{{ networks }}"
loop_control:
label: "{{ item.name }}"
- name: "📊 Verification networks"
community.docker.docker_network_info:
name: "{{ item.name }}"
register: net_verify
loop: "{{ networks }}"
loop_control:
label: "{{ item.name }}"
- name: "✅ Networks Report"
ansible.builtin.debug:
msg:
- "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
- " Docker Networks ({{ app_env }})"
- "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
- "{% for result in net_verify.results %} {{ result.item.name }}: {{ '✅' if result.exists else '❌' }}{% endfor %}"
- "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# Εκτέλεση
ansible-playbook playbooks/docker-networks-setup.yml \
--limit nextcloud \
-e "environment=production"
ansible-playbook playbooks/docker-networks-setup.yml \
--limit nextcloud \
-e "environment=staging"
Σύνοψη D7.2
docker_network module
│
├── Βασική χρήση:
│ ├── name: network_name
│ ├── state: present | absent
│ └── driver: bridge (default)
│
├── IPAM configuration:
│ ├── subnet: "10.x.x.0/24"
│ ├── gateway: "10.x.x.1"
│ └── iprange: "10.x.x.128/25"
│
├── Επιλογές:
│ ├── internal: true → no internet access
│ ├── enable_ipv6 → IPv6 support
│ └── driver_options: → MTU, custom settings
│
├── Σε docker_container:
│ └── networks: [{name: net_name}]
│ + ipv4_address για static IP
│
└── DNS:
└── Custom network → ping container_name ✅