D2.1 Docker Installation Deep Dive 🔧

Γιατί Official Method;

┌─────────────────────────────────────────────────────────┐
│  apt install docker.io          ← OS packages           │
│  ❌ Παλιά έκδοση                                        │
│  ❌ Δεν έχει docker compose plugin                      │
│  ❌ Δεν έχει buildx                                     │
├─────────────────────────────────────────────────────────┤
│  Official Docker Repository     ← Συνιστάται ✅         │
│  ✅ Πάντα τελευταία έκδοση                              │
│  ✅ docker compose plugin included                      │
│  ✅ docker buildx included                              │
│  ✅ Επίσημη υποστήριξη                                  │
└─────────────────────────────────────────────────────────┘

🔴 Debian/Ubuntu — Official Method

Χειροκίνητα (για κατανόηση):

# Βήμα 1: Prerequisites
sudo apt install -y ca-certificates curl gnupg lsb-release

# Βήμα 2: GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Βήμα 3: Repository
echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list

# Βήμα 4: Install
sudo apt update
sudo apt install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin

Με Ansible (αυτοματοποιημένο):

# roles/docker/tasks/install_debian.yml
---
# ============================================================
# Docker Installation — Debian/Ubuntu
# Official repository method
# ============================================================

# ── Βήμα 1: Prerequisites ─────────────────────
- name: Install prerequisites (Debian)
  ansible.builtin.apt:
    name:
      - ca-certificates
      - curl
      - gnupg
      - lsb-release
      - apt-transport-https
    state:        present
    update_cache: true

# ── Βήμα 2: GPG Key ───────────────────────────
- name: Create keyrings directory
  ansible.builtin.file:
    path:  /etc/apt/keyrings
    state: directory
    mode:  '0755'

- name: Add Docker GPG key (Debian)
  ansible.builtin.apt_key:
    url:   >-
      https://download.docker.com/linux/{{ ansible_facts['distribution'] | lower }}/gpg
    keyring: /etc/apt/keyrings/docker.gpg
    state:   present
  when: ansible_facts['distribution'] in ['Debian', 'Ubuntu']

# ── Βήμα 3: Repository ────────────────────────
- name: Add Docker repository (Debian)
  ansible.builtin.apt_repository:
    repo: >-
      deb [arch={{ _docker_arch }}
      signed-by=/etc/apt/keyrings/docker.gpg]
      https://download.docker.com/linux/{{ ansible_facts['distribution'] | lower }}
      {{ ansible_facts['distribution_release'] }}
      stable
    state:    present
    filename: docker
  vars:
    _docker_arch: >-
      {{ 'amd64'  if ansible_facts['architecture'] == 'x86_64'
         else 'arm64' if ansible_facts['architecture'] == 'aarch64'
         else 'armhf' }}
  when: ansible_facts['distribution'] in ['Debian', 'Ubuntu']

# ── Βήμα 4: Remove old versions ───────────────
- name: Remove old Docker versions (Debian)
  ansible.builtin.apt:
    name:
      - docker
      - docker-engine
      - docker.io
      - containerd
      - runc
    state: absent
  ignore_errors: true

# ── Βήμα 5: Install Docker ────────────────────
- name: Install Docker CE (Debian)
  ansible.builtin.apt:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
      - docker-buildx-plugin
      - docker-compose-plugin
    state:        present
    update_cache: true
  notify: Restart Docker

🟠 RedHat/Fedora — Official Method

Χειροκίνητα (για κατανόηση):

# Βήμα 1: Remove old versions
sudo dnf remove docker docker-client docker-client-latest \
                docker-common docker-latest docker-latest-logrotate \
                docker-logrotate docker-engine

# Βήμα 2: Add repository
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# Βήμα 3: Install
sudo dnf install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin

# Βήμα 4: Start
sudo systemctl enable --now docker

Με Ansible:

# roles/docker/tasks/install_redhat.yml
---
# ============================================================
# Docker Installation — RedHat/Fedora/Rocky/AlmaLinux
# ============================================================

# ── Remove old versions ───────────────────────
- name: Remove old Docker versions (RedHat)
  ansible.builtin.dnf:
    name:
      - docker
      - docker-client
      - docker-client-latest
      - docker-common
      - docker-latest
      - docker-engine
      - podman
      - buildah
    state:     absent
    autoremove: true
  ignore_errors: true

# ── Add repository ────────────────────────────
- name: Install dnf plugins (RedHat)
  ansible.builtin.dnf:
    name:  dnf-plugins-core
    state: present

- name: Add Docker repository (RedHat)
  ansible.builtin.yum_repository:
    name:        docker-ce-stable
    description: Docker CE Stable
    baseurl:     >-
      https://download.docker.com/linux/{{
        'fedora' if ansible_facts['distribution'] == 'Fedora'
        else 'centos' }}/{{ ansible_facts['distribution_major_version'] }}/$basearch/stable
    gpgcheck:    true
    gpgkey:      >-
      https://download.docker.com/linux/{{
        'fedora' if ansible_facts['distribution'] == 'Fedora'
        else 'centos' }}/gpg
    enabled:     true

# ── Install Docker ────────────────────────────
- name: Install Docker CE (RedHat)
  ansible.builtin.dnf:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
      - docker-buildx-plugin
      - docker-compose-plugin
    state: present
  notify: Restart Docker

# ── SELinux configuration ─────────────────────
- name: Configure SELinux for Docker
  ansible.builtin.seboolean:
    name:       container_manage_cgroup
    state:      true
    persistent: true
  when:
    - ansible_facts['selinux']['status'] == 'enabled'
    - ansible_facts['selinux']['mode'] == 'enforcing'
  ignore_errors: true

🟢 openSUSE — Official Method

Χειροκίνητα (για κατανόηση):

# Βήμα 1: Add repository
sudo zypper addrepo \
    https://download.docker.com/linux/sles/docker-ce.repo

# Βήμα 2: Install
sudo zypper install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-compose-plugin

# Βήμα 3: Start
sudo systemctl enable --now docker

Με Ansible:

# roles/docker/tasks/install_suse.yml
---
# ============================================================
# Docker Installation — openSUSE Leap/Tumbleweed
# ============================================================

# ── Add Docker repository ─────────────────────
- name: Add Docker repository (openSUSE)
  community.general.zypper_repository:
    name:        docker-ce-stable
    description: Docker CE Stable
    repo:        >-
      https://download.docker.com/linux/sles/{{ ansible_facts['distribution_major_version'] }}/x86_64/stable
    state:       present
    auto_import_keys: true
  when: ansible_facts['architecture'] == 'x86_64'

# ── Εναλλακτικά: openSUSE official packages ───
- name: Install Docker (openSUSE official)
  community.general.zypper:
    name:
      - docker
      - docker-compose
      - python3-docker
    state: present
  when: ansible_facts['architecture'] != 'x86_64'
  notify: Restart Docker

# ── CE packages αν x86_64 ─────────────────────
- name: Install Docker CE (openSUSE x86_64)
  community.general.zypper:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
      - docker-compose-plugin
    state: present
  when: ansible_facts['architecture'] == 'x86_64'
  notify: Restart Docker

# ── AppArmor profile ──────────────────────────
- name: Enable AppArmor for Docker (openSUSE)
  ansible.builtin.service:
    name:    apparmor
    state:   started
    enabled: true
  ignore_errors: true

Ενοποιημένο tasks/install.yml

cat > ~/ansible/roles/docker/tasks/install.yml << 'EOF'
---
# ============================================================
# Docker Installation — Universal Entry Point
# ============================================================

# ── Έλεγχος αν ήδη εγκατεστημένο ─────────────
- name: Check if Docker is already installed
  ansible.builtin.command:
    cmd: docker --version
  register:     docker_check
  changed_when: false
  ignore_errors: true

- name: Show current Docker version
  ansible.builtin.debug:
    msg: "Docker already installed: {{ docker_check.stdout }}"
  when: docker_check.rc == 0

# ── Εγκατάσταση ανά distro ────────────────────
- name: Install Docker on Debian/Ubuntu
  ansible.builtin.include_tasks:
    file: install_debian.yml
  when:
    - ansible_facts['os_family'] == "Debian"
    - docker_check.rc != 0 or docker_force_install | default(false)

- name: Install Docker on RedHat/Fedora
  ansible.builtin.include_tasks:
    file: install_redhat.yml
  when:
    - ansible_facts['os_family'] == "RedHat"
    - docker_check.rc != 0 or docker_force_install | default(false)

- name: Install Docker on openSUSE
  ansible.builtin.include_tasks:
    file: install_suse.yml
  when:
    - ansible_facts['os_family'] == "Suse"
    - docker_check.rc != 0 or docker_force_install | default(false)

# ── Enable & Start Docker ─────────────────────
- name: Enable and start Docker service
  ansible.builtin.service:
    name:    docker
    state:   started
    enabled: true

# ── Install Python Docker SDK ─────────────────
- name: Install Python Docker SDK
  ansible.builtin.pip:
    name:
      - docker
      - docker-compose
    state: present
  ignore_errors: true

# ── Επαλήθευση ────────────────────────────────
- name: Verify Docker installation
  ansible.builtin.command:
    cmd: docker --version
  register:     docker_version
  changed_when: false

- name: Verify Docker Compose
  ansible.builtin.command:
    cmd: docker compose version
  register:     compose_version
  changed_when: false
  ignore_errors: true

- name: Installation summary
  ansible.builtin.debug:
    msg:
      - "✅ {{ docker_version.stdout }}"
      - "✅ {{ compose_version.stdout | default('Docker Compose: check manually') }}"
EOF

Σύγκριση Μεθόδων Εγκατάστασης

┌──────────────────┬───────────────────────────────────────┐
│ Μέθοδος          │ Χαρακτηριστικά                        │
├──────────────────┼───────────────────────────────────────┤
│ OS packages      │ ❌ Παλιά έκδοση                       │
│ (docker.io)      │ ❌ Χωρίς compose plugin               │
│                  │ ✅ Απλή εγκατάσταση                   │
├──────────────────┼───────────────────────────────────────┤
│ Official repo    │ ✅ Πάντα latest                       │
│ (docker-ce)      │ ✅ Compose + buildx included          │
│                  │ ✅ Official support                   │
│                  │ ⚠️ Πιο σύνθετη εγκατάσταση            │
├──────────────────┼───────────────────────────────────────┤
│ geerlingguy role │ ✅ Battle-tested                      │
│                  │ ✅ Multi-distro                       │
│                  │ ✅ Πλήρης configuration               │
│                  │ ✅ Συνιστάται για production          │
└──────────────────┴───────────────────────────────────────┘

Εκτέλεση

# Syntax check
ansible-playbook playbooks/docker-install.yml \
    --syntax-check

# Dry run
ansible-playbook playbooks/docker-install.yml \
    --check \
    --limit nextcloud \
    -v

# Εκτέλεση
ansible-playbook playbooks/docker-install.yml \
    --limit nextcloud \
    -v

# Επαλήθευση
ansible nextcloud \
    -m ansible.builtin.command \
    -a "docker --version" \
    --become

Σύνοψη D2.1

Docker Installation
├── Debian/Ubuntu:
│   ├── Prerequisites (ca-certs, curl, gnupg)
│   ├── GPG key → /etc/apt/keyrings/docker.gpg
│   ├── Repository → /etc/apt/sources.list.d/docker.list
│   └── Packages: docker-ce, cli, containerd, buildx, compose
│
├── RedHat/Fedora:
│   ├── Remove old versions
│   ├── Repository → yum_repository module
│   ├── Packages: docker-ce, cli, containerd, buildx, compose
│   └── SELinux configuration
│
├── openSUSE:
│   ├── Repository → zypper_repository module
│   └── Packages: docker-ce ή docker (official)
│
└── Universal:
    ├── Enable & start docker service
    ├── pip install docker (Python SDK)
    └── Verify: docker --version