Docker คืออะไร ? แนะนำวิธีใช้งานเบื้องต้น
Docker คือเครื่องมือ virtualization ที่มีความยืดหยุ่นสูง, lightweight และง่ายต่อการใช้งาน เหมาะกับ developer ที่ต้องการสร้าง environment เสมือนจริง ปัจจุบัน Docker ได้รับความนิยมสูงมาก ผู้ให้บริการ Cloud หลายเจ้าก็สามารถนำ Docker ไปใช้ได้ โลโก้ปลาวาฬแบกตู้คอนเทนเนอร์ ก็หมายถึง Docker ที่ขับเคลื่อน environment ต่างๆ ที่แพ็คสำเร็จไว้แล้วนั่นเอง
Container
Docker Container หมายถึงเครื่องเสมือน ซึ่งมีความใกล้เคียง Virtual Machine (VM) แบบที่เราคุ้นเคยกันอยู่มาก แต่ docker ถูกออกแบบมาให้จำลอง environment เฉพาะที่เราสนใจเท่านั้น เช่น Application Server, Build Tools, Website,... หรือจะเป็นการรวมกันหลาย ๆ อย่างก็ทำได้ โดย docker นั้นจะใช้ linux เป็นฐานในการสร้าง environment ต่างๆ ดังนั้นเราจำเป็นต้องอาศัย shell script เป็นหลักImage
Docker Image เป็น template ของ container คือจะประกอบด้วยชุดคำสั่งสำหรับสร้าง environment เริ่มต้น การจะสร้าง container ได้นั้น จำเป็นต้องดึง image มารัน ซึ่งมือใหม่อย่างเราสามารถไปเลือกดึง image จาก image repository มาลองเล่นก่อนได้ เมื่อมากฝีมือแล้วก็สามารถเผยแพร่สู่สาธารณะได้เช่นกัน
------------------------------------------
ก่อนจะเริ่ม ผมอยากบอกเหตุผลของการเข้ามาของ docker ของผมก่อน
- มีโปรแกรมที่อยากลองแต่ขี้เกียจ install ลงเครื่อง รวมถึงพวกโปรแกรมที่เกี่ยวข้องที่ต้องลงก่อนอีก
- สามารถสร้าง-ลบได้แบบไม่ต้องแคร์ว่าจะมีข้อมูลอะไรหายไหม
- หายห่วงเรื่อง version โปรแกรมที่จะไปทับกับของที่มีอยู่แล้ว
ทดลองใช้งาน
- Install Docker
https://www.docker.com/get-started
- Start Docker และใช้คำสั่งผ่าน cmd/ powershell / terminal
ตัวอย่าง 1 : Jenkins
- ดึง image จาก docker hub
docker pull jenkins
- รัน image jenkins โดย mapping port 8080 และ 50000
docker run -p 8080:8080 -p 50000:50000 jenkins
- แค่นี้เราก็สามารถเปิดใช้งาน jenkins ผ่าน web browser ได้เลย
http://localhost:8080
ตัวอย่าง 2 : JShell
- ดึง image แบบระบุ version
docker pull openjdk:11-slim
- รันแบบ interactive เพื่อเรียกใช้ jshell เลย
docker run -it openjdk:11-slim /bin/jshell
*แนะนำ JShell เพิ่มเติม>>
คำสั่ง Docker ยอดฮิต
- ดู container (process) ที่รันอยู่
docker ps
- ดู container ทั้งหมด
docker ps -a
- สร้าง & รัน container จาก image (ถ้าต้องการ expose port ต้องแทรก parameter ที่คำสั่งนี้)
docker run <image_name>
- เข้าสู่ shell ของ container (container ต้องรันอยู่)
docker exec -it <container_id> bash
- start container ที่เคยรัน
docker container start <container_id>
- stop container
docker container stop <container_id>
- ลบ container
docker rm <container_id>
การใช้งาน docker เราไม่อาจรู้ได้ว่า image ที่เราดึงมาใช้นั้นจะตอบโจทย์สิ่งที่เราต้องการครบถ้วนหรือไม่ เช่น ถ้าเราต้องการเอา docker มา build Android บน jenkins ถ้าในกรณีที่ไม่มีคนทำ image ไว้ให้ วิธีกที่ง่ายที่สุดคือเราต้องเข้าไปเขียนคำสั่ง shell script เอง หรือถ้าอยากทำเป็น image พร้อมใช้ แนะนำให้อ่านต่อที่ Dockerfile
การใช้งาน docker อาศัย parent image เสมอ ไม่ว่าจะสร้างด้วยวิธีไหนก็ตาม สำหรับใครที่อยากเห็น base image จริงๆ ให้ดึง scratch มาครับ
docker pull scratch
ตัวอย่างข้างต้นเป็นเพียงใช้งาน docker ในระดับ application เท่านั้น Docker ยังครอบคลุมไปถึงการทำ Storage, Networking ได้ด้วย หรือแม้แต่การทำ Clustering อย่าง Docker Swarm ที่สามารถทำได้ทั้ง remote และ local cluster
------------------------------------------
แถม!! เราสามารถทดลองเล่น Docker บนเว็บได้ http://play-with-docker.com โดยจะเป็นการจำลองเครื่องที่ลง docker ไว้แล้วขึ้นมา เราสามารถลองใช้คำสั่ง docker ผ่านเว็บหรือจะ secure shell (SSH) เข้าไปก็ก่อนก็ได้ ถ้ารันแบบ expose port ก็มี subdomain ให้เข้าถึงได้ง่ายๆ ด้วย (ต้องทำใจนิด เพราะมันค่อนข้างช้า ฮ่าๆๆ แปะไว้เผื่อคนที่ไม่อยากลงในเครื่องตัวเองจริงๆ ก็แล้วกัน)
play-with-docker.com |
------------------------------------------
Cloud & Docker
ปัจจุบันระบบต่างๆ ก็มักถูกแทนที่ด้วย Cloud แทนที่จะซื้อเครื่องจริงๆ มาดูแลเองแล้ว การสร้าง service ต่างๆ บน Cloud เป็นการสร้างเครื่องเสมือน (Virtualization) ทำให้เราสามารถจัดการกับเครื่องได้ง่ายๆ บางเจ้าทำให้เราสามารถเขียน code สำหรับสร้าง Infrastructure ได้ด้วย (Infrastructure-as-a-Code) แต่ยยังไงก็ตาม Cloud แต่ละเจ้าก็มีมาตรฐานเป็นของตัวเองDocker ก็เป็นเครื่องเสมือน (Virtualization) เช่นเดียวกัน แต่เป็นรูปแบบที่ใช้ชื่อว่า "Containerized" ซึ่งหากจะเอาไปใช้บน Cloud ก็ทำได้ DevOps ส่วนใหญ่เลือกที่จะใช้ Docker เพราะนอกจาก Cloud จะรองรับแล้ว ยังเป็นมาตรฐานเดียว ไม่ต้องจำ service ที่ต่างกันของหลายเจ้า
สุดท้าย ไม่ว่าจะเป็น DevOps หรือ Developer ภาษาอะไรก็ตาม การเอา Docker ไปประยุกต์ใช้ได้ ถือว่ามีประโยชน์มากๆ เพราะมันสามารถเอามาใช้ได้ตั้งแต่ระดับทดลองใช้งานไปจนถึงระดับองค์กร แต่เรื่องราวของ Docker ยังไม่จบแต่นี้ ติดตามต่ออีก 2 episode นะครัชช