Category: Docker

  • ลบ log ใน Docker Container

    ## วิธีเคลียร์ Log (สำหรับ json-file driver)

    วิธีที่ปลอดภัยที่สุดคือการทำให้ไฟล์ log กลายเป็นไฟล์ว่างขนาด 0 byte โดยไม่ลบตัวไฟล์ทิ้ง เพราะ Docker daemon ยังคงเปิดไฟล์นี้ใช้งานอยู่

    ขั้นตอนที่ 1: ค้นหาตำแหน่งของ Log File

    ใช้คำสั่ง docker inspect เพื่อหาว่าไฟล์ log ของ container ที่คุณต้องการนั้นถูกเก็บไว้ที่ไหน

    docker inspect -f '{{.LogPath}}' <container_name_or_id>

    ตัวอย่าง: หากต้องการหา log ของ container ชื่อ n8n

    ผลลัพธ์ที่ได้ (ตัวอย่าง):

    /var/snap/docker/common/var-lib-docker/containers/a253dd15b76c.../a253dd15b76c...-json.log

    ขั้นตอนที่ 2: เคลียร์เนื้อหาในไฟล์ (Truncate)

    เมื่อได้ตำแหน่งของไฟล์จากขั้นตอนที่ 1 แล้ว ให้ใช้คำสั่งต่อไปนี้เพื่อล้างเนื้อหาทั้งหมดในไฟล์นั้น โดยแทนที่ <path_to_log_file> ด้วยตำแหน่งจริงที่คุณได้มา

    sudo sh -c '> <path_to_log_file>'

    ตัวอย่าง:

    sudo sh -c '> /var/snap/docker/common/var-lib-docker/containers/a253dd15b76c.../a253dd15b76c...-json.log'

    คำสั่งนี้จะทำให้ไฟล์ log มีขนาด 0 byte ทันที และ Docker จะเริ่มเขียน log ใหม่ลงในไฟล์เดิมนี้ต่อไป

  • CephSF ลงบน ubuntu

    ได้แน่นอนครับ! Ceph สามารถทำงานบน Ubuntu ได้อย่างยอดเยี่ยม และเป็นหนึ่งในระบบปฏิบัติการที่ได้รับความนิยมสูงสุดสำหรับการสร้าง Ceph Cluster

    เราจะใช้เครื่องมือ cephadm ซึ่งเป็นวิธีที่ทันสมัยและแนะนำโดย Ceph ในปัจจุบัน cephadm จะจัดการ Ceph services ทั้งหมดผ่าน Container (โดยใช้ Podman หรือ Docker) ทำให้การติดตั้ง, บริหารจัดการ, และอัปเกรดทำได้ง่ายและเป็นระเบียบมาก

    นี่คือขั้นตอนการติดตั้ง Ceph Cluster บน Ubuntu Server 22.04 LTS แบบละเอียดตั้งแต่ต้นจนจบครับ

    🎯 เป้าหมาย

    สร้าง Ceph Cluster ที่พร้อมใช้งานและทนทาน (High Availability) ประกอบด้วย:

    • 3 Nodes: เพื่อให้ได้ Quorum (เสียงข้างมาก) สำหรับส่วนบริหารจัดการ
    • ceph-node1 (IP: 192.168.1.101)
    • ceph-node2 (IP: 192.168.1.102)
    • ceph-node3 (IP: 192.168.1.103)
    • Disk: แต่ละ Node ควรมี Disk ว่างอย่างน้อย 1 ลูก (ที่ไม่ใช่ OS Disk) สำหรับใช้เป็น OSD
    • OS: Ubuntu Server 22.04 LTS (Jammy Jellyfish)

    🛠️ ขั้นตอนที่ 1: เตรียม Server (ทำบนทุก Node)

    ขั้นตอนนี้สำคัญมาก ต้องทำบน ceph-node1, ceph-node2, และ ceph-node3 ให้เหมือนกันทั้งหมด

    1. ตั้งค่า Hostname และ /etc/hosts
      เพื่อให้ทุก Node รู้จักกันผ่านชื่อได้ แก้ไขไฟล์ /etc/hosts บนทุกเครื่อง:
      Bash
      sudo nano /etc/hosts

      เพิ่มบรรทัดเหล่านี้เข้าไป:
      127.0.0.1       localhost
      192.168.1.101   ceph-node1
      192.168.1.102   ceph-node2
      192.168.1.103   ceph-node3

      จากนั้นตั้งค่า hostname ของแต่ละเครื่องให้ตรงกัน เช่น บน ceph-node1:
      Bash
      sudo hostnamectl set-hostname ceph-node1
    2. สร้าง User สำหรับจัดการ Ceph
      เพื่อความปลอดภัย เราจะสร้าง user ชื่อ ceph-admin และให้สิทธิ์ sudo แบบไม่ต้องถามรหัสผ่าน
      Bash
      sudo useradd -m -s /bin/bash ceph-admin
      sudo echo “ceph-admin ALL=(ALL) NOPASSWD:ALL” | sudo tee /etc/sudoers.d/ceph-admin
    3. ตั้งค่า SSH Key (ทำจาก ceph-node1)
      cephadm จะใช้ SSH เพื่อเชื่อมต่อไปยัง Node อื่นๆ เราจะสร้าง SSH key บน ceph-node1 ในนามของ ceph-admin และคัดลอกไปยัง Node อื่นๆ
      Bash
      # สลับไปที่ user ceph-admin
      sudo su – ceph-admin

      # สร้าง SSH key
      ssh-keygen -t rsa

      # คัดลอก key ไปยัง node อื่นๆ (ระบบจะถามรหัสผ่านของ ceph-admin)
      ssh-copy-id ceph-admin@ceph-node1
      ssh-copy-id ceph-admin@ceph-node2
      ssh-copy-id ceph-admin@ceph-node3

      ทดลอง SSH จาก ceph-node1 ไปยัง Node อื่นๆ เพื่อให้แน่ใจว่าไม่ต้องใส่รหัสผ่านแล้ว
    4. ติดตั้ง Dependencies และ Ceph Repository
      Bash
      # สลับกลับมาเป็น root หรือ user ที่มี sudo
      # อัปเดตระบบและติดตั้งเครื่องมือพื้นฐาน
      sudo apt update
      sudo apt install -y curl gnupg

      # เพิ่ม Ceph Repository Key
      curl -fsSL https://download.ceph.com/keys/release.asc | sudo gpg –dearmor -o /etc/apt/trusted.gpg.d/ceph.gpg

      # เพิ่ม Ceph Repository (ตัวอย่างสำหรับเวอร์ชัน Reef และ Ubuntu 22.04)
      echo “deb https://download.ceph.com/debian-reef/ jammy main” | sudo tee /etc/apt/sources.list.d/ceph.list
    5. ติดตั้ง cephadm และ Container Runtime
      cephadm จะติดตั้ง podman ให้โดยอัตโนมัติหากยังไม่มี แต่เราสามารถติดตั้งเองก่อนได้
      Bash
      sudo apt update
      sudo apt install -y cephadm chrony
    • cephadm: เครื่องมือหลักของเรา
    • chrony: สำหรับซิงโครไนซ์เวลาของทุก Node ให้ตรงกัน (สำคัญมาก!)
    1. ปิดการทำงาน Firewall (ชั่วคราว)
      เพื่อความง่ายในการติดตั้ง เราจะปิด ufw ไปก่อน ในระบบ Production ควรตั้งค่า rules ให้ถูกต้อง
      Bash
      sudo ufw disable

    🚀 ขั้นตอนที่ 2: Bootstrap Ceph Cluster (ทำบน ceph-node1 เท่านั้น)

    ขั้นตอนนี้คือการสร้าง “หัวใจ” ของ Cluster บน Node แรก

    1. สลับไปที่ user ceph-admin
      Bash
      sudo su – ceph-admin
    2. Bootstrap Cluster
      คำสั่งนี้จะบอก cephadm ให้เริ่มสร้าง Cluster โดยใช้ IP ของ ceph-node1 เป็น Monitor (MON) ตัวแรก
      Bash
      # สร้าง directory สำหรับ config
      mkdir -p /home/ceph-admin/ceph-cluster
      cd /home/ceph-admin/ceph-cluster

      # เริ่ม Bootstrap!
      cephadm bootstrap –mon-ip 192.168.1.101

      ขั้นตอนนี้จะใช้เวลาสักครู่ cephadm จะดึง Ceph container image และเริ่มรัน MON กับ Manager (MGR) ตัวแรกขึ้นมา
    3. ตรวจสอบผลลัพธ์
      เมื่อเสร็จสิ้น cephadm จะแสดงข้อความสำคัญ:
    • URL สำหรับเข้าหน้า Dashboard
    • Username (admin) และรหัสผ่านสำหรับ Dashboard
    • คำสั่งสำหรับเข้าใช้งาน Ceph command-line

    สำคัญมาก: cephadm จะสร้างไฟล์ ceph.conf และ ceph.client.admin.keyring ไว้ที่ /etc/ceph/ และจะสร้าง cephadm-ansible-inventory.yaml ไว้ใน directory ที่คุณรันคำสั่ง

    1. เข้าใช้งาน Ceph Shell
      เพื่อให้ใช้คำสั่ง ceph ได้สะดวกที่สุด ให้ใช้ cephadm shell
      Bash
      sudo cephadm shell

      เมื่อเข้าไปใน shell แล้ว ลองรันคำสั่งตรวจสอบสถานะ:
      Bash
      ceph -s

      คุณควรจะเห็นสถานะเป็น HEALTH_WARN เพราะยังมี MON แค่ตัวเดียวและยังไม่มี OSD (Disk)

    🌐 ขั้นตอนที่ 3: ขยาย Cluster (ทำบน ceph-node1 ใน cephadm shell)

    ตอนนี้เราจะเพิ่ม Node ที่เหลือเข้ามาใน Cluster

    1. เพิ่ม Host
      cephadm จะใช้ SSH ที่เราตั้งค่าไว้เพื่อเข้าไปติดตั้ง Ceph services บน Node ใหม่
      Bash
      # รันคำสั่งใน cephadm shell
      ceph orch host add ceph-node2 192.168.1.102
      ceph orch host add ceph-node3 192.168.1.103
    2. ตรวจสอบสถานะ Host
      Bash
      ceph orch host ls
      # คุณควรจะเห็น Host ทั้ง 3 ตัวอยู่ในรายการ
    3. เพิ่ม MON และ MGR เพื่อทำ High Availability (HA)
      Bash
      # กำหนดให้มี MON ทั้งหมด 3 ตัว (กระจายไปตาม Node)
      ceph orch apply mon 3

      # กำหนดให้มี MGR ทั้งหมด 2 ตัว (Active/Standby)
      ceph orch apply mgr 2

      cephadm จะเลือก Node ที่เหมาะสมในการวาง services เหล่านี้ให้อัตโนมัติ รอสักครู่แล้วลอง ceph -s ดูอีกครั้ง จะเห็นว่าจำนวน mon และ mgr เพิ่มขึ้น

    💾 ขั้นตอนที่ 4: เพิ่ม OSD (Disk สำหรับเก็บข้อมูล)

    ขั้นตอนนี้คือการนำ Disk ที่ยังว่างอยู่มาใช้งาน

    1. ตรวจสอบ Disk ที่พร้อมใช้งาน
      Bash
      # ใน cephadm shell
      ceph orch device ls
      # คุณจะเห็นรายการ Disk ทั้งหมดใน Cluster และสถานะ (Available: true)
      # เช่น /dev/sdb, /dev/sdc
    2. สร้าง OSD จาก Disk ที่ว่างทั้งหมด
      คำเตือน: คำสั่งนี้จะล้างข้อมูลทั้งหมดใน Disk ที่มีสถานะ Available: true!
      Bash
      ceph orch apply osd –all-available-devices

      cephadm จะเข้าไปฟอร์แมตและสร้าง OSD บน Disk เหล่านั้นให้ รอสักครู่จนเสร็จ
    3. ตรวจสอบสถานะ Cluster
      รัน ceph -s อีกครั้ง ตอนนี้คุณควรจะเห็น:
    • osd: 3 osds: 3 up, 3 in (หรือมากกว่านี้ถ้ามี Disk หลายลูก)
    • สถานะ Cluster เปลี่ยนเป็น HEALTH_OK สีเขียว! 🎉
    • มีพื้นที่ (RAW CAPACITY) แสดงขึ้นมา

    📄 ขั้นตอนที่ 5: สร้าง Ceph File System (CephFS)

    เมื่อ Cluster พร้อมแล้ว เราก็มาสร้าง File System ที่จะนำไปใช้งานกัน

    1. สร้าง CephFS Volume
      คำสั่งนี้จะสร้างทุกอย่างที่จำเป็น (Data pool, Metadata pool, และ MDS service)
      Bash
      # ใน cephadm shell
      ceph fs volume create my-cephfs
    2. ตรวจสอบสถานะ
      cephadm จะสร้าง Metadata Server (MDS) ขึ้นมาโดยอัตโนมัติ
      Bash
      ceph -s
      # คุณจะเห็น section mds: my-cephfs: 1/1/1 up {0=ceph-nodeX=active}

    ยินดีด้วยครับ! ตอนนี้คุณได้ติดตั้ง Ceph Cluster ที่สมบูรณ์และพร้อมใช้งานบน Ubuntu Server เรียบร้อยแล้ว ขั้นตอนต่อไปคือการนำ CephFS นี้ไป mount บนเครื่อง Client (Docker Host) เพื่อใช้งานเป็น Persistent Volume ซึ่งสามารถทำตามขั้นตอนในคำตอบก่อนหน้านี้ได้เลยครับ