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/ ครับ



Home | Back