Home | Back
Docker ระบบ OS-Level Virtualization บนระบบ Linux
Wednesday, 3 September 2014
ในการใช้งานระบบ Virtualization นั้นจะมีหลายเทคโนโลยีให้เลือกใช้ เช่น VMWare Xen KVM OpenVZ เป็นต้น ซึ่งระบบ Vitualization ที่ผมเคยแนะนำไปส่วนใหญ่จะเป็นแบบ Full Virtualization คือการจำลองทั้งระบบคอมพิวเตอร์ แต่มีระบบ Virtualization แบบที่น่าสนใจอยู่แบบนึงคือ OS-Level Virtualization ซึ่งเป็นการจำลองเครื่องโดยจำลองแค่บางส่วน แต่ในส่วนของ Kernel จะใช้ร่วมกับ Host นั่นเอง ซึ่งระบบนี้จะมี overhead ต่ำมาก กินทรัพยากรน้อย แต่ข้อเสียคือจะใช้ได้แต่กับระบบปฏิบัติการเดียวกับ Host เท่านั้น เช่น Host เป็น Linux ทำให้สร้าง Guest ได้ที่เป็น Linux เท่านั้นแต่อาจจะมี Distro ต่างกันไปได้ครับ โดยเทคโนโลยีที่ผมจะแนะนำครั้งนี้คือ Docker ครับ และจะทดลองบน Arch Linux ครับ
1. ลง package ที่เกี่ยวข้อง
ขั้นแรกเราก็ต้องลง package ที่เกี่ยวข้องดังนี้ครับ
$ pacman -S docker
2. start ระบบ daemon ของ docker
ขั้นตอนต่อมาก่อนใช้งานเราก็ต้องทำการ start ระบบ daemon ของ docker ให้ทำงานก่อนใช้งานดังนี้ครับ
$ systemctl start docker
ถ้าหากต้องการให้ docker daemon ทำงานทุกครั้งเริ่มระบบให้ทำดังนี้ครับ
$ systemctl enable docker
3. ดึง Image ของ OS ที่เราต้องการ
การจะใช้งาน docker ได้ เราต้องมี Image ของ OS ที่เราต้องการก่อน โดยหากต้องการดึง Image OS ของ Archlinux ทำได้ดังนี้ครับ
$ docker pull base/archlinux Pulling repository base/archlinux ea234cde99e6: Download complete 56c61f5c2920: Download complete dce0559daa1b: Download complete 511136ea3c5a: Download complete 23255e5de05e: Download complete b7d6e7c1e21a: Download complete 9b0516337e5a: Download complete
หากต้องการใช้ Ubuntu ก็สามารถดึงได้ดังนี้ครับ
$ docker pull ubuntu Pulling repository ubuntu 195eb90b5349: Download complete c5881f11ded9: Download complete 822a01ae9a15: Download complete 463ff6be4238: Download complete 3db9c44f4520: Download complete 75204fdb260b: Download complete c4ff7513909d: Download complete 511136ea3c5a: Download complete 3af9d794ad07: Download complete b7c6da90134e: Download complete 47dd6d11a49f: Download complete 6cfa4d1f33fb: Download complete af82eb377801: Download complete f33dbb8bc20e: Download complete 92ac38e49c3e: Download complete aa822e26d727: Download complete 31db3b10873e: Download complete 1c9383292a8f: Download complete 9942dd43ff21: Download complete d92c3c92fa73: Download complete 0ea0d582fd90: Download complete cc58e55aa5a5: Download complete 93c381d2c255: Download complete a5208e800234: Download complete 9fccf650672f: Download complete 1186c90e2e28: Download complete f6a1afb93adb: Download complete bac448df371d: Download complete dfaad36d8984: Download complete 5796a7edb16b: Download complete f127542f0b61: Download complete fae16849ebe2: Download complete 0f4aac48388f: Download complete 209ea56fda6d: Download complete
หากเราต้องการตรวจสอบว่าใน Host ของเรามี Image อะไรให้ใช้ได้บ้างสามารถทำได้ดังนี้ครับ
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu trusty c4ff7513909d 3 weeks ago 213 MB ubuntu 14.04 c4ff7513909d 3 weeks ago 213 MB ubuntu latest c4ff7513909d 3 weeks ago 213 MB ubuntu 14.04.1 c4ff7513909d 3 weeks ago 213 MB ubuntu 14.10 75204fdb260b 3 weeks ago 226.4 MB ubuntu utopic 75204fdb260b 3 weeks ago 226.4 MB ubuntu 12.04 822a01ae9a15 3 weeks ago 108 MB ubuntu 12.04.5 822a01ae9a15 3 weeks ago 108 MB ubuntu precise 822a01ae9a15 3 weeks ago 108 MB base/archlinux 2014.07.03 ea234cde99e6 6 weeks ago 282.9 MB base/archlinux 2014.04.01 56c61f5c2920 6 weeks ago 293.3 MB base/archlinux latest dce0559daa1b 6 weeks ago 282.9 MB ubuntu quantal c5881f11ded9 10 weeks ago 172.1 MB ubuntu 12.10 c5881f11ded9 10 weeks ago 172.1 MB ubuntu 13.04 463ff6be4238 10 weeks ago 169.4 MB ubuntu raring 463ff6be4238 10 weeks ago 169.4 MB ubuntu 13.10 195eb90b5349 10 weeks ago 184.6 MB ubuntu saucy 195eb90b5349 10 weeks ago 184.6 MB ubuntu lucid 3db9c44f4520 4 months ago 183 MB ubuntu 10.04 3db9c44f4520 4 months ago 183 MB
4. สร้าง Container เพื่อใช้งาน
เมื่อเรามี Image ของ OS ที่เราต้องการแล้ว เราจะสามารถสร้างระบบจำลองได้ โดยระบบจำลองที่สร้างจาก Image นั้น เราจะเรียกว่า Container ครับ โดยเราจะทำการทดลองสร้าง Container แบบ interactive กันดูดังนี้ครับ
$ docker run -i -t --name test --hostname test -p 2222:22 base/archlinux:latest /bin/bash [root@test /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.0 14124 2940 ? Ss 04:37 0:00 /bin/bash root 7 0.0 0.0 24932 2304 ? R+ 04:37 0:00 ps aux [root@test /]# exit exit
จะเห็นว่าจะเข้าสู่ prompt เพื่อรับคำสั่ง ซึ่งขณะนี้เป็นการรับคำสั่งจาก Container ที่เราสร้างมานั่นเอง และจะมีพารามิเตอร์ที่เกี่ยวข้องคือ
run เป็นคำสั่งของ docker เพื่อทำการสร้าง Container
-i หมายถึงทำงานแบบ interactive
-t หมายถึงให้สร้าง psudo terminal ขึ้นมารับคำสั่งซึ่งมักจะใช้คู่กับ -i ครับ
–name test หมายถึงตั้งชื่อ Container ของเราว่า test ครับ
–hostname หมายถึงตั้งชื่อ hostname ของเราว่า test ครับ
–p 2222:22 คือการ map port ของ Host หมายเลข 2222 ให้เข้าไปยัง port 22 ของ Guest ครับ
base/archlinux:latest หมายถึงชื่อของ image ที่เราใช้
และสุดท้าย /bin/bash คือคำสั่งที่เรียกใช้งานคือ bash shell นั่นเองครับ
ในขั้นนี้เราสามารถลง package ต่าง ๆ ที่เราต้องการลงใน Container ได้ตามปกติครับ เช่น อยากลงเวบ server หรือแอปต่าง ๆ เป็นต้นครับ และเมื่อเราพิมพ์ exit ก็จะออกจาก Container และจบการทำงานของ Container ครับ และเมื่อเรากลับสู่ Host เราสามารถดู รายการ Container ที่เราสร้างไว้ได้ดังนี้ครับ
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4a4f9f16be7a base/archlinux:latest "/bin/bash" 4 minutes ago Exited (127) 2 seconds ago test
พารามิเตอร์ -a หมายถึงให้แสดง Container ทุกตัว รวมทั้งตัวที่หยุดทำงานแล้ว โดยปกติคำสั่ง docker ps จะแสดงเฉพาะ Container ที่กำลังทำงานอยู่เท่านั้น เมื่อ Container เราหยุดทำงานแลัว เราสามารถทำการ start ให้ Container เราทำงานอีกครั้งได้ดังนี้ครับ
$ docker start test test
ตอนนี้เราสามารถดูว่า Container เราทำงานอยู่รึป่าวดังนี้
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4a4f9f16be7a base/archlinux:latest "/bin/bash" About a minute ago Up About a minute 0.0.0.0:2224->22/tcp test
ในขณะนี้ Container ที่ชื่อ test กำลังทำงานอยู่ แต่ไม่ได้อยู่ในโหมด interactive ซึ่งเราสามารถดูหน้า console ของตัว Container ได้ดังนี้ครับ
$ docker logs test [root@test /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.0 14124 2940 ? Ss 04:37 0:00 /bin/bash root 7 0.0 0.0 24932 2304 ? R+ 04:37 0:00 ps aux [root@test /]# exit exit
หากเราต้องการเข้าควบคุมหน้า console เราสามารถทำได้ดังนี้ครับ
$ docker attach test
เราก็สามารถเข้าควบคุมหน้า console ได้ทันทีครับ และหากเราต้องการลบ Container ทิ้ง เราต้อง stop Container ตัวนั้นก่อนแล้วจึงลบด้วยคำสั่ง docker rm ดังนี้ครับ
$ docker stop test test $ docker rm test test
5. การ Commit Container เพื่อสร้างเป็น Image
เมื่อเราสร้าง Container แล้ว หากเราต้องการบันทึกเป็น Image เราสามารถทำการ Commit Container ให้เป็น Image ได้ดังนี้ครับ
$ docker commit test test:v1 97d33c7b13b9ece1d784a9b1bc5997c4d4208920b72874ea75b5e21f9ddfad6e
จากคำสั่งข้างต้นเป็นการ Commit Container ที่ชื่อ test ไปเป็น Image ชื่อ test และมี tag ชื่อ v1 ครับ และหากต้องการลบ Image ทิ้งเราสามารถทำได้ดังนี้ครับ
$ docker rmi test:v1 Untagged: test:v1 Deleted: 97d33c7b13b9ece1d784a9b1bc5997c4d4208920b72874ea75b5e21f9ddfad6e
Image ที่ชื่อ test และมี tag เป็น v1 ก็จะลบออกไปจาก Host แล้วครับ บทความนี้เป็นเพียงจุดเริ่มต้นนะครับ ยังมีคำสั่งที่เกี่ยวข้องอีกเยอะครับ สามารถหาข้อมูลเพิ่มเติมได้ที่ https://www.docker.com/ ครับ