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 ✅