Docker

Docker คืออะไร

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

1. Docker คืออะไร?

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

สิ่งที่ทำให้ Docker แตกต่างจากเทคโนโลยีอื่นๆ เช่น Virtual Machines (VMs) คือ Docker ใช้เคอร์เนลของระบบปฏิบัติการเดียวกันในการรันคอนเทนเนอร์แต่ละตัว ทำให้มีประสิทธิภาพในการใช้งานทรัพยากรสูงขึ้น และทำให้คอนเทนเนอร์ใช้เวลาในการเริ่มต้นที่รวดเร็ว

องค์ประกอบหลักของ Docker:

  • Docker Engine: ส่วนที่ทำงานอยู่เบื้องหลังคอนเทนเนอร์ มีหน้าที่จัดการการสร้างและรันคอนเทนเนอร์
  • Docker Image: ไฟล์แบบอิมเมจที่บรรจุโค้ดและการตั้งค่าทั้งหมดที่จำเป็นในการรันแอปพลิเคชัน
  • Docker Container: สภาพแวดล้อมแยกที่รันแอปพลิเคชันในระบบปฏิบัติการเดียวกัน

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

ประวัติและการพัฒนา Docker

Docker ถูกพัฒนาขึ้นในปี 2013 โดย Solomon Hykes ในช่วงที่เขาทำงานที่บริษัท dotCloud (ต่อมาเปลี่ยนชื่อเป็น Docker Inc.) ซึ่งเป็นบริษัทที่ให้บริการ PaaS (Platform as a Service) เป้าหมายของ Docker คือการทำให้การพัฒนาและการปรับใช้แอปพลิเคชันเป็นเรื่องที่ง่ายขึ้นโดยการลดปัญหาที่เกิดจากการพึ่งพาสภาพแวดล้อมที่แตกต่างกัน

แนวคิดหลักที่ Docker ใช้คือการสร้างและจัดการคอนเทนเนอร์ที่สามารถทำงานได้อย่างแยกจากระบบปฏิบัติการโฮสต์ แนวคิดนี้ได้รับแรงบันดาลใจจาก Linux Containers (LXC) ซึ่งเป็นฟีเจอร์ที่มีอยู่ใน Linux Kernel สำหรับการแยกสภาพแวดล้อมการทำงาน

การพัฒนา Docker ได้รวบรวมเอาความสามารถและข้อดีจาก LXC และเพิ่มความสามารถในการจัดการที่ง่ายขึ้นผ่าน Docker Engine ซึ่งทำให้ผู้ใช้สามารถสร้างและจัดการคอนเทนเนอร์ได้ด้วยคำสั่งง่ายๆ ผ่าน Command Line

ตั้งแต่การเปิดตัว Docker ก็ได้รับความนิยมอย่างรวดเร็วในวงการพัฒนาและ DevOps เพราะมันช่วยลดเวลาที่ใช้ในการปรับใช้แอปพลิเคชัน และช่วยให้นักพัฒนาสามารถสร้างสภาพแวดล้อมการทดสอบที่สอดคล้องกับระบบจริงได้อย่างรวดเร็ว

2. Docker มีกี่ประเภท

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

  1. Docker Personal
    เหมาะสำหรับผู้ใช้ทั่วไปหรือนักพัฒนาเดี่ยวที่ต้องการใช้ Docker ในการสร้างและทดสอบแอปพลิเคชัน บริการนี้เป็นแบบฟรีและเหมาะสำหรับการใช้งานในโปรเจกต์ส่วนตัวหรือการเรียนรู้

  2. Docker Pro
    Docker Pro เหมาะสำหรับนักพัฒนามืออาชีพที่ต้องการเครื่องมือเพิ่มเติม เช่น ปริมาณการดึงภาพ (Image pulls) มากขึ้น การสนับสนุนขั้นสูง รวมถึงฟีเจอร์ความปลอดภัยที่เพิ่มขึ้น

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

  4. Docker Business
    Docker Business สำหรับองค์กรขนาดใหญ่ ที่ต้องการการควบคุมความปลอดภัยสูงสุด รวมถึงการจัดการที่ครอบคลุมสำหรับการปรับใช้แอปพลิเคชันในหลายๆ ทีม พร้อมการสนับสนุนจาก Docker อย่างเต็มรูปแบบ รายละเอียดเพิ่มเติม Docker Business

3. ความสำคัญของ Docker ในโลกของ DevOps

DevOps เป็นแนวทางการทำงานที่ผสานการพัฒนา (Development) และการปฏิบัติการ (Operations) เข้าด้วยกัน โดยมีเป้าหมายในการเพิ่มประสิทธิภาพและความรวดเร็วในการพัฒนา ปรับใช้ และดูแลรักษาแอปพลิเคชัน

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

  • การลดความซับซ้อนในการจัดการสภาพแวดล้อม: ด้วย Docker นักพัฒนาสามารถสร้างสภาพแวดล้อมที่สอดคล้องกันสำหรับการทดสอบและการปรับใช้ได้ง่ายขึ้น ซึ่งลดปัญหาการทำงานข้ามแพลตฟอร์ม
  • ความเร็วในการปรับใช้: Docker ทำให้การสร้างและจัดการคอนเทนเนอร์ทำได้รวดเร็ว และสามารถปรับใช้แอปพลิเคชันได้ภายในไม่กี่วินาที
  • การสนับสนุนไมโครเซอร์วิส (Microservices): Docker ช่วยในการสร้างแอปพลิเคชันที่มีการแยกส่วน ทำให้การพัฒนาและอัปเดตสามารถทำได้ง่ายและแยกจากกัน

4. การทำงานของ Docker

Docker ทำงานบนหลักการของการใช้เทคโนโลยีคอนเทนเนอร์เพื่อแยกสภาพแวดล้อมที่ใช้ในการรันแอปพลิเคชันจากระบบปฏิบัติการโฮสต์ โดยแต่ละคอนเทนเนอร์จะรันในสภาพแวดล้อมที่แยกจากกัน แม้จะใช้เคอร์เนลของระบบปฏิบัติการโฮสต์เดียวกันก็ตาม

องค์ประกอบหลักของ Docker:

  • Docker Daemon: เป็นโปรแกรมที่รันอยู่เบื้องหลัง มีหน้าที่จัดการทุกอย่างเกี่ยวกับคอนเทนเนอร์ เช่น การสร้างคอนเทนเนอร์, การจัดการเครือข่าย และการเก็บข้อมูล
  • Docker Client: เป็นโปรแกรมที่ผู้ใช้ใช้ในการสั่งการ Docker Daemon ผ่านคำสั่งที่สามารถรันผ่าน Command Line
  • Docker Image: ไฟล์ที่ประกอบด้วยโค้ดและทุกสิ่งที่แอปพลิเคชันนั้นต้องการในการรัน เช่น ไลบรารี ระบบปฏิบัติการเบื้องต้น และไฟล์การตั้งค่าต่างๆ
  • Docker Container: เมื่อมีการสร้างและรัน Docker Image จะเกิดคอนเทนเนอร์ขึ้น คอนเทนเนอร์เป็นสภาพแวดล้อมที่แยกจากกันที่สามารถรันแอปพลิเคชันได้โดยไม่ต้องพึ่งพาทรัพยากรหรือการตั้งค่าจากระบบปฏิบัติการโฮสต์มากนัก
  • Docker Registry: ที่เก็บ Docker Image เช่น Docker Hub เป็นบริการที่ใช้สำหรับการแชร์และดาวน์โหลด Docker Image จากชุมชนนักพัฒนา

ขั้นตอนการทำงานของ Docker:

  1. นักพัฒนาสร้าง Dockerfile ซึ่งเป็นสคริปต์ที่กำหนดขั้นตอนในการสร้าง Docker Image เช่น การติดตั้งไลบรารี การคัดลอกโค้ด และการตั้งค่าที่จำเป็น
  2. นักพัฒนาสร้าง Docker Image จาก Dockerfile โดยใช้คำสั่ง docker build
  3. เมื่อสร้าง Docker Image แล้ว สามารถรันคอนเทนเนอร์จาก Docker Image นั้นได้โดยใช้คำสั่ง docker run
  4. Docker จะจัดการการรันแอปพลิเคชันในคอนเทนเนอร์ รวมถึงการตั้งค่าการเข้าถึงเครือข่ายและการจัดการทรัพยากร

Docker ทำให้การทดสอบแอปพลิเคชันในสภาพแวดล้อมต่างๆ ทำได้ง่ายขึ้นและสม่ำเสมอ ไม่ว่าจะเป็นการรันบนเครื่องพัฒนาของนักพัฒนาเองหรือในระบบเซิร์ฟเวอร์จริง

5. Docker vs Virtual Machine (VM): ความแตกต่างทางเทคนิค

Docker และ Virtual Machine (VM) เป็นเทคโนโลยีที่ใช้ในการแยกสภาพแวดล้อมการทำงาน แต่ทั้งสองมีหลักการทำงานที่แตกต่างกันอย่างสิ้นเชิง

Docker:

  • ใช้เคอร์เนลของระบบปฏิบัติการโฮสต์ ทำให้ไม่ต้องจำลองระบบปฏิบัติการใหม่ทั้งหมด
  • คอนเทนเนอร์มีขนาดเล็กและสามารถเริ่มต้นได้รวดเร็ว
  • ใช้ทรัพยากรของระบบปฏิบัติการโฮสต์น้อยกว่า
  • เหมาะสำหรับการพัฒนาแอปพลิเคชันแบบไมโครเซอร์วิส (Microservices) ที่สามารถแยกแอปพลิเคชันเป็นส่วนๆ และรันในคอนเทนเนอร์แยกกัน

Virtual Machine (VM):

  • จำลองระบบปฏิบัติการทั้งหมด รวมถึงเคอร์เนล ทำให้ต้องใช้ทรัพยากรมากกว่า
  • ขนาดไฟล์ VM ใหญ่และใช้เวลาในการเริ่มต้นนานกว่า
  • เหมาะสำหรับการรันแอปพลิเคชันขนาดใหญ่หรือการจำลองระบบที่ต้องการระบบปฏิบัติการแยกกัน
คุณสมบัติDockerVirtual Machine (VM)
การใช้เคอร์เนลใช้เคอร์เนลของระบบปฏิบัติการโฮสต์จำลองระบบปฏิบัติการเต็มรูปแบบ
ขนาดไฟล์ขนาดเล็กขนาดใหญ่
เวลาเริ่มต้นเริ่มต้นได้อย่างรวดเร็วใช้เวลามากขึ้น
การใช้ทรัพยากรใช้ทรัพยากรน้อยใช้ทรัพยากรมาก
ความยืดหยุ่นเหมาะสำหรับแอปพลิเคชันแบบไมโครเซอร์วิสเหมาะสำหรับการจำลองระบบขนาดใหญ่
การแยกทรัพยากรแยกการทำงานในระดับแอปพลิเคชันแยกระบบปฏิบัติการทั้งหมด

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

6. องค์ประกอบหลักของ Docker

ในการทำงานกับ Docker มีองค์ประกอบหลักหลายอย่างที่มีบทบาทสำคัญในการทำงาน เราจะมาดูรายละเอียดเชิงเทคนิคของแต่ละองค์ประกอบ ดังนี้:

1. Docker Engine

Docker Engine เป็นซอฟต์แวร์ที่รันอยู่เบื้องหลังซึ่งทำหน้าที่สร้างและจัดการคอนเทนเนอร์ในระบบ มันมีองค์ประกอบย่อย 2 ส่วนที่สำคัญ ได้แก่:

  • Docker Daemon (dockerd): เป็นโปรแกรมหลักที่รันอยู่เบื้องหลังและรับคำสั่งจาก Docker Client ผ่าน API โดย Daemon จะจัดการทุกอย่างที่เกี่ยวข้องกับคอนเทนเนอร์ เช่น การสร้าง, การเริ่มต้น, การหยุด, และการลบคอนเทนเนอร์
  • Docker CLI (docker): คือส่วนที่ผู้ใช้ใช้ในการสั่งการ Docker ผ่านคำสั่งต่างๆ ผ่าน Command Line Interface เช่น การสร้างคอนเทนเนอร์ (docker run), การสร้างอิมเมจ (docker build), และการจัดการเครือข่าย (docker network)

2. Docker Image

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

Dockerfile Syntax: Dockerfile มีคำสั่งที่เป็นลำดับขั้นตอน เช่น:

  • FROM: ระบุ Image เบื้องต้น เช่น Ubuntu, Alpine หรือ Node.js
  • RUN: รันคำสั่งใน Image เช่น การติดตั้งแพ็คเกจ
  • COPY/ADD: คัดลอกไฟล์จากโฮสต์เข้าสู่ Image
  • CMD/ENTRYPOINT: กำหนดคำสั่งที่รันเมื่อคอนเทนเนอร์เริ่มทำงาน

ตัวอย่าง Dockerfile สำหรับแอปพลิเคชัน Node.js:

dockerfile
# ใช้ Node.js เวอร์ชัน 14 เป็น Image พื้นฐาน
FROM node:14
# สร้างไดเรกทอรีแอป
WORKDIR /usr/src/app

# คัดลอกไฟล์ package.json และติดตั้ง dependencies

COPY package*.json ./ RUN npm install

# คัดลอกโค้ดทั้งหมดเข้าสู่ Image
COPY . .

# เปิดพอร์ต 8080

EXPOSE 8080

# คำสั่งรันแอป
CMD ["node", "app.js"]

3. Docker Container

เมื่อรัน Docker Image จะเกิด Docker Container ซึ่งเป็นสภาพแวดล้อมแยกที่สามารถรันแอปพลิเคชันได้ คอนเทนเนอร์มีคุณสมบัติดังนี้:

  • แยกการทำงานจากระบบปฏิบัติการโฮสต์ แต่ยังใช้เคอร์เนลร่วมกัน
  • สามารถสร้าง, ลบ, หยุด, และรีสตาร์ทได้อย่างง่ายดาย
  • สามารถแชร์ทรัพยากรเครือข่ายและไฟล์ระหว่างคอนเทนเนอร์ต่างๆ ได้

ตัวอย่างคำสั่งรันคอนเทนเนอร์:

docker run -d -p 8080:8080 myapp

คำสั่งนี้จะสร้างและรันคอนเทนเนอร์จากอิมเมจที่ชื่อ myapp และทำการเชื่อมต่อพอร์ต 8080 ของโฮสต์กับพอร์ต 8080 ของคอนเทนเนอร์

4. Docker Hub

Docker Hub คือ Docker Registry ที่เป็นบริการออนไลน์สำหรับเก็บและแชร์ Docker Image นักพัฒนาสามารถดึง (pull) Image จาก Docker Hub เพื่อนำมาใช้งานในโปรเจกต์ของตนเองได้ นอกจากนี้ยังสามารถอัปโหลด (push) Image ของตัวเองไปยัง Docker Hub เพื่อแบ่งปันกับชุมชนหรือทีมงานได้

ตัวอย่างคำสั่งในการดึง Image จาก Docker Hub:

docker pull nginx

คำสั่งนี้จะดึง Image ของ NGINX จาก Docker Hub และสามารถนำมารันเป็นคอนเทนเนอร์ได้ทันที

7. Docker Image

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

การสร้าง Docker Image

การสร้าง Docker Image ทำผ่านการเขียน Dockerfile ซึ่งเป็นไฟล์สคริปต์ที่ระบุขั้นตอนการสร้าง Image คำสั่งใน Dockerfile ถูกออกแบบให้มีความง่ายและคล่องตัวในการสร้าง Image และเมื่อ Dockerfile ได้รับการสร้างขึ้นแล้ว นักพัฒนาสามารถสร้าง Image โดยใช้คำสั่ง docker build ได้ทันที

ตัวอย่างการสร้าง Docker Image:

docker build -t myapp .

คำสั่งนี้จะสร้าง Image ใหม่ชื่อว่า myapp จาก Dockerfile ที่อยู่ในไดเรกทอรีปัจจุบัน (.)

เลเยอร์ใน Docker Image

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

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

Multi-Stage Build

Docker ยังสนับสนุนการใช้ Multi-Stage Build ซึ่งเป็นการสร้าง Image หลายๆ ขั้นตอนใน Dockerfile เดียวกัน โดยมีเป้าหมายในการลดขนาดของ Image ที่ได้ เนื่องจากบางขั้นตอนอาจไม่จำเป็นต้องถูกรวมเข้ามาใน Image สุดท้าย

ตัวอย่างการใช้ Multi-Stage Build:

dockerfile
# ขั้นตอนที่ 1: Build
FROM node:14 AS builder
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build


# ขั้นตอนที่ 2: Production
FROM nginx:alpine
COPY --from=builder /usr/src/app/dist /usr/share/nginx/html

ในตัวอย่างนี้ ขั้นตอนแรกใช้ Node.js เพื่อ build แอปพลิเคชัน แต่ Image สุดท้ายจะใช้แค่ผลลัพธ์จากการ build โดยไม่รวมเครื่องมือหรือไฟล์ที่ไม่จำเป็น

8. Docker Container

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

การสร้างและรัน Docker Container

เมื่อนักพัฒนามี Docker Image พร้อมแล้ว สามารถใช้คำสั่ง docker run เพื่อสร้างและรันคอนเทนเนอร์จาก Image ดังกล่าว

ตัวอย่างคำสั่ง:

docker run -d -p 8080:80 --name webserver nginx

คำสั่งนี้จะสร้างคอนเทนเนอร์จาก Image ของ NGINX และเปิดพอร์ต 8080 ของโฮสต์ เพื่อให้เข้าถึง NGINX ผ่านเว็บเบราว์เซอร์ได้ โดยคอนเทนเนอร์นี้จะทำงานอยู่เบื้องหลัง (-d)

การจัดการคอนเทนเนอร์

หลังจากรันคอนเทนเนอร์ นักพัฒนาสามารถจัดการคอนเทนเนอร์เหล่านี้ได้ง่ายๆ ผ่านคำสั่งต่างๆ เช่น:

  • ตรวจสอบคอนเทนเนอร์ที่รันอยู่:

    docker ps

    คำสั่งนี้จะแสดงรายชื่อคอนเทนเนอร์ที่กำลังรันอยู่ในระบบ พร้อมข้อมูลต่างๆ เช่น พอร์ตที่ถูกแมป และสถานะของคอนเทนเนอร์

  • หยุดคอนเทนเนอร์:

    docker stop webserver
  • ลบคอนเทนเนอร์:

    docker rm webserver

การเชื่อมต่อระหว่างคอนเทนเนอร์

Docker มีฟีเจอร์ที่ช่วยให้คอนเทนเนอร์หลายตัวสามารถสื่อสารกันได้ผ่านเครือข่ายภายใน Docker โดยนักพัฒนาสามารถสร้างเครือข่ายภายใน (Internal Network) เพื่อให้คอนเทนเนอร์สื่อสารกันได้โดยไม่ต้องเปิดพอร์ตสู่ภายนอก

ตัวอย่างการสร้างเครือข่ายภายใน:

docker network create mynetwork
docker run -d --name db --network mynetwork postgres
docker run -d --name app --network mynetwork myapp

ในตัวอย่างนี้ คอนเทนเนอร์ app และ db จะสามารถสื่อสารกันผ่านเครือข่าย mynetwork โดยไม่ต้องเปิดพอร์ตใดๆ สู่ภายนอก

9. Docker Compose

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

Docker Compose ทำงานผ่านไฟล์ที่เรียกว่า docker-compose.yml ซึ่งเป็นไฟล์คอนฟิกที่ระบุว่าคอนเทนเนอร์แต่ละตัวต้องทำงานอย่างไร, มีการเชื่อมต่อเครือข่ายอย่างไร, และต้องใช้ทรัพยากรอะไรบ้าง

ตัวอย่างไฟล์ docker-compose.yml:

yaml
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: example

ไฟล์นี้จะกำหนดการสร้างคอนเทนเนอร์สองตัว ได้แก่ web (NGINX) และ db (Postgres) โดยที่คอนเทนเนอร์ทั้งสองจะทำงานในเครือข่ายเดียวกัน และสามารถสื่อสารกันได้โดยอัตโนมัติ

การใช้งาน Docker Compose:

  • สร้างและรันคอนเทนเนอร์ทั้งหมด:

    docker-compose up
  • หยุดและลบคอนเทนเนอร์ทั้งหมด:

    docker-compose down

Docker Compose ช่วยให้การจัดการหลายคอนเทนเนอร์ในแอปพลิเคชันขนาดใหญ่ทำได้ง่ายขึ้น ทั้งการรันคอนเทนเนอร์พร้อมกัน การเชื่อมต่อเครือข่ายภายใน และการจัดการทรัพยากรระหว่างคอนเทนเนอร์

10. Docker Swarm

Docker Swarm เป็นฟีเจอร์ของ Docker ที่ช่วยในการจัดการคอนเทนเนอร์หลายตัวในหลายๆ โหนด (Nodes) หรือเซิร์ฟเวอร์ โดยการทำงานในรูปแบบของ คลัสเตอร์ (Cluster)

ใน Swarm Cluster โหนดต่างๆ จะแบ่งเป็นสองประเภท:

  • Manager Node: โหนดที่ทำหน้าที่ควบคุมและจัดการการทำงานของโหนดอื่นๆ ในคลัสเตอร์
  • Worker Node: โหนดที่ทำหน้าที่รันคอนเทนเนอร์ตามคำสั่งที่ได้รับจาก Manager Node

Docker Swarm มีความสามารถในการทำ Load Balancing โดยอัตโนมัติ และสามารถปรับขนาด (Scale) จำนวนคอนเทนเนอร์ขึ้นหรือลงได้ตามความต้องการของระบบ

วิธีการตั้งค่า Docker Swarm:

  1. เปิดใช้งาน Swarm บน Manager Node:

    docker swarm init
  2. เพิ่ม Worker Node เข้าคลัสเตอร์:

    docker swarm join --token <TOKEN> <MANAGER-IP>:2377
  3. การสร้างบริการ (Service) บน Swarm:

    docker service create --name web -p 80:80 nginx

การขยายขนาดบริการ:

docker service scale web=5

คำสั่งนี้จะเพิ่มจำนวนคอนเทนเนอร์ web จาก 1 เป็น 5 คอนเทนเนอร์ โดย Docker Swarm จะจัดการการกระจายโหลดของคอนเทนเนอร์โดยอัตโนมัติ

11. วิธีการติดตั้งและเริ่มต้นใช้งาน Docker

การติดตั้ง Docker สามารถทำได้ง่ายในหลายระบบปฏิบัติการ โดยมีขั้นตอนพื้นฐานดังนี้:

การติดตั้งบน Ubuntu:

  1. อัปเดตแพ็กเกจ:

    sudo apt update
  2. ติดตั้งแพ็กเกจที่จำเป็น:

    sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. เพิ่ม GPG key สำหรับ Docker repository:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. เพิ่ม Docker repository:

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  5. ติดตั้ง Docker:

    sudo apt update
    sudo apt install docker-ce
  6. ตรวจสอบการติดตั้ง:

    sudo docker --version
  7. เริ่มต้นใช้งาน Docker:

    sudo docker run hello-world

คำสั่งนี้จะดึง Docker Image ชื่อ hello-world และรันคอนเทนเนอร์เพื่อแสดงข้อความต้อนรับ

การติดตั้งบน Windows และ macOS:

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

12. การรักษาความปลอดภัยใน Docker

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

  • การรันคอนเทนเนอร์แบบสิทธิ์จำกัด: โดยปกติคอนเทนเนอร์จะรันด้วยสิทธิ์ root ภายในระบบปฏิบัติการ ดังนั้นควรหลีกเลี่ยงการรันคอนเทนเนอร์ด้วยสิทธิ์ root เพื่อป้องกันการโจมตีจากภายในคอนเทนเนอร์ไปยังโฮสต์

    docker run -u 1000:1000 myapp
  • การตั้งค่าความปลอดภัยของเครือข่าย: ควรใช้เครือข่ายแบบ private network ภายใน Docker เพื่อให้คอนเทนเนอร์สื่อสารกันได้เฉพาะในเครือข่ายภายในเท่านั้น และเปิดพอร์ตภายนอกเฉพาะที่จำเป็น

  • การใช้ Image ที่ปลอดภัย: นักพัฒนาควรตรวจสอบ Docker Image ก่อนการใช้งานว่าปลอดภัย และมาจากแหล่งที่เชื่อถือได้ เช่น Docker Official Images

  • การอัปเดต Docker Daemon: ควรอัปเดต Docker Daemon และแพตช์ความปลอดภัยของระบบปฏิบัติการอยู่เสมอ เพื่อป้องกันช่องโหว่ที่อาจเกิดขึ้น

13. ข้อดีและข้อเสียของ Docker

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

ข้อดี:

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

ข้อเสีย:

  • ความซับซ้อนในการจัดการ: การจัดการ Docker ในระบบขนาดใหญ่โดยไม่มีเครื่องมือ Orchestration อาจซับซ้อน
  • ความปลอดภัย: การรันคอนเทนเนอร์ด้วยสิทธิ์ root ในระบบปฏิบัติการโฮสต์อาจเกิดปัญหาด้านความปลอดภัยหากไม่ระมัดระวัง
  • การสนับสนุนบน Windows: Docker ทำงานได้ดีบน Linux แต่มีข้อจำกัดบางประการเมื่อใช้งานบน Windows เนื่องจากการรันคอนเทนเนอร์บน Windows ต้องใช้เลเยอร์เพิ่มเติม

14. บทสรุป

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

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

ต้องการความช่วยเหลือ ติดต่อเรา

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

สนใจติดต่อ AskMe ได้ที่

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

ติดต่อเราได้ที่

Related Posts