Docker คือ ตอนที่ 7 : Docker พื้นที่เก็บข้อมูล (Storage)

  1. ทำความเข้าใจกับพื้นที่เก็บข้อมูล Docker
    1.1 Docker Volumes
    1.2 Bind Mounts
    1.3 tmpfs เมานต์ (Mounts)
  2. การทำแอพด้วย Docker Volumes
  3. Docker Storage ในทางปฏิบัติ

Docker ได้ปฏิวัติโลกของการทำแอพและปรับใช้ซอฟต์แวร์ ด้วยการคอนเทนเนอร์แอปพลิเคชันและการอ้างอิง Docker ได้ปรับปรุงกระบวนการสร้าง แบ่งปัน และเรียกใช้ซอฟต์แวร์ในสภาพแวดล้อมต่างๆ แง่มุมหนึ่งของ Docker ที่ต้องให้ความสนใจเป็นพิเศษในการทำแอพคือความสามารถในการจัดเก็บข้อมูล เพื่อใช้ประโยชน์จาก Docker อย่างแท้จริง สิ่งสำคัญคือต้องเข้าใจวิธีการทำงานของพื้นที่จัดเก็บ Docker และวิธีที่สามารถใช้ในการจัดการและคงข้อมูลไว้ได้

1. ทำความเข้าใจกับพื้นที่เก็บข้อมูล Docker

ในระดับพื้นฐาน พื้นที่จัดเก็บ Docker หมายถึงวิธีที่คอนเทนเนอร์ Docker จัดเก็บและจัดการข้อมูล โปรดจำไว้ว่าคอนเทนเนอร์ Docker เป็นอินสแตนซ์ของอิมเมจ Docker โดยพื้นฐานแล้ว เมื่อคอนเทนเนอร์ Docker ทำงาน จะใช้ทรัพยากรของระบบ รวมถึงพื้นที่เก็บข้อมูล Docker มีหลายวิธีในการจัดการที่เก็บข้อมูล แต่ละวิธีมีข้อดีและกรณีการใช้งานของตัวเอง

กลยุทธ์การจัดเก็บข้อมูลของ Docker สามารถแบ่งออกเป็นสามประเภทกว้างๆ ได้แก่ Docker Volumes, Binding Mounts และ Tmpfs Mounts

1.1 Docker Volumes

Docker Volumes เป็นวิธีที่แนะนำสำหรับการจัดการข้อมูลถาวรที่สร้างและใช้งานโดยคอนเทนเนอร์ Docker Volumes Docker เป็นไดเร็กทอรีที่กำหนดขึ้นเป็นพิเศษซึ่งผ่าน Union File System เพื่อให้มีคุณสมบัติที่มีประโยชน์หลายอย่างสำหรับข้อมูลถาวรหรือข้อมูลที่ใช้ร่วมกัน:

  • วอลุ่ม (Volumes) สามารถสำรองหรือโอนย้ายได้ง่ายกว่าการเมานต์แบบ bind
  • คุณสามารถจัดการไดรฟ์ข้อมูลได้โดยใช้คำสั่ง Docker CLI หรือ Docker API
  • Volumes ทำงานได้ทั้งบนคอนเทนเนอร์ Windows และ Linux
  • วอลุ่มสามารถใช้ร่วมกันได้อย่างปลอดภัยมากขึ้นระหว่างคอนเทนเนอร์หลาย ๆ อัน
  • โปรแกรมควบคุมไดรฟ์ข้อมูลช่วยให้คุณสามารถจัดเก็บไดรฟ์ข้อมูลบนโฮสต์ระยะไกลหรือผู้ให้บริการระบบคลาวด์ เพื่อเข้ารหัสเนื้อหาของไดรฟ์ข้อมูล หรือเพื่อเพิ่มฟังก์ชันการทำงานอื่นๆ
  • Volumes ใหม่สามารถบรรจุเนื้อหาไว้ล่วงหน้าโดยคอนเทนเนอร์

ในแง่ของประสิทธิภาพ โดยทั่วไปไดรฟ์ข้อมูลจะเร็วพอๆ อย่างไรก็ตาม สามารถจัดการได้มากขึ้นโดยใช้คำสั่ง Docker และ API และทำงานได้ดีกว่าบน Windows และ macOS

1.2 Bind Mounts

Bind mounts มีมาตั้งแต่ยุคแรก ๆ ของ Docker Bind mounts มีฟังก์ชันการทำงานที่จำกัดเมื่อเทียบกับวอลุ่ม (Volumes) เมื่อคุณใช้การผูกมัด (bind) ไฟล์หรือไดเร็กทอรีบนเครื่องโฮสต์จะถูกเมาต์ลงในคอนเทนเนอร์ ไฟล์หรือไดเร็กทอรีถูกอ้างอิงโดยพาธแบบเต็มหรือแบบสัมพัทธ์บนเครื่องโฮสต์ ในทางตรงกันข้าม ไดรฟ์ข้อมูลได้รับการจัดการโดย Docker และสามารถอ้างอิงได้ด้วยคำสั่ง Docker CLI หลายคำสั่ง

Bind mounts สามารถเก็บไว้ที่ใดก็ได้บนระบบโฮสต์ สามารถเป็นไฟล์ระบบหรือไดเร็กทอรีที่สำคัญได้ Bind mounts นั้นมีประสิทธิภาพมาก แต่ขึ้นอยู่กับระบบไฟล์ของเครื่องโฮสต์ที่มีโครงสร้างไดเร็กทอรีที่แน่นอน

1.3 tmpfs เมานต์ (Mounts)

การเมาต์ tmpfs ถูกเก็บไว้ในหน่วยความจำของระบบโฮสต์เท่านั้น และจะไม่เขียนลงในระบบไฟล์ของระบบโฮสต์

2. การทำแอพด้วย Docker Volumes

เมื่อทำแอพที่ต้องการพื้นที่เก็บข้อมูลถาวรหรือการแชร์ข้อมูลระหว่างคอนเทนเนอร์ วอลุ่ม Docker คือโซลูชันที่ตอบโจทย์ มาดูขั้นตอนทีละขั้นตอนในการทำแอพโดยใช้ไดรฟ์ข้อมูล Docker

สมมติว่าเรากำลังทำแอพ Node.js อย่างง่ายที่เขียนข้อมูลบางอย่างลงในไฟล์ เราต้องการให้ข้อมูลนี้คงอยู่แม้ในขณะที่คอนเทนเนอร์หยุดหรือขัดข้อง และพร้อมใช้งานหากเราเริ่มคอนเทนเนอร์ใหม่

ขั้นแรก สร้างไดเร็กทอรีสำหรับโปรเจ็กต์ของคุณและไปที่:

$ mkdir docker-volume-app && cd docker-volume-app

จากนั้นสร้างไฟล์ใหม่ชื่อ app.js นี่เป็นแอปพลิเคชั่น Node.js อย่างง่าย:

const fs = require('fs');
const data = "Hello, Docker!";

fs.writeFile('/data/myfile.txt', data, (err) => {
    if (err) throw err;
    console.log('Data written to file');
});

แอปพลิเคชันนี้เขียนสตริง “Hello, Docker!” ไปยังไฟล์ชื่อ myfile.txt ที่อยู่ใน /data ไดเร็กทอรี

ถัดไป สร้าง Dockerfile ในไดเร็กทอรีเดียวกัน:

FROM node:14
WORKDIR /app
COPY . .
CMD [ "node", "app.js" ]

Dockerfile นี้ใช้อิมเมจ Node.js อย่างเป็นทางการ ตั้งค่าไดเร็กทอรีการทำงานเป็น /app คัดลอกไดเร็กทอรีปัจจุบันลงในอิมเมจ Docker และสุดท้าย รันสคริปต์ app.js เมื่อคอนเทนเนอร์เริ่มทำงาน

จากนั้น คุณสามารถสร้างอิมเมจ Docker โดยใช้คำสั่งต่อไปนี้:

$ docker build -t docker-volume-app .

สิ่งนี้จะสร้างอิมเมจ Docker ใหม่และแท็กเป็น docker-volume-app

ตอนนี้มาถึงส่วนที่น่าสนใจ – การรันคอนเทนเนอร์ด้วย Docker Volumes คุณสามารถสร้างและจัดการ Docker Volumes โดยใช้คำสั่ง docker volume มาสร้าง Volumes ใหม่กันเถอะ:

$ docker volume create my_volume

จากนั้นคุณสามารถเรียกใช้คอนเทนเนอร์ Docker ของคุณและแนบโวลุ่ม (volume) เข้าไปได้:

$ docker run -v my_volume:/data docker-volume-app

หรือ -v ตัว --volume เลือกบอกให้ Docker สร้างไดรฟ์ข้อมูล my_volume:/data หมายความว่า Docker จะเมานต์ไดรฟ์ข้อมูลที่มีชื่อ my_volume ไปยัง /data ไดเร็กทอรีในคอนเทนเนอร์

ตอนนี้ แอปพลิเคชัน Node.js ของคุณเขียนข้อมูลไปยังไฟล์ที่อยู่ในวอลุ่ม Docker ซึ่งหมายความว่าข้อมูลจะยังคงอยู่แม้ว่าคอนเทนเนอร์จะถูกหยุดหรือถูกลบ คุณสามารถยืนยันสิ่งนี้ได้โดยเริ่มคอนเทนเนอร์ใหม่และตรวจสอบเนื้อหาของไฟล์ /data/myfile.txt

3. Docker Storage ในทางปฏิบัติ

การทำความเข้าใจที่เก็บข้อมูล Docker เป็นสิ่งสำคัญสำหรับการทำแอพที่ยืดหยุ่นและปรับขนาดได้ แม้ว่าคู่มือนี้จะให้ข้อมูลเบื้องต้นเบื้องต้น แต่พื้นที่จัดเก็บ Docker ยังเป็นหัวข้อที่กว้างขวางและอีกมากมายให้สำรวจ

ตัวอย่างเช่น คุณสามารถเจาะลึกไดรเวอร์ที่เก็บข้อมูลของ Docker ซึ่งมีหน้าที่รับผิดชอบในการเปิดใช้งานและจัดการอิมเมจแบบเลเยอร์ของ Docker ไดรเวอร์อุปกรณ์จัดเก็บข้อมูลช่วยให้คุณเพิ่มประสิทธิภาพการติดตั้ง Docker ตามความต้องการของโครงการ ไม่ว่าคุณจะให้ความสำคัญกับประสิทธิภาพ ขนาด หรือความสมดุลของทั้งสองอย่าง

Docker ยังมีปลั๊กอินสำหรับระบบจัดเก็บข้อมูลของบุคคลที่สาม เช่น โซลูชันบนคลาวด์ ระบบเหล่านี้สามารถจัดการและปรับขนาดทรัพยากรพื้นที่เก็บข้อมูลโดยอัตโนมัติตามความต้องการของแอปพลิเคชันของคุณ

Docker Volumes ยังเปิดประตูสู่ข้อมูลที่ใช้ร่วมกันระหว่างคอนเทนเนอร์ ความสามารถนี้สามารถเปิดใช้งานแอปพลิเคชันที่ซับซ้อนมากขึ้นที่ประกอบด้วยหลายคอนเทนเนอร์ที่มีการโต้ตอบ


Docker ได้กลายเป็นเครื่องมือที่จำเป็นสำหรับการทำแอพสมัยใหม่ กลยุทธ์การจัดเก็บข้อมูล Docker การเรียนรู้สามารถช่วยอย่างมากในการทำแอพและปรับใช้แอปพลิเคชันที่มีประสิทธิภาพและยืดหยุ่น ความสำคัญของความคงอยู่ของข้อมูลและการจัดการในการทำแอพทำให้ที่เก็บข้อมูล Docker เป็นหัวข้อที่จำเป็นสำหรับนักพัฒนาทุกคนในการเรียนรู้


Docker คืออะไร

Docker คือ ตอนที่ 6 : Docker ระบบเครือข่าย (Networking)
Docker คือ ตอนที่ 8 : แนวทางปฏิบัติที่ดีที่สุด (Best Practices)