บทความสั้นๆแนะนำ Docker
Note: download related slide deck from OneDrive.
บทความนี้เป็นหนึ่งในหัวข้อ Kubernetes on Google Cloud ประกอบไปด้วย แนะนำ Docker Compose Docker Swarm และ Kubernetes
Docker เป็น OS-level virtualization technology มีรากฐานมาจากคำสั่ง chroot
ของ Unix system ตั้งแต่ปี 1979.
ประวัติความเป็นมา
ความแตกต่างเทียบกับ VM
เวป Docker อธิบายความแตกต่างระหว่าง Container technology กับ VM ไว้ด้วยภาพที่ดูเข้าใจง่าย
แต่ในความเห็นส่วนตัว มันต่างกันที่ระดับของ virtualization ถ้าเป็น Virtual Machine นี่เป็นเหมือน hardware emulator ในขณะที่ Container technology นั้น virtualize เฉพาะ resources ต่างๆของ OS e.g. Socket, Disk, Process, Users.
การใช้งาน
จะเห็นได้ว่า Docker based บน Linux tech แต่ก็มี Docker เองก็ออก tool สำหรับ run Docker บน Windows และ Mac ได้ เดิมใช้ชื่อว่า Docker toolbox (ล่าสุด ปี 2016 Docker ออก Docker Native ที่ทำให้การใช้งานราบรื่นขึ้น) ร่วมกับ tool ที่เรียกว่า Docker Machine เพื่อใช้สร้าง docker environment บน VM อย่างราบรื่น แต่เนื่องจากเป็น VM ดังนั้นสำหรับ Windows/Mac จึงต้องแน่ใจว่าเครื่องสามารถรัน Virtual Machine ได้ด้วย (e.g. CPU ควร support Virtualization mode)
อย่างไรก็ตาม ณ ปัจจุบัน (Nov 2016) performance ของ Docker Native ก็ยังไม่เทียบกับ docker ที่ run ใน Linux และมีปัญหามากกว่า (etc. ความไม่ compatible ของ users, permissions)
Installation
Docker มี toolset ให้ในแต่ละ platform ซึ่งสามารถไปดูได้ใน https://www.docker.com/products/overview โดยทั่วไป เมื่อลง toolset แล้ว จะได้ command line ชื่อ docker
มาใช้
docker
เป็น general tool สำหรับทำงานกับ Docker
พื้นฐาน Docker
พื้นฐาน Docker แบ่งเป็น Container กับ Image โดยที่ Docker Image ประกอบด้วย Linux OS image รวมกับ Application package ซึ่งเปรียบได้กับ installer package
เราสามารถสร้าง Docker Image เหล่านี้ได้เองโดยการเขียนและ build กับ Dockerfile
แต่ถ้าจะต้อง build ทุกครั้งเวลาจะใช้งานก็จะไม่สะดวก ดังนั้นจึงมี Docker Repository (เช่น http://hub.docker.com ) เพื่อใช้เก็บ image ที่ built แล้วและใช้งานได้สะดวกรวดเร็วขึ้น
Docker Image มี concept ของการ inherit เวลาที่เราสร้าง Image เราไม่จำเป็นจะต้อง build ใหม่ทั้งหมด เราสามารถ inherit จาก image ที่มีอยู่ (จาก local repository หรือจาก Docker Hub) แล้วต่อยอดโดยลง software components เพิ่มได้
เวลาใช้งาน Docker Image ทำโดยการสั่งให้ docker load image แล้วเอาไปทำเป็น container โดย container จะมี network address และ port ของตนเอง มี root directory ของตนเอง และสามารถจำกัด RAM และ resources อื่นๆเพิ่มเติมได้โดยผ่าน parameter ที่ใช้ในการ run
Resources ที่ใช้กับ Container
เมื่อใช้ Docker สร้าง Container resource ที่เราสามารถ set ได้และใช้บ่อยมีดังนี้
- Container Name
- Network port mapping
- Storage mapping
- Environment variables
- Container links
คำสั่งที่เกี่ยวกับ Image
docker images
- list Docker Image ทั้งหมดที่อยู่ในเครื่องdocker rmi
- ลบ Docker Image ที่ไม่ต้องการทิ้งจากเครื่องdocker build
- สร้าง Docker Image จากDockerfile
คำสั่งที่เกี่ยวกับ repository
docker pull
- download image จาก Docker Hub (default)docker login
- login into Docker Hubdocker push
- upload image จาก local machine ไป Docker Hub
คำสั่งที่เกี่ยวกับ container
docker ps
- list container.docker rm
- remove containerdocker run
- create a container.docker stop
- stop a container.docker start
- start an existing container.docker restart
- restart a container.docker inspect
- ดูรายละเอียดของ container
ประโยชน์
ประโยชน์หลักๆของ Docker คือการ package application ของเราให้เป็น Docker Image แล้วนำสามารถนำไป run ใน docker host ที่ไหนก็ได้ โดย Docker ทำให้ configuration ของ Network กับ persistent storage เป็นเรื่องง่ายขึ้น
ในทางปฏิบัติส่วนใหญ่เราไม่ได้ใช้ container เพียงตัวเดียว แต่ใช้ container หลายตัวทำงานร่วมกันเพื่อให้เกิดผลลัพธ์ดังกล่าว อย่างเช่น web application ส่วนใหญ่ ก็จะประกอบไปด้วย container ที่เป็น web server และ container ที่เป็น database เป็นต้น และในตัวอย่างนี้ ถ้าจะไป deploy ที่ไหน ก็เพียง run 2 container ใน docker network เดียวกัน และตั้งชื่อให้ container รู้จักกัน ก็จะทำให้ web app ของเรา run ขึ้นมาพร้อมใช้งานได้ทันที (แน่นอนว่า application เองก็ควรจะต้องออกแบบให้ configure ชื่อ server อะไรง่ายขึ้นด้วย เช่น ควรใช้ Environment Variable ในการผ่านค่า configuration จาก Docker engine เอง)
อย่างไรก็ตาม การใช้ Docker เพียงอย่างเดียวก็ยังมีความยุ่งยากในการ configure อยู่บ้าง ดังนั้นจึงมีเครื่องมือที่ทำให้ container ทำงานประสานกัน และ configure ได้ไม่ลำบาก (แทนที่จะมานั่งเขียน script) เอง เรียกว่า Docker Orchestration Tools (เช่น Kubernetes, Docker swarm, Rancher) ซึ่งจะกล่าวในบทความต่อๆไป