บทความสั้นๆแนะนำ 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 ไว้ด้วยภาพที่ดูเข้าใจง่าย

Virtual Machines

Containers

แต่ในความเห็นส่วนตัว มันต่างกันที่ระดับของ 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 Hub
  • docker push - upload image จาก local machine ไป Docker Hub

คำสั่งที่เกี่ยวกับ container

  • docker ps - list container.
  • docker rm - remove container
  • docker 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 ซึ่งจะกล่าวในบทความต่อๆไป