ฮัลโหลชาวโลก

แวะมาแปะเนื้อหาไอทีบ้าง หลังจากก่อนหน้านี้เป็นเรื่องจิตวิทยาสักพักนึงเนอะฮะ

ด้วยเนื้องานผม ที่นอกเหนือจากการทำระบบฐานข้อมูลแล้วเนี่ย มันก็มีโค้ดดิ้งด้วยแหละ หลากหลายภาษามาก มีทั้ง Bash, JAVA, Python, NodeJS เลยศึกษาเจ้าเครื่องมือตัวนี้ฮะ

Source: https://www.docker.com/company/newsroom/media-resources

Docker นั่นเอง คิดว่าหลายๆคนคงรู้จักแล้วแหละ แต่สำหรับคนที่ไม่รู้จัก มันคือเครื่องมือตัวนึงที่ให้เราสร้าง environment เสมือนขึ้นมา คล้ายๆ Virtual Machine ฮะแต่ใช้ทรัพยากรเครื่องน้อยกว่าเพราะเน้นใช้งานผ่าน command line ไม่ได้มีหน้าจออะไรให้กด ดังนั้นคนใช้ก็ควรมีทักษะ command line คล่องในระดับนึงนะฮะ

เจ้านี่มันมีดียังไง

ลองจินตนาการภาพว่าเราต้องพัฒนาโปรแกรมภายใต้ dependency เป็นสิบตัวที่ใช้เวลาติดตั้งรวมๆกันก็เป็นวันแล้ว ต้องพัฒนาบนระบบปฏิบัติการ Unix แต่เครื่องเราเป็น windows ต้องหาเครื่องอื่นหรือลง VM จนเครื่องอืด สุดท้ายต้อง deploy production บน unix server สักสามเครื่อง แปลว่าก็ต้องเสียเวลาอีกเป็นวันสำหรับติดตั้ง dependency สิบตัวตะกี้อีกรอบ อืม เหนื่อยเนอะ

ในวันนี้ เราขอนำเสนอเทคโนโลยีที่ช่วยคุณประหยัดเวลาเป็นวันๆ ด้วย Docker ฮะ

Docker เป็นเหมือนกล่องหนึ่งใบที่ข้างในมี Environment พร้อมสำหรับการพัฒนาโปรแกรมที่เราต้องการ มีครบทั้ง dependency และ os ขอแค่เอากล่องนี้มาติดตั้งบนเครื่องเรา เปิดกล่องก็พร้อมใช้งานได้เลย แถมใช้ทรัพยากรเครื่องน้อยกว่า VM อย่างที่พูดไปแล้วฮะ

ใน Docker มีอะไรบ้าง

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

เริ่มต้นติดตั้ง Docker

อันดับแรกเลยนะฮะ เข้าไปที่เว็บ https://hub.docker.com/ แล้วลงทะเบียนก่อน จากนั้น download ตัวโปรแกรมลงมาที่คอมพิวเตอร์ เสร็จแล้วก็กดเปิดโปรแกรมเลยฮะ

หน้าตาประมาณนี้ อยู่ที่ Taskbar

จากนั้นให้เราเปิด Terminal (cmd ถ้าเป็น Windows) แล้วลองพิมพ์ว่า

docker -v

ถ้ามันแสดงเลขเวอร์ชันออกมา แปลว่า เราติดตั้ง Docker สำเร็จแล้วล่ะฮะ

ลองเล่น image สักตัว

แรกเริ่มสุด เรามาลองเล่น “Hello world” image กันนะฮะ

1. โหลด image

เราจะเข้าไปที่ Docker hub ก่อนฮะ ดูว่า image ที่เราต้องการเนี่ย มันดาวน์โหลดยังไง และดูรายละเอียดของ image ด้วยฮะ สำหรับ “Hello world” image จะเป็นลิงก์นี้ฮะ

จากนั้น เราก็จะโหลด image นี้โดยพิมพ์คำสั่งว่า

docker pull hello-world

2. เช็ค image

ตะกี้เราเพิ่งโหลด “Hello world” image มา เราลองมาเช็คว่า image ตัวนี้ยังอยู่ดี ด้วยคำสั่ง

docker images
# or
docker image ls

3. สร้าง container จาก image

ใช้คำสั่งนี้ เพื่อสร้าง container หนึ่งตัวจาก image ฮะ

docker run hello-world

image แต่ละตัว จะให้ผลลัพท์ตอนรันสร้าง container แตกต่างกันฮะ อย่างตัวอย่างเนี่ย มันแค่แสดงข้อความต้อนรับเราเท่านั้นฮะ

ตัวอย่าง image อื่น: Jupyter

บางครั้ง ผมก็ต้องเขียน Python ซึ่งมักจะใช้ Jupyter เนี่ยแหละ วิธีการมีดังนี้ฮะ

1. โหลด image แล้วสร้าง container

# download image
docker pull jupyter/minimal-notebook
# build container + open port 1880 + named "jupyter"
docker run -it -p 8888:8888 – name jupyter jupyter/minimal-notebook

จะเห็นว่า ตอนผมใช้คำสั่ง run มีอะไรต่อท้ายเยอะแยะไปหมด มันคือ options ฮะ ดังนี้

  • -it มาจาก -i (interactive) หมายถึง กำหนดให้สามารถพิมพ์คำสั่งโต้ตอบโปรแกรมใน Terminal ได้ และ -t (pseudo-TTY) หมายถึง ให้แสดงผลจากคำสั่งที่พิมพ์ไปด้วย
  • -p มาจาก --port คือ เชื่อมต่อพอร์ทของ container กับตัวคอมพิวเตอร์ ในเคสนี้ ผมสั่งให้เชื่อมพอร์ท 8888:8888 หมายถึง 8888 ของ Jupyter container ไปยัง 8888 ของคอมพิวเตอร์นี้ฮะ ส่วนเราจะเปิดพอร์ทอะไรของ container นี้ จำเป็นต้องดูเอกสารของ image นั้นๆ ฮะ
  • --name คือ กำหนดชื่อให้กับ container นี้ เวลาเราเปิดใช้คราวหน้าก็พิมพ์ชื่อที่กำหนดได้เลย ถ้าไม่กำหนด มันจะสุ่มชื่อยาวๆมาให้แทนฮะ

options ทั้งหมด สามารถดูได้จาก document ที่ลิงก์นี้ฮะ

2. ใช้งาน container

พอสร้าง Jupyter container เสร็จแล้ว เราก็เข้าไปใช้งานได้ตามลิงก์ที่แสดงใน Terminal ฮะ

3. ปิด container แล้วรันใหม่อีกครั้ง

ถ้าตอนนี้ยังเขียนโค้ดไม่เสร็จ แล้วต้องทำใหม่อีกในวันถัดไป เราอาจจะหยุด container ไว้ก่อน

docker stop jupyter

พอมีเวลาหยิบมาทำ ก็ต้อง start container และครั้งนี้ ก็ต้องดู URL ใหม่อีกทีฮะ

docker start jupyter && docker attach jupyter

Frequently used commands

  • เช็คพอร์ทกันก่อน ว่าเครื่องเรานั้นไม่ได้ใช้พอร์ท 8888
# cmd on Windows
netstat -na | find "8888"
# terminal on Unix
netstat -na | grep "8888
  • เรียกดู images
docker images
docker image ls
  • ลบ image
# remove one image
docker image rm {image_id}
# remove unused images
docker images prune
# remove all images
docker image rm $(docker images -q)
  • รัน container จาก image
docker run [-i=interaction] [-t=pseudo-tty] [-d=background] [-p=port {container_port}:{host_port}] [--name {name}] [-v=mount_volume {host_path}:{container_path}] [--link=connect_containers {container_name_or_id}:{link_alias} image [entry_point] 
  • เปิด/ปิดการใช้งาน container
docker start {container_name}
docker stop {container_name}
docker restart {container_name}
  • รันคำสั่งไปยัง container ที่สร้างมาก่อนหน้านี้ (container ต้องเปิดอยู่ก่อนแล้ว)
# make sure the container is started
docker restart {container_name}
# execute command
docker exec [-i=interaction] [-t=pseudo-tty] [-u=user {username}] container_name {entry_point}
  • แสดงหน้า console ของ container หลังจากรัน (container ต้องเปิดอยู่ก่อนแล้ว)
docker attach {container_name}
  • ลบ container
# remove one container
docker rm {container_name}
# remove all containers
docker rm $(docker ps -a -q)

อยากอ่านเต็มๆ ไปดูได้ที่ลิงก์นี้ฮะ

เอาไปใช้งานจริง

ตอนที่ผมใช้งานจริง ก็ติดตั้ง docker image แบบเดียวกับตอน develop แล้ว migrate source code ผ่าน git ฮะ

โอกาสหน้าจะมาเล่าถึงเรื่องนี้นะฮะ