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 ประเภทหลัก ดังนี้:
Docker Personal
เหมาะสำหรับผู้ใช้ทั่วไปหรือนักพัฒนาเดี่ยวที่ต้องการใช้ Docker ในการสร้างและทดสอบแอปพลิเคชัน บริการนี้เป็นแบบฟรีและเหมาะสำหรับการใช้งานในโปรเจกต์ส่วนตัวหรือการเรียนรู้Docker Pro
Docker Pro เหมาะสำหรับนักพัฒนามืออาชีพที่ต้องการเครื่องมือเพิ่มเติม เช่น ปริมาณการดึงภาพ (Image pulls) มากขึ้น การสนับสนุนขั้นสูง รวมถึงฟีเจอร์ความปลอดภัยที่เพิ่มขึ้นDocker Team
ออกแบบมาสำหรับทีมงานขนาดเล็กถึงขนาดกลางที่ต้องการการทำงานร่วมกันในโปรเจกต์เดียวกัน มีฟีเจอร์การจัดการทีม การแชร์ภาพ Docker และการจัดการคอนเทนเนอร์อย่างมีประสิทธิภาพ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:
- นักพัฒนาสร้าง Dockerfile ซึ่งเป็นสคริปต์ที่กำหนดขั้นตอนในการสร้าง Docker Image เช่น การติดตั้งไลบรารี การคัดลอกโค้ด และการตั้งค่าที่จำเป็น
- นักพัฒนาสร้าง Docker Image จาก Dockerfile โดยใช้คำสั่ง
docker build
- เมื่อสร้าง Docker Image แล้ว สามารถรันคอนเทนเนอร์จาก Docker Image นั้นได้โดยใช้คำสั่ง
docker run
- Docker จะจัดการการรันแอปพลิเคชันในคอนเทนเนอร์ รวมถึงการตั้งค่าการเข้าถึงเครือข่ายและการจัดการทรัพยากร
Docker ทำให้การทดสอบแอปพลิเคชันในสภาพแวดล้อมต่างๆ ทำได้ง่ายขึ้นและสม่ำเสมอ ไม่ว่าจะเป็นการรันบนเครื่องพัฒนาของนักพัฒนาเองหรือในระบบเซิร์ฟเวอร์จริง
5. Docker vs Virtual Machine (VM): ความแตกต่างทางเทคนิค
Docker และ Virtual Machine (VM) เป็นเทคโนโลยีที่ใช้ในการแยกสภาพแวดล้อมการทำงาน แต่ทั้งสองมีหลักการทำงานที่แตกต่างกันอย่างสิ้นเชิง
Docker:
- ใช้เคอร์เนลของระบบปฏิบัติการโฮสต์ ทำให้ไม่ต้องจำลองระบบปฏิบัติการใหม่ทั้งหมด
- คอนเทนเนอร์มีขนาดเล็กและสามารถเริ่มต้นได้รวดเร็ว
- ใช้ทรัพยากรของระบบปฏิบัติการโฮสต์น้อยกว่า
- เหมาะสำหรับการพัฒนาแอปพลิเคชันแบบไมโครเซอร์วิส (Microservices) ที่สามารถแยกแอปพลิเคชันเป็นส่วนๆ และรันในคอนเทนเนอร์แยกกัน
Virtual Machine (VM):
- จำลองระบบปฏิบัติการทั้งหมด รวมถึงเคอร์เนล ทำให้ต้องใช้ทรัพยากรมากกว่า
- ขนาดไฟล์ VM ใหญ่และใช้เวลาในการเริ่มต้นนานกว่า
- เหมาะสำหรับการรันแอปพลิเคชันขนาดใหญ่หรือการจำลองระบบที่ต้องการระบบปฏิบัติการแยกกัน
คุณสมบัติ | Docker | Virtual 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.jsRUN
: รันคำสั่งใน Image เช่น การติดตั้งแพ็คเกจCOPY
/ADD
: คัดลอกไฟล์จากโฮสต์เข้าสู่ ImageCMD
/ENTRYPOINT
: กำหนดคำสั่งที่รันเมื่อคอนเทนเนอร์เริ่มทำงาน
ตัวอย่าง Dockerfile สำหรับแอปพลิเคชัน Node.js:
# ใช้ Node.js เวอร์ชัน 14 เป็น Image พื้นฐาน
FROM node:14
# สร้างไดเรกทอรีแอป
# คัดลอกไฟล์ 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:
# ขั้นตอนที่ 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
:
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:
เปิดใช้งาน Swarm บน Manager Node:
docker swarm init
เพิ่ม Worker Node เข้าคลัสเตอร์:
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
การสร้างบริการ (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:
อัปเดตแพ็กเกจ:
sudo apt update
ติดตั้งแพ็กเกจที่จำเป็น:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
เพิ่ม GPG key สำหรับ Docker repository:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
เพิ่ม Docker repository:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
ติดตั้ง Docker:
sudo apt update
sudo apt install docker-ce
ตรวจสอบการติดตั้ง:
sudo docker --version
เริ่มต้นใช้งาน 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 ในประเทศไทย สามารถให้คำแนะนำและช่วยเหลือในการเลือกเทคโนโลยีที่เหมาะกับองค์กรของคุณ รวมถึงการติดตั้งและให้บริการหลังการขาย
ติดต่อเราได้ที่
- กรุงเทพฯ โทร 02-245-1335-7
- เชียงใหม่ โทร 053-858-186
- ขอนแก่น โทร 096-415-4445
- ระยอง โทร 033-218-235
- Email: sales@askme.co.th
- Line: @askme