#ติดตั้ง Docker และ Docker Compose บน Ubuntu 26.04.1 LTS ด้วย Ansible

การติดตั้ง Docker บน Server เพียง 1 เครื่องด้วยคำสั่ง apt อาจไม่ได้ยุ่งยากมากนัก แต่เมื่อมีหลายเครื่อง หรือจำเป็นต้องสร้าง Server ใหม่ซ้ำ ๆ การติดตั้งแบบ Manual จะเริ่มมีข้อจำกัด เช่น ขั้นตอนของแต่ละเครื่องไม่เหมือนกัน ลืมติดตั้งบาง package หรือเกิด configuration drift ระหว่าง Server

Ansible ช่วยแก้ปัญหานี้โดยเปลี่ยนขั้นตอนการติดตั้งให้เป็น Infrastructure Automation ซึ่งสามารถกำหนด Desired State ไว้ใน Playbook แล้วใช้ Playbook เดิมติดตั้ง Docker ให้กับ Server จำนวนมากได้

บทความนี้จะแสดงการติดตั้ง

  • Docker Engine
  • Docker CLI
  • containerd
  • Docker Buildx
  • Docker Compose Plugin

บน Ubuntu 26.04.1 LTS โดยใช้ Docker Official APT Repository

Ubuntu 26.04 LTS มีชื่อรุ่นว่า Resolute Raccoon และ Docker ระบุ Ubuntu Resolute 26.04 LTS เป็น Ubuntu รุ่นที่รองรับสำหรับ Docker Engine


#Infographic

info-สร้างบทความ web blog ในรูปแบบ .md


#สิ่งที่จะได้จากบทความ

หลังจากทำตามบทความนี้ จะสามารถ

  • เชื่อมต่อ Ubuntu Server ด้วย Ansible ผ่าน SSH
  • สร้าง Ansible Inventory
  • ตรวจสอบ Ubuntu version ก่อนติดตั้ง
  • ลบ Docker package ที่อาจ conflict
  • เพิ่ม Docker Official APT Repository
  • ติดตั้ง Docker Engine
  • ติดตั้ง Docker Buildx
  • ติดตั้ง Docker Compose Plugin
  • Enable Docker และ containerd ด้วย systemd
  • เพิ่ม User เข้า docker group
  • ตรวจสอบ Docker หลังติดตั้ง
  • ทดลอง hello-world
  • ทดลองสร้าง Container ด้วย Docker Compose
  • นำ Playbook ไปใช้กับ Server หลายเครื่องได้

#1. Architecture

ตัวอย่างระบบในบทความประกอบด้วย 2 ส่วนหลัก

+----------------------------+
|   Ansible Control Node     |
|----------------------------|
| Ansible                    |
| inventory.ini              |
| install-docker.yml         |
+-------------+--------------+
              |
              | SSH
              v
+----------------------------+
| Ubuntu 26.04.1 LTS         |
|----------------------------|
| Docker Engine              |
| Docker CLI                 |
| containerd                 |
| Docker Buildx              |
| Docker Compose Plugin      |
+----------------------------+

Ansible Control Node สามารถเป็น Linux หรือ macOS ได้ ส่วน Managed Node ในตัวอย่างนี้คือ Ubuntu 26.04.1 LTS


#2. Environment ตัวอย่าง

สมมติว่ามี Server ดังนี้

Node IP Address User หน้าที่
Control Node 192.168.1.10 admin รัน Ansible
Docker Server 192.168.1.100 ubuntu ติดตั้ง Docker

Managed Node ต้องสามารถ SSH ได้

ssh ubuntu@192.168.1.100

และ User ควรสามารถใช้ sudo ได้

sudo -v

#3. ทำไมควรติดตั้งจาก Docker Official Repository

Ubuntu มี package ที่เกี่ยวข้องกับ Docker อยู่ใน repository ของ distribution แต่ Docker แนะนำให้ติดตั้ง Docker Engine จาก repository อย่างเป็นทางการของ Docker

Package หลักที่ Docker ใช้ประกอบด้วย

docker-ce
docker-ce-cli
containerd.io
docker-buildx-plugin
docker-compose-plugin

ก่อนติดตั้ง Docker CE ควรลบ package ที่อาจ conflict เช่น

docker.io
docker-compose
docker-compose-v2
docker-doc
docker-buildx
podman-docker
containerd
runc

ดังนั้น Playbook ของเราจะจัดการขั้นตอนนี้ให้อัตโนมัติ


#4. Docker Compose รุ่นปัจจุบัน

ใน Docker รุ่นปัจจุบัน Docker Compose ถูกติดตั้งเป็น Docker CLI Plugin

Package คือ

docker-compose-plugin

รูปแบบคำสั่งที่ควรใช้คือ

docker compose

ตัวอย่าง

docker compose version
docker compose up -d
docker compose down

ไม่ควรยึดติดกับรูปแบบเดิม

docker-compose

เพราะแนวทางปัจจุบันใช้ Compose Plugin ผ่าน Docker CLI


#5. ติดตั้ง Ansible บน Control Node

ตรวจสอบก่อนว่ามี Ansible หรือไม่

ansible --version

หากใช้ Python environment สามารถติดตั้ง Ansible ผ่าน pipx

pipx install --include-deps ansible

ตรวจสอบอีกครั้ง

ansible --version

ตัวอย่าง

ansible [core ...]
python version = ...

#6. สร้าง Project

สร้าง Directory

mkdir ansible-docker
cd ansible-docker

สร้างโครงสร้าง

ansible-docker/
├── inventory.ini
├── group_vars/
│   └── all.yml
└── install-docker.yml

#7. สร้าง Inventory

สร้างไฟล์

inventory.ini

ใส่ข้อมูล

[docker_servers]
docker01 ansible_host=192.168.1.100 ansible_user=ubuntu

[all:vars]
ansible_python_interpreter=/usr/bin/python3

ความหมายคือ

ค่า ความหมาย
docker_servers ชื่อ Host Group
docker01 Alias ของ Managed Node
ansible_host IP Address หรือ Hostname
ansible_user User ที่ใช้ SSH
ansible_python_interpreter Python interpreter บน Managed Node

#8. ทดสอบการเชื่อมต่อ

รัน

ansible docker_servers \
  -i inventory.ini \
  -m ping

ถ้าเชื่อมต่อสำเร็จจะได้ลักษณะ

docker01 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ถ้าใช้ SSH Key ที่ไม่ได้อยู่ใน default location สามารถระบุเพิ่มได้

ansible docker_servers \
  -i inventory.ini \
  -m ping \
  --private-key ~/.ssh/id_ed25519

#9. กำหนด Docker Users

สร้าง Directory

mkdir -p group_vars

สร้างไฟล์

group_vars/all.yml

ตัวอย่าง

---
docker_users:
  - ubuntu

หากต้องการเพิ่มหลาย User

---
docker_users:
  - ubuntu
  - developer
  - devops

สมาชิกของ docker group สามารถควบคุม Docker daemon และมีสิทธิ์สูงมากในระบบ จึงควรเพิ่มเฉพาะ User ที่จำเป็นเท่านั้น


#10. สร้าง Playbook

สร้างไฟล์

install-docker.yml

แล้วใส่ Playbook ต่อไปนี้

---
- name: Install Docker Engine on Ubuntu 26.04
  hosts: docker_servers
  become: true
  gather_facts: true

  pre_tasks:

    - name: Validate Ubuntu 26.04.x
      ansible.builtin.assert:
        that:
          - ansible_distribution == "Ubuntu"
          - ansible_distribution_version is version("26.04", ">=")
          - ansible_distribution_version is version("27.00", "<")
        fail_msg: >
          This playbook is intended for Ubuntu 26.04.x LTS.
          Current system:
          {{ ansible_distribution }}
          {{ ansible_distribution_version }}

    - name: Remove conflicting packages
      ansible.builtin.apt:
        name:
          - docker.io
          - docker-compose
          - docker-compose-v2
          - docker-doc
          - docker-buildx
          - podman-docker
          - containerd
          - runc
        state: absent
        update_cache: true

    - name: Install repository prerequisites
      ansible.builtin.apt:
        name:
          - ca-certificates
          - curl
          - python3-debian
        state: present
        update_cache: true
        cache_valid_time: 3600

  tasks:

    - name: Add Docker official APT repository
      ansible.builtin.deb822_repository:
        name: docker
        types:
          - deb
        uris:
          - https://download.docker.com/linux/ubuntu
        suites:
          - "{{ ansible_distribution_release }}"
        components:
          - stable
        signed_by: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Update APT package cache
      ansible.builtin.apt:
        update_cache: true

    - name: Install Docker Engine and plugins
      ansible.builtin.apt:
        name:
          - docker-ce
          - docker-ce-cli
          - containerd.io
          - docker-buildx-plugin
          - docker-compose-plugin
        state: present

    - name: Ensure Docker service is enabled and started
      ansible.builtin.systemd_service:
        name: docker
        enabled: true
        state: started

    - name: Ensure containerd service is enabled and started
      ansible.builtin.systemd_service:
        name: containerd
        enabled: true
        state: started

    - name: Ensure docker group exists
      ansible.builtin.group:
        name: docker
        state: present

    - name: Add selected users to docker group
      ansible.builtin.user:
        name: "{{ item }}"
        groups:
          - docker
        append: true
      loop: "{{ docker_users }}"

  post_tasks:

    - name: Read Docker version
      ansible.builtin.command:
        cmd: docker --version
      register: docker_version
      changed_when: false

    - name: Display Docker version
      ansible.builtin.debug:
        var: docker_version.stdout

    - name: Read Docker Compose version
      ansible.builtin.command:
        cmd: docker compose version
      register: docker_compose_version
      changed_when: false

    - name: Display Docker Compose version
      ansible.builtin.debug:
        var: docker_compose_version.stdout

    - name: Read Docker Buildx version
      ansible.builtin.command:
        cmd: docker buildx version
      register: docker_buildx_version
      changed_when: false

    - name: Display Docker Buildx version
      ansible.builtin.debug:
        var: docker_buildx_version.stdout

#11. อธิบาย Playbook

#11.1 ตรวจสอบ Operating System

Task นี้ใช้

ansible.builtin.assert

เพื่อตรวจว่า Managed Node เป็น Ubuntu 26.04.x

- name: Validate Ubuntu 26.04.x
  ansible.builtin.assert:

ช่วยลดความเสี่ยงจากการนำ Playbook ไปใช้ผิด Distribution โดยไม่ตั้งใจ


#11.2 ลบ Package ที่อาจ Conflict

Docker Official Documentation แนะนำให้ลบ package ที่อาจชนกับ Docker CE ก่อนติดตั้ง

- name: Remove conflicting packages
  ansible.builtin.apt:

ตัวอย่าง package ได้แก่

- docker.io
- docker-compose
- docker-compose-v2
- docker-doc
- docker-buildx
- podman-docker
- containerd
- runc

#11.3 ติดตั้ง Prerequisites

ติดตั้ง

- ca-certificates
- curl
- python3-debian

python3-debian มีความสำคัญกับ

ansible.builtin.deb822_repository

เพราะ module นี้ต้องใช้ Python Debian library บน Managed Node


#12. ทำไมใช้ deb822_repository

Ansible มี Module

ansible.builtin.deb822_repository

สำหรับจัดการ APT Repository ในรูปแบบ Deb822 หรือไฟล์ .sources

ตัวอย่างจาก Playbook

- name: Add Docker official APT repository
  ansible.builtin.deb822_repository:
    name: docker
    types:
      - deb
    uris:
      - https://download.docker.com/linux/ubuntu
    suites:
      - "{{ ansible_distribution_release }}"
    components:
      - stable
    signed_by: https://download.docker.com/linux/ubuntu/gpg
    state: present

ข้อดีคือสามารถจัดการ

  • Repository URI
  • Distribution Suite
  • Components
  • Signing Key
  • Repository State

ได้ใน Module เดียว


#13. ทำไมไม่ควรใช้ apt_key แบบเก่า

ตัวอย่าง Playbook เก่ามักพบ

ansible.builtin.apt_key:

หรือ

apt-key add

แต่แนวทางนี้ถูก deprecated แล้ว

Ansible รุ่นใหม่แนะนำ

ansible.builtin.deb822_repository

และ ansible.builtin.apt_repository เองก็ถูกประกาศ deprecated โดยให้ใช้ deb822_repository แทน

ดังนั้นสำหรับ Ubuntu 26.04 การใช้ Deb822 Repository เป็นแนวทางที่เหมาะสมกว่า


#14. ตรวจสอบ Syntax

ก่อนรันจริงควรตรวจ Playbook

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --syntax-check

หากไม่มีปัญหาจะได้ประมาณ

playbook: install-docker.yml

#15. ใช้ Check Mode

สามารถตรวจสอบการเปลี่ยนแปลงก่อนรันจริง

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --check

อย่างไรก็ตาม Task บางประเภท เช่น Repository หรือ Package metadata อาจไม่สามารถจำลองผลได้สมบูรณ์ทุกกรณี


#16. รัน Playbook

รัน

ansible-playbook \
  -i inventory.ini \
  install-docker.yml

หากต้องใส่ Password สำหรับ sudo

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --ask-become-pass

#17. Workflow ที่เกิดขึ้น

Start
  |
  v
Gather Facts
  |
  v
Validate Ubuntu 26.04.x
  |
  v
Remove conflicting packages
  |
  v
Install prerequisites
  |
  v
Add Docker Official Repository
  |
  v
APT Update
  |
  v
Install
  |
  +--> docker-ce
  +--> docker-ce-cli
  +--> containerd.io
  +--> docker-buildx-plugin
  +--> docker-compose-plugin
  |
  v
Enable Docker
  |
  v
Enable containerd
  |
  v
Configure docker group
  |
  v
Verify Docker / Compose / Buildx
  |
  v
Complete

#18. ตรวจสอบผลการติดตั้ง

SSH เข้า Server

ssh ubuntu@192.168.1.100

ตรวจ Docker

docker --version

ตรวจ Docker Compose

docker compose version

ตรวจ Buildx

docker buildx version

ตรวจ Docker Service

systemctl status docker

ตรวจ containerd

systemctl status containerd

#19. ตรวจสอบจาก Ansible Control Node

สามารถตรวจโดยไม่ต้อง SSH เข้าแต่ละเครื่อง

#Docker Version

ansible docker_servers \
  -i inventory.ini \
  -b \
  -a "docker --version"

#Docker Compose Version

ansible docker_servers \
  -i inventory.ini \
  -b \
  -a "docker compose version"

#Docker Buildx

ansible docker_servers \
  -i inventory.ini \
  -b \
  -a "docker buildx version"

#Docker Service

ansible docker_servers \
  -i inventory.ini \
  -b \
  -a "systemctl is-active docker"

#ตรวจว่า Docker Enable ตอน Boot หรือไม่

ansible docker_servers \
  -i inventory.ini \
  -b \
  -a "systemctl is-enabled docker"

#20. Logout/Login หลังเพิ่ม docker group

หลังจาก Playbook เพิ่ม User เข้า docker group

groups:
  - docker

SSH session เดิมอาจยังไม่เห็น Group ใหม่

ให้ออกจากระบบ

exit

แล้วเชื่อมต่อใหม่

ssh ubuntu@192.168.1.100

ตรวจสอบ

groups

ควรเห็น

docker

จากนั้นลอง

docker ps

โดยไม่ต้องใช้ sudo


#21. ทดสอบด้วย hello-world

Docker Official Documentation ใช้ hello-world สำหรับตรวจสอบการติดตั้ง

รัน

docker run --rm hello-world

Docker จะ

  1. ตรวจสอบ Image ใน Local
  2. Pull Image หากยังไม่มี
  3. สร้าง Container
  4. แสดงข้อความยืนยัน
  5. Container จบการทำงาน

#22. ทดลอง Docker Compose

สร้าง Directory

mkdir docker-demo
cd docker-demo

สร้างไฟล์

compose.yml

ใส่

services:

  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "8080:80"

รัน

docker compose up -d

ตรวจสอบ

docker compose ps

ตัวอย่าง

NAME                  IMAGE          STATUS
docker-demo-nginx-1   nginx:alpine   Up

เปิด

http://SERVER_IP:8080

ดู Log

docker compose logs -f

หยุดระบบ

docker compose down

#23. ติดตั้ง Docker หลาย Server

หากมีหลายเครื่อง สามารถเพิ่ม Inventory

[docker_servers]
docker01 ansible_host=192.168.1.101 ansible_user=ubuntu
docker02 ansible_host=192.168.1.102 ansible_user=ubuntu
docker03 ansible_host=192.168.1.103 ansible_user=ubuntu

[all:vars]
ansible_python_interpreter=/usr/bin/python3

จากนั้นใช้ Playbook เดิม

ansible-playbook \
  -i inventory.ini \
  install-docker.yml

Ansible จะทำงานกับทุก Host ในกลุ่ม

docker_servers

#24. จุดเด่นของ Idempotency

Ansible ถูกออกแบบให้จัดการ Desired State

เช่นเราต้องการให้

Docker = installed
Docker service = running
Docker service = enabled
docker group = exists
ubuntu = member of docker group

เมื่อรันครั้งแรก อาจได้

changed=7

เมื่อรันซ้ำ

ansible-playbook \
  -i inventory.ini \
  install-docker.yml

ถ้าไม่มีสิ่งที่ต้องเปลี่ยน อาจได้

changed=0

แนวคิดนี้เรียกว่า

Idempotency

เหมาะกับ Configuration Management และ Infrastructure Automation


#25. ใช้ SSH Key

สำหรับ Server จริงควรใช้ SSH Key มากกว่าการพึ่ง Password

ตัวอย่าง Inventory

[docker_servers]
docker01 ansible_host=192.168.1.100

[docker_servers:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_ed25519
ansible_python_interpreter=/usr/bin/python3

หรือกำหนดผ่าน CLI

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --private-key ~/.ssh/id_ed25519

#26. เพิ่ม Ansible Tags

เมื่อ Playbook ใหญ่ขึ้น สามารถใช้ Tags เพื่อเลือกรันบางส่วน

ตัวอย่าง

- name: Install Docker Engine and plugins
  ansible.builtin.apt:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
      - docker-buildx-plugin
      - docker-compose-plugin
    state: present
  tags:
    - docker
    - packages

รันเฉพาะ Docker Tasks

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --tags docker

#27. Production Best Practices

#27.1 Pin Docker Version

Playbook ตัวอย่างใช้

state: present

ซึ่งหมายถึงติดตั้ง Package ที่เหมาะสมจาก Repository ในเวลาที่ Provision

สำหรับ Production ที่ต้องการ reproducibility สูง ควร Pin Docker version

ตรวจ Version ที่มี

apt list --all-versions docker-ce

จากนั้นสามารถกำหนด Variable เช่น

docker_version: "VERSION_STRING"

แล้วติดตั้ง

- name: Install pinned Docker version
  ansible.builtin.apt:
    name:
      - "docker-ce={{ docker_version }}"
      - "docker-ce-cli={{ docker_version }}"
      - containerd.io
      - docker-buildx-plugin
      - docker-compose-plugin
    state: present

ข้อดีคือ Dev, Test และ Production สามารถใช้ Docker Version เดียวกัน


#28. แยกเป็น Ansible Role

เมื่อใช้ Playbook นี้หลาย Project ควรเปลี่ยนเป็น Role

ตัวอย่างโครงสร้าง

ansible-docker/
├── inventory.ini
├── group_vars/
│   └── all.yml
├── site.yml
└── roles/
    └── docker/
        ├── defaults/
        │   └── main.yml
        ├── tasks/
        │   └── main.yml
        └── handlers/
            └── main.yml

site.yml

---
- name: Configure Docker hosts
  hosts: docker_servers
  become: true

  roles:
    - docker

จากนั้น

ansible-playbook \
  -i inventory.ini \
  site.yml

ข้อดีคือ

  • Reuse ง่าย
  • แยก Responsibility ชัดเจน
  • Maintain ง่าย
  • ใช้กับหลาย Environment ได้

#29. ใช้ Ansible Vault

ไม่ควรเก็บข้อมูลสำคัญ เช่น

  • Password
  • API Token
  • Registry Credential
  • Secret Key

ลง Git Repository แบบ Plain Text

สร้าง Vault

ansible-vault create secrets.yml

แก้ไข

ansible-vault edit secrets.yml

รัน Playbook

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --ask-vault-pass

#30. Security: docker group มีสิทธิ์สูง

Docker daemon โดยทั่วไปทำงานด้วยสิทธิ์ระดับสูง

เมื่อเพิ่ม User เข้า

docker

group ผู้ใช้นั้นสามารถสั่ง Docker daemon ได้โดยไม่ต้อง sudo

เช่น

docker run

ดังนั้นอย่าเพิ่ม User ที่ไม่จำเป็นลงใน docker group

สำหรับระบบที่ต้องการลดสิทธิ์ สามารถศึกษา

Docker Rootless Mode

เพิ่มเติม


#31. Security: Docker และ Firewall

Docker มีการจัดการ Network และ packet filtering ของตนเอง

เมื่อ Publish Port

ports:
  - "8080:80"

Service สามารถเปิดผ่าน Host Port 8080

หากใช้ ufw หรือ firewall rule อื่น ควรตรวจสอบพฤติกรรมจริงของ Docker networking โดยเฉพาะ chain เช่น

DOCKER-USER

สำหรับ Production ไม่ควรพึ่ง Firewall assumption โดยไม่ได้ทดสอบจาก Client ภายนอก


#32. Troubleshooting

#32.1 Ansible Ping ไม่ผ่าน

ลอง SSH โดยตรง

ssh ubuntu@192.168.1.100

ตรวจสอบ SSH Service

sudo systemctl status ssh

ตรวจสอบ Network

ping 192.168.1.100

#32.2 sudo ไม่ผ่าน

รันพร้อม

--ask-become-pass

เช่น

ansible-playbook \
  -i inventory.ini \
  install-docker.yml \
  --ask-become-pass

#32.3 Docker Permission Denied

ตัวอย่าง Error

permission denied while trying to connect to the Docker daemon socket

ตรวจ Group

groups

ถ้ายังไม่เห็น

docker

ให้ Logout/Login ใหม่

หรือใช้ชั่วคราว

newgrp docker

#32.4 docker compose ใช้ไม่ได้

ตรวจ Package

dpkg -l | grep docker-compose-plugin

ติดตั้ง

sudo apt update
sudo apt install docker-compose-plugin

ตรวจ

docker compose version

#32.5 Docker Service ไม่ทำงาน

ตรวจ

systemctl status docker

ดู Log

journalctl \
  -u docker \
  --no-pager \
  -n 100

Restart

sudo systemctl restart docker

#32.6 Repository มีปัญหา

ตรวจ Codename

. /etc/os-release
echo "$VERSION_CODENAME"

Ubuntu 26.04 ควรเป็น

resolute

ตรวจ Docker source

cat /etc/apt/sources.list.d/docker.sources

จากนั้นลอง

sudo apt update

#33. คำสั่ง Docker ที่ใช้บ่อย

#Container

docker ps
docker ps -a

#Image

docker images

#Network

docker network ls

#Volume

docker volume ls

#Compose

docker compose ps
docker compose logs -f
docker compose down

#System

docker info
docker system df

#34. แนวทางต่อยอด

หลังจากติดตั้ง Docker ด้วย Ansible แล้ว สามารถต่อยอด Automation ได้หลายรูปแบบ เช่น

Terraform
    |
    v
Create VM
    |
    v
Ansible
    |
    v
Install Docker
    |
    v
Docker Compose
    |
    v
Deploy Application

หรือ

GitHub Actions
      |
      v
Build Image
      |
      v
Container Registry
      |
      v
Ansible
      |
      v
Docker Server
      |
      v
docker compose up -d

เหมาะกับการสร้างระบบ

  • Development Environment
  • Testing Environment
  • Staging
  • Production Server
  • CI/CD Runner
  • Self-hosted Application
  • Docker Lab
  • DevOps Workshop

#35. สรุป

การใช้ Ansible สำหรับติดตั้ง Docker และ Docker Compose บน Ubuntu 26.04.1 LTS ช่วยให้ขั้นตอนการ Provision Server จากเดิมที่ต้องทำ Manual กลายเป็น Infrastructure as Code ที่สามารถทำซ้ำได้

ภาพรวมคือ

Ansible
   |
   v
Ubuntu 26.04.1 LTS
   |
   v
Docker Official Repository
   |
   v
+-------------------------+
| Docker Engine           |
| Docker CLI              |
| containerd              |
| Docker Buildx           |
| Docker Compose Plugin   |
+-------------------------+
   |
   v
systemd
   |
   v
Ready for Containers

ประเด็นสำคัญสำหรับ Ubuntu และ Ansible รุ่นปัจจุบันคือ

  1. ใช้ Docker Official APT Repository
  2. ใช้ docker-compose-plugin
  3. ใช้คำสั่ง docker compose
  4. ใช้ ansible.builtin.deb822_repository
  5. หลีกเลี่ยง workflow เก่าที่ใช้ apt-key
  6. จำกัดสมาชิกของ docker group
  7. Pin Version เมื่อใช้ใน Production ที่ต้องการ reproducibility
  8. แยก Playbook เป็น Role เมื่อระบบใหญ่ขึ้น

เมื่อมี Playbook นี้แล้ว การติดตั้ง Docker Server ใหม่จะเหลือเพียงการเพิ่ม Host เข้า Inventory และรัน

ansible-playbook \
  -i inventory.ini \
  install-docker.yml

ซึ่งช่วยให้ Server หลายเครื่องมี Configuration ที่เป็นมาตรฐานเดียวกัน และเหมาะสำหรับนำไปต่อยอดกับ CI/CD, Terraform และ Infrastructure Automation ในระดับ Production


#References