D11.3 containers.podman Collection 📦

Παράλληλο με community.docker

community.docker          containers.podman
─────────────────────     ─────────────────────
docker_container       ↔  podman_container
docker_image           ↔  podman_image
docker_network         ↔  podman_network
docker_volume          ↔  podman_volume
docker_login           ↔  podman_login

podman_container — Βασική χρήση

tasks:

  # ── Rootless container (ως ansible user) ──
  - name: "🦭 Nginx (rootless)"
    containers.podman.podman_container:
      name:            nginx
      image:           "nginx:1.25-alpine"
      state:           started
      restart_policy:  always
      ports:
        - "8080:80"    # ← rootless: μόνο ports > 1024
      volumes:
        - "/home/ansible/html:/usr/share/nginx/html:ro,z"
        #                                            ↑ z = SELinux label
    become:      false    # ← τρέχει ΩΣ ansible user!
    become_user: "{{ podman_user | default('ansible') }}"

  # ── rootful container (ως root) ──────────
  - name: "🦭 Nginx (rootful)"
    containers.podman.podman_container:
      name:           nginx_root
      image:          "nginx:1.25-alpine"
      state:          started
      restart_policy: always
      ports:
        - "80:80"    # ← rootful: οποιοδήποτε port
    become: true

  # ── Image management ──────────────────────
  - name: "📥 Pull image"
    containers.podman.podman_image:
      name:  "nginx:1.25-alpine"
      state: present
    become: false

  # ── Network ───────────────────────────────
  - name: "🌐 Custom network"
    containers.podman.podman_network:
      name:     myapp_net
      state:    present
      internal: false
    become: false

  # ── Volume ────────────────────────────────
  - name: "💾 Named volume"
    containers.podman.podman_volume:
      name:  app_data
      state: present
    become: false

  # ── Container με volume + network ────────
  - name: "🚀 App container (rootless)"
    containers.podman.podman_container:
      name:            myapp
      image:           "myapp:{{ app_version }}"
      state:           started
      restart_policy:  always
      network:
        - name: myapp_net
      volume:
        - "app_data:/app/data:Z"    # ← Z = shared SELinux label
      env:
        NODE_ENV: production
      security_opt:
        - "no-new-privileges:true"
    become: false

Login σε registry

tasks:

  - name: Login σε private registry
    containers.podman.podman_login:
      registry: registry.example.com
      username: "{{ registry_user }}"
      password: "{{ vault_registry_pass }}"
    become: false
    no_log: true

Σύνοψη D11.3

containers.podman modules
│
├── podman_container → ίδιο με docker_container
├── podman_image     → pull/build images
├── podman_network   → CNI networks
├── podman_volume    → named volumes
└── Key difference:
    ├── become: false → rootless (preferred!)
    └── SELinux: :z (shared) ή :Z (private) labels