More Related Content
More from Bhuridech Sudsee (20)
18 ฝ่ามือพิชิต docker
- 2. “Dockerหนะหรอ? กอนจะกลาวถึง Docker นั้นตองคุยไปถึงเรื่อง Container
เสียกอนวามีความเกี่ยวของกันยังไง” ปรมาจารยอูเกวยกลาวพลางคํ้าไมเทา
“Container บางทีเราก็เรียกมันวา OS-Level Virtualization เพราะวามันใฃ Kernel
รวมกับตัวระบบปฏิบัติการหลักของเรา มีมานานมากแลวถาจะนับ Chroot เปน OS-Level Virtualization
แลวละก็ มันก็มีมาตั้งแต ค.ศ. 1982 พูนแหละ แตถาเปน Container รุนใหมๆ ก็มีมาราวสิบปมานี่แหละ
ไอพวก OpenVZ, Solaris Zone หรือพวก LInux Container (LXC) แมวามันจะไมปลอดภัยเทากับตัว
Hypervisor แตมันก็มีขอดีคือลดพื้นที่โจมตีเพราะมันไมตองมีพวก Guest OS
เรื่องซีเคียวนี่เถียงกันไดอีกนาน”
“แลว Kernel มันคืออะไรหละทานอาจารย” อาโปกลาวถาม ขณะที่ปรมาจารยอูเกวยหันหลังอยู
“Kernel คือโปรแกรมที่ทําหนาที่เปนแกนกลางของระบบปฏิบัติการของเรา
สวนนี้คือหัวใจในการติดตอกันระหวางฃิ้นสวนภายใน OS โดยปกติแลวโปรแกรมเราจะไมไดสามารถคุยกับ
RAM หรือ Harddisk หรืออุปกรณคอมพตาง ๆ ไดตรง แตจะคุยผาน Kernel ปองกันโปรแกรมกาก ๆ
ที่พวกเจาสรางจะเขาไปทําใหระบบไฟฟามันซอตหนะซิ”
“แลว Chroot หละทานอาจารย”
“Chroot เปนการขังโปรแกรมใหมองเห็นไดเรกทอรี่ (ที่เรียกจนติดปากวาโฟลเดอรนั่นแหละ)
ที่กําหนดใหเปนเปนรูทไดเรกทอรี่ของโปรแกรททําใหมันวิ่งไปที่ไดเรกทอรี่อื่นไมได เพราะในระบบ Unix
รูทไดเรกทอรี่มันอยูสูงสุดแลวไงหละ”
“เอาเทานี้กอนเดี๋ยวธาตุไฟเขาแทรก” ปรมาจารยอูเกวยกลาว พลางเลาตอ
“Docker เปนทั้งชื่อซอฟตแวรและก็ชื่อบริษัทดวย แตกอน Solomon Hykes เปนเจาของ dotCloud
บริษัททําเกี่ยวกับเรื่อง PaaS ทําไปทํามาทาทางจะไปไมรอดเพราะไมทําเงินใหนักลงทุนสักเทาไหร แต
Solomon ก็ไดทําโปรเจกโอเพนซอสภายใน dotCloud ไปดวยชื่อวา Docker เปดซอสเปน Apache 2.0
นักพัฒนายุคแรกๆก็พวก Andrea Luzzardi, Francois-Xavier Bourlet แลวก็ Jeff Lindsay
สามคนแรกเปนวิศวกรของ dotCloud สวน Jeff เปนนักพัฒนาภายนอก ทําไปทํามาโปรเจกนี้ชักรุง
ประกอบกับธุรกิจหลักของ dotCloud ไมคอยดี เลยเปลี่ยนชื่อบริษัทเปน Docker แลวให dotCloud
เปนหนวยธุรกิจของ Docker แทน ภายหลัง dotCloud ก็ถูกขายให CloudControl โดยไมเปดเผยเงื่อนไข
ประมาณวาไปอยูกับคนที่เขาดูแลเธอไดดีกวาฉันจะดีกวา แตไมมีพนักงาน Docker ยายไปอยูกับ
CloudControl เลย เมื่อตนป ค.ศ. 2016 dotCloud ก็ตองปดตัวลงเพราะบริการไปไมรอด
บอกแลวตลาดนี้มันเถื่อน ไมแนจริงอยูไมได”
“เทคโนโลยี Container ที่มีมานานนมแลวก็จริงแตมันใชงานยาก Docker เอามาทําใหมันสามารถไดงาย ๆ
และจุดยืนของ Docker จะชวยโฟลวการทํางานของ DevOps ซึ่งเปนวัฒนธรรมการทํางานที่ Developer กับ
Operation ประสานงานกันไดอยางดี ยาย App จากเครื่องไปอีกเครื่องได ไมมีดรามามันเวิรคบนเครื่องตู!
- 3. ซะมากกวาเพราะทุกวันนี้เถียงกันหลือเกินวา VM หรือ Docker ดีกวา มันดีกันคนละอยาง ปดโถว!
เอาหละไหนๆ ก็พูดกันถึงเรื่อง VM ปะทะ Docker แลวก็ตองอธิบายสักหนอย” พูดพลางวาดรูปบนพื้น
“อาโป เจาเห็นรูปนี่ไหม ทางซายเปนชั้นของ VM จะตองมี Hipervisor หรือ Virtual Machine Manager
(VMM) เปนตัวกลางในการคุยกัน อยาเพิ่งเถียงเรื่องประเภทของ VM ที่แบงยอยไดหลากหลาย เอาเปนวา
VM ทั่วๆไปที่เราใชอยูมีลักษณะแบบนี้ จะมีตัวกลางในการคุยคือ Hipervisor นี่แหละ แลวก็ยังตองมี Guest
OS ซึ่งมันทําใหชา ในขณะที่ Docker ทางขวาเขาเจานั้นไมจําเปนตองใช Guest OS ไมตองมี Hypervisor
แตมี Docker Engine แทน งานวิจัยของ IBM บอกวา Container มันมีโอเวอรเฮดของการเริ่มตนใชอยูที่ < 1
วินาที แต VM ใชราว 11 วินาที อันที่จริง Docker มีนใชเวลาเริ่มราว ๆ 200-300 มิลลิวินาทีเอง งานวิจัยใหม
ๆ ตนป ค.ศ. 2016 บอกวาสามารถใชเทคนิคให Container เร็วกวา VM 91 เทา เร็วโพดโพ
เร็วจนตองรองขอชีวิต กลไกที่ทําใหมันเร็วไดขนาดนี้ก็เนื่องมาจากที่ไดอธิบายไป มันใชวิธีการวิ่งผาน Kernel
ของระบบปฏิบัติการหลักที่เราใชอยู เปนเหตุผลวาทําไมมันใช Windows ขางใน Container บน Linux ไมได
เพราะ Windows กับ Linux มันใช Kernel คนละตัวกันไง ชัดหรือยังวาตางมีแนวทางเปนของตัวเอง จะให
Container ไปตีตลาด VM คงจะไมงายซะทีเดียว”
“แลวกระบวนการขางใน Docker Engine ทํางานยังไงหละทานอาจารย” อาโปยิงคําถามตอ
- 4.
“กอนอื่นคงตองเลาคราวๆ ใหเจาฟงกอนเรื่องของชิ้นสวนหรือองคประกอบของที่เรียกวา Docker
ซะกอนวามีอะไรที่จําเปนตองรูบาง
● Docker Machine เปนตัวที่ใช Provision หรือเตรียมเครื่องปลายทางให ถาเรามีเครื่องคอมเปลา ๆ
หรือที่เรียกวา Bare Metal มันจะสรางคียแลวเอาคียไปเพิ่มที่เครื่องปลายทาง
จากนั้นจัดการลงโนนนี่ใหเสร็จสรรพ หรือถาเราใชอินฟราของพวก Amazon, DigitalOcean
เราก็จะเอาคียมาใส จากนั้นที่เหลือมันก็จะจัดการลง Image อะไรให สะดวกสบาย ถามวาไมใช Machine
ไดไหม กตอบวาได แตถามีเครื่องเปนรอยเครื่องนี่ลําบากแนนอน โดยเฉพาะตอนสรางคีย แลว Join Swarm
Cluster นะ บอกไดคําเดียววานรกแตกจะ
● Docker Swarm ตัวนี้เอาไวใชคุยกับ Docker หลายๆ ตัววางายๆ
มันก็คือตัวที่เอาไวจัดการคลัสเตอรของ Docker นั่นเอง ขอดีคือมันสามารถคุยกับ Docker
หลายตัวในโหมดซีเคียวได สั่งที่เดียวสามารถกําหนดใหมันเอา Container ไปวางที่ DigitalOcean หรือ
Amazon ก็ได สบั้ยมาก
Docker Compose เอาไวมัด Container หลายๆ ตัวเขาไวดวยกันไง เวลารันมันจะไดรันขึ้นมาเปนชุดๆ
เชนเว็บเซิฟเวอรกับฐานขอมูล มันก็จะมาเปนชุดๆ กันเราก็จะเขียนไฟลในรูปแบบ YML (อานวายาเมล)
รายละเอียดเดี๋ยวคอยวากัน
● Docker Engine พระเอกของเราที่จะไดคุยรายละเอียดกันตอไป แตตอนนี้เอาคราวๆ
มันคือตัวรันงานจริงๆ เปนตัวจัดการ Container สวนนี้คือหัวใจของ Docker เลยแหละ
ถาไมมีพสวนนี้พับคอมเก็บแลวไปปลูกเมลอนไดเลย
● Docker Registry สวนนี้เอาไวเก็บ Image ของ Docker เดี๋ยวเลาใหฟง วัยรุนอยาเพิ่งใจรอน“
- 5. “โอเค ตอนนี้เราก็รูถึงองคประกอบของ Docker บางสวนที่จําเปน แลวก็มีการพูดถึงบอย ๆ ไปแลว
ทีนี้เรามาเจาะลึกรายละเอียดเริ่มที่ Docker Engine พระเอกของเรากันกอนเลย Docker รีลีสครั้งแรก 13
มีนา 2013 (มันมีโจกอยูวา HR บองตื้นของบริษัทไหนจําไมไดระบุวาผูสมัครตองมีประสบการณใช Docker
ไมนอยกวา 3 ป ทั้งๆ ที่ตอนนั้น Docker อายุ 2 ป เอง) เวลาพูดถึง Docker ก็จะหมายถึง Docker Engine
นี่แหละ ตัว Engine ใชคุณสมบัติของ Linux Kernel เชน CGroups, Namespaces และ Union Mounting
(เชนพวก AUFS) ทําใหมันสามารถเปน OS-Level Virtualization ได และแยก Container
ที่ทํางานอยูบนเครื่องเดียวกันออกจากกันไดอยางสวยงาม ระบบจะมอง Engine
ทั้งตัวเปนแคโปรเซสของระบบ Container จะเปนโปรเซสยอยของ Engine อีกทีถา Docker Engine
หรือแมมันตาย Container ตัวลูกนี่ก็เดดซะมอเรตามไปดวย เวอรชั่นแรก ๆ Engine ใช LXC แตรุน 0.9
มาก็เปลี่ยนไปใชคาเริ่มตนเปน libcontainer ที่เขียนขึ้นมาเองจากภาษา Go”
“แลวพวก CGroups, เนมสเต็ก นี่คืออะไรหรอครับทานอาจารย”
“ Namespace ตะหากเฟย เอาหละ ในเมื่อเจาไมเขาจะก็จะเลาใหฟง
● CGroups หรือ Control Group
เปนตัวที่ใชแยกและจํากัดการเขาถึงทรัพยากรของเครื่องคอมพิวเตอรที่ใช Linux เชนพวก Disk I/O, RAM,
CPU, Network จํากัดการใชงานไดเชน ใช CPU ไดไมเกินเทาไหร ใช RAM ไมไมเกินเทาไหร
ใชสูงสุดแคทรัพยากรที่ตัวเองไดรับจัดสรรเทานั้น พัฒนาโดยวิศวกรจาก Google แลวรวมโคดเขามาใน Linux
Kernel Mainline ในรุน 2.6.24 (Linux Kernel มีคนแกใหเปนรุนยอยจนนับไมถวยแตตัวหลักที่ Linus
Torvald คนสราง Linux เปนคน Maintain เราเรียกวา Mainline)
● Namespaces ใชแบงทรัพยากรของ Linux ออกการกัน การทํางานจะคลายกับ Chroot
ระบบจะเห็นสภาพแวดลอมเฉพาะของ Container ตัวเอง ไมสามารถไปใชทรัพยาการของ Container อื่นได
โดยจัดวางอยูในลักษณะของไดเรกทอรี่ยอย ๆ เปนลําดับ Namespaces นี่เองที่ทําให Container มี IP,
Hostname หรืออุปกรณเครื่อขายเปนของตัวเอง
● Union Mount เปนการเมาทไฟลที่เดียว แตเห็นไฟลจากหลายที่ งงปะ? คือใน Linux
เราสามารถสรางรูหนอนจากไดเรกทอรี่หนึ่งหรือไดวรหนึ่ง ๆ ไปอีกที่หนึ่งได แตมันดันเปนแบบชี้ไดทีละที่
สมมุติ /mnt ของเรามีไฟล A อยู ทีนี้เราเมาท Disk0 ที่มีไฟล B ไปที่ /mnt ถาเราเปดดูจะเห็นแคไฟล B ตัว
Union Mount เลยเขามาแกปญหาสวนนี้ ซึ่งมันจะทําใหเห็นทั้งไฟล A และ B ในเมาทพอยตเดียวกัน”
“เดี๋ยวกอนยังไมหมด สิ่งที่ควรรูอีกอยางก็คือ Docker ใชกลไกที่เรียกวา Copy-on-Write (COW)
ที่อยูใน File System เชน BTRFS หลักการทํางานของมันก็คือมันจะ Copy ตัวที่มันจะ Write เอา
งงรับประทานอีก วากันงาย ๆ สมมุติวามี App 2 ตัวชื่อ App-1 กับ App-2 ใชงานไฟลเดียวกัน ชื่อไฟล A
ก็แลวกัน ระบบไฟลปกติเชน Ext4 ถา App-1 แกไฟล A ใหเปน A’ แลวความบรรลัยจักเกิดแก App-2
ที่เรียกใชงานไฟลเดียวกัน แตไฟลเจากรรมดันถูกแกไขไปแลว แตถาระบบเปนแบบ COW แลวหละก็ไฟลที่
- 6. App-1 แกจะไมกระทบกับ App-2 มันจะมองเปนคนละไฟลกันแลว แนวคิดนี้ชวยให Docker
ลดการใชพื้นที่ไปไดเยอะเลยเพราะมันเก็บเฉพาะสวนที่เพิ่มขึ้นมาเอาไวแกไฟลนิดเดียวก็ไมตองเก็บทั้ง HDD”
“อนาคตของ Docker ไปไดสวย และคิดวานาจะไปไดสวยเรื่อยตอนนี้นอกจาก Linux แลวยังมี Windows
เขามาแจมดวย อยากจะรูเหลือเกินวาอะไรดลใจ Satya Nadella CEO ของ Microsoft ใหยอมแก Kernel
ของ Windows ใหซับพอรต Docker ยิ่งชวงหลัง ๆ Microsoft ดู เอาจริงเอาจังกับ Linux มาก ๆ
แถมยังยอมใส Bash Shell เขามาเอาใจ System Admin ที่ใช Linux อีก เขามีแผนอะไรกันแนนะ”
“วันนีเลิกคลาสได เราจะเจอกันวันพรุงนี้ เมื่อวันพรุงนี้มาถึงเจาจะตองพรอมแลว”
ปรมาจารยอูเกวยหันหลังแลวหายตัวไป
วันคืนลวงไป ๆ บัดนี้เราทําอะไรอยู
- พระพุทธเจา -
“อาโป ตึ่งไดลาวว ลือสายแลวนะ เดี๋ยวไปเรียนไมทัน”
“ครับเตี่ยยยย”
กระบวนทาที่ 1 : เปดโลกยุทธจักร
“เอาหละวันนี้เจาจะไดเรียนรูโลกของ Docker และวิชายุทธเบื้องตนกันใหพอสมควร Docker
นั้นมีคียเวิรดที่นาสนใจอยูหลายตัว
● Docker Image เปนลักษณะตนแบบของ Container
ซึ่งมันประกอบไปดวย OS แลวก็ App ที่ติดตั้งเพิ่มไปเปนชั้นๆเหมือนขนมชั้นเลย
ที่มันทําเปนชั้น ๆ แบบนี้ไดก็เพราะมีคุณสมบัติของ COW นี่แหละที่สนับสนุน
มันจะเก็บ Layer ตอซอนกันขึ้นไปเรื่อย ๆ ไดตามขอมูลหรือโปรแกรมที่เพิ่มขึ้นมา
รูปขวามือเปน Image ชื่อ Mem_Nginx
จะเห็นวามันมีชั้นหลายอันเรียงกันเปนขนมชั้น ชั้นที่ตํ่าที่สุดคือ Ubuntu 16.10
ซึ่งเปนระบบปฏิบัติการ Image ที่ไมมีแมแบบนี้เราเรียกมันวา Base Image
จากนั้นก็มีการติดตั้ง Nginx ตามดวย Memcache ในลําดับถัดมา
สมมุติอีกวาถาเรามี Image ตัวที่ 2 ชื่อ MApache แตใช Ubuntu 16.10 ซึ่งเปน
Base Image รวมกันแบบนี้ Layer ของ Ubuntu 16.10
ก็จะสามารถใชรวมกันไดไมตองเปลืองเนื้อที่เก็บ 2 เทา แตมันชี้มา Layer เดียวกันไดเลย (ตามคํานิยามในเว็บ
- 7. https://docs.docker.com Base Image คือ Image ที่ไมมี Parent แตในเอกสารหลาย ๆ ตัวก็ใชคําวา
Base Image สําหรับ Image ที่คิดวาเปนฐานของงานตัวเองเลย เชน ตัวอยางขางบนถาเราสนใจการติดตั้ง
Web Server ก็สามารถเรียกตัว Image ของ Ubuntu เปน Base Image ไดเชนเดียวกัน ถึงแมวา Ubuntu
จะมีหลาย Layer ก็ตาม บางเจาปรับกลไกพวก Init system ที่ใชกับ Docker ไมเหมาะแลวคอยทํา Base
Image ดังนั้นไมตองซีเรียสเรื่องการเรียกมาก)
● Docker Container คลายกับ Container ที่เอาไวขนสงสิ่งของทางเครื่องบินหรือทางเรือ แต
Docker ใฃกับการขนสงชิ้นสวนซอฟตแวร การขนสงสินคาไมสนใจวาของใน Container
เปนอะไรขอแคมันอยูในนั้นได บริษัทสงสินคารับรองวาจะสงไดอยางมีมาตรฐาน Docker ก็ขนสงซอฟตแวรใน
Container โดยไมสนใจ เหมือนกันวามันเปนซอฟตแวรอะไร
แตรับประกันวามันจะทํางานไดอยางมีมาตรฐานเดียวกัน ในทุก ๆ ที่
ทําใหมันสามารถรันที่ไหนก็ไดและใหผลลัพธเหมือนเดิม ตัว Docker Container ใช Image
เปนตัวตั้งตนเพื่อสราง Container ขยายความอีกหนอย Container คือ โปรเซสของ Image
ที่สามารถมีหลายโปรเซสหรือ Container ทํางานโดยตั้งตนจาก Image เดียวกันได ถา Container
ไหนมีการแกไขคอยใช COW เพิ่ม Layer ขนมชั้นไปเรื่อยๆ เห็นไหมหละวาคอนเซ็บ COW ถูกเอามาใชแลว
Conatainer
● Docker Engine อยางที่เคยบอกไปวาตัว Engine นี้คือพระเอกของเรา ซึ่งภายในตัว Engine
เองก็แบงออกเปน 2 สวน คือ Docker Server บางที่เราก็เรียกมันวา Daemon ตัวนี้เปนตัวทํางานใหเราจริง
ๆ ระบบการทํางานจะอยูสวนนี้ อีกสวนคือ Docker Client เปนตัวเรียกสั่งงานผาน RESTful API ชื่อเทห ๆ
คือ Docker Remote API ไปที่ตัว Daemon จากนั้น Daemon จะเปนตัวจัดการ Container ให
ขอควรระวังคือเวอรชัน API ใน Server กับ Client ควรจะเปนเวอรชันตรงกันจะดีที่สุด
มีหลายกรณีที่เวอรชันตางกันแลวทํางานไมได
แตไมตองเปนกังวลถาติดตั้งพรอมกันปกติก็ไดรุนเดียวกันมาอยูแลว ทาพิศดารแบบนั้นเกงแลวคอยใช“
“ถาเครื่องเรามีโปแกรมครบทุกอยาง แลวเราสามารถทํา Base Image ของเราเองไดไหมทานอาจารย”
“ไดซิลองถามอากูดูวา ทํายังไงนะ เอาเปนวาตอนนี้เจาพรอมที่จะใชงาน Docker กอนแลวก็แลวกัน
ตามธรรมเนียมเราจะเริ่มที่การติดตั้งกันเลย (ใครเกงแลวก็ขาม ๆ ไปได)
Windows
- 10.
4) หลังจากติดตั้งเสร็จแลวเราจะได icon มาสองตัว เราจะเลือกใช Terminal
เพราะมันจะรับคําสั่งทาง Command Line Interface (CLI) (สวนตัว Kitematic เปนแบบ GUI คลิ๊ก ๆ
สั่งงานไดเหมือนกัน)
Mac OS X
คลาย ๆ กับของ Windows เลยครับ แตเปนการติดตั้งจาก Source นอก App Store ของ Apple
ดังนั้นถาเกิดกดจะติดตั้งแลวติดตั้งไมได ใหเขาไปเปลี่ยนโหมดตัวปองกันการติดตั้งกอน ใหมันรองรับ
Indentified Developers
ไปที่ System Preferences > Security & Privacy > แลวเลือกตัวกลางตามภาพ
1) ไปที่เว็บไซต https://www.docker.com/products/docker-toolbox
2) เลือกโหลดฝง Mac
- 12.
Ubuntu (และ Debian ก็คลายกัน)
ตัวอยางสั่งจาก Shell Super User ของ Root พอทุกสถาบัน (ถาอยากสั่งให User
ของเราไปอยูในกลุม Docker ที่ Docker แอบสรางไวใหเพื่อใชสั่งรัน Docker ได ก็สั่ง $ sudo usermod -aG
docker your-user ซึ่งก็ใชสิทธิ์ Super User อยูดีแตใชแคครั้งแรกไงหละ)
1) เปด Terminal แลวสั่ง $ sudo su
2) สั่ง # curl -sSL https://get.docker.com/ | sh
(เครื่องหมาย $ ไมตองพิมพนะ เอาไวบอกระดับของ Shell วาเปน Shell ระดับ User ธรรมดา สวน
# บอกวาเปนระดับ Super User เขียนเอาไวเผื่อมีคนงง มันเคยมีไง)
- 13. 3) สั่ง # docker version ดู ถามันขึ้นทั้ง Client กับ Server แบบนี้เปนอันเรียบรอย
พิเศษหนอยสําหรับใครที่อยูในกลุม Private Beta ของ Docker ก็สามารถโหลด Docker for Mac หรือ
Docker for Windows มาใชได (คาดวาอีกสักพักกวาผูใชทั่วไปจะไดใช) ตัว Docker
Toolbox ที่บอกวิธีติดตั้งไปแลวนั้นจะใช Linux Disto ที่ชื่อ boot2docker บน
VirtualBox ทั้งใน Mac และ Windows แตตัว Docker ที่เปน Private Beta จะใช
Alpine Linux บน xhyve ใน Mac หรือบน Hyper-V ใน Windows ซึ่งเปน
Hypervisor ที่เปน Native ของแตละ OS หลักการของ Toolbox จะใช Machine
Provision ไปที่ VirtualBox จากนั้นเรียก API ไปสั่งงาน (โดยใช Environment) สวน Docker for Mac/Win
ไมตองใช Machine แตจะใชผาน API ไปเรียกใช Hypervisor เลย (ไมตองตั้ง Environment
มันจะใชคาเริ่มตนคือ /var/tmp/docker.sock ซึ่งเปนไฟลที่ระบบปฏิบัติการตระกูล UNIX
ใชติดตอกันระหวางโปรเซสลักษณะคลาย TCP/IP สวนตัว Docker for Win จะคุยผาน Named Pipe)
ใครที่สนใจก็สามารถเขาไปโหลดไดที่ https://docs.docker.com/docker-for-mac/ สําหรับ Mac หรือ
https://docs.docker.com/docker-for-windows/ สําหรับ Windows การทํางานหลัก ๆ ก็ยังเหมือนเดิม”
----------------------------------------------------------ขอควรรู--------------------------------------------------------------
ตัวอยางการใชงานตอจากนี้ไปจะใช Docker Toolbox ที่ติดตั้งใน Mac OS X เปนหลัก
- 14. และการใชงานคําสั่งจะไมไดลงรายละเอียดการตั้งคายิบยอย แตทานสามารถหาเอกสารอานเพิ่มหรือสั่ง
$ docker --help เพื่อดูการตั้งคา หรือ $ docker คําสั่งยอย --help เพื่อดูการใชงานได
----------------------------------------------------------------------------------------------------------------------------------
“เอาหละทีนี้เรามาเริ่มใชงานกันเลย เปด Docker Quickstart Terminal
ขึ้นมา จากนั้นตัว App จะสั่ง Machine ให Provision โดยใช Driver ของ
VirtualBox ขึ้นมา Provision ให ซึ่งกระบวนการคราว ๆ ก็มี
1) เริ่มกระบวนการสรางเครื่อง (ปกติชื่อวา default)
2) กอปไฟล boot2docker.img ซึ่งเปน Linux Disto พิเศษที่
Docker ทํามาเขาไปขางใน VM”
3) สรางตัว VM ใน VirtualBox
4) สรางคีย SSH เอาไวใชเครื่องแบบไมตองใสรหัสผาน มันจะเอาคียไปถอดรหัสกันเอง
5) สตารท VM จากนั้นเอาคียไปวางใหถูกที่ถูกทาง
ซึ่งกระบวนการที่วาจะทําแครอบแรกที่ Provision เทานั้น
ใชเวลาพอสมควรแตถาเห็นวาฬเหมือนในรูปก็เปนอันใชได (รอบตอไปก็เปดแลวโซโลไดเลย)
- 15.
ลองเช็ค Environment ดู
DOCKER_HOST จะเห็นวามันเซ็ตชี้ไปที่ IP : 192.168.99.100 ซึ่งเปน IP ของ VM ที่ลง boot2docker
ใชพอรต 2376 ซึ่งเปนซีเคียวพอรตของ Docker Engine (ถาใชพอรต 2375 แสดงวาไมใชโหมดซีเคียวเดอ)
DOCKER_MACHINE_NAME ชื่อโฮสของ VM ชื่อ default (โฮสกับ VM ใชชื่อเดียวกัน)
DOCKER_TLS_VERIFY ใชโหมดซีเคียว
DOCKER_CERT_PATH ที่เก็บใบรับรอง (ตอนที่ Machine มันสรางคีย SSH จะไดใบรับรองออกมาดวย)”
“แลว Driver ที่ใชใน Machine นี่คืออะไรหรอทานอาจารย” อาโปถามขึ้นหลังจากที่เงียบฟงอยูนาน
“ใน Machine นั้น Driver คือตัวที่บอกวามันจะมีกลไกการ Provision อยางไร แตละ Driver
ก็มีความแตกตางกันออกไป เชน DigitalOcean Driver ของมันก็จะบอกวามันตองไปจะเรียก API
- 16. ไปที่ไหนเพื่อสรางเครื่องใน DigitalOcean ถาจะระบุที่ตั้งของโหนดที่จะเปดตองทําอยางไร, Amazon EC2
ก็คลายกันนะ, สวนพวกที่เปน VM หนะหรอ อืมม~ม ถาเปน VirtualBox มันก็จะมีมีบอกวารันคอมมานยังไง
กําหนดพารามิเตอรยังไง ถาจะเอา RAM เทาไหร ประมาณนี้ เดี๋ยวมีเวลาจะเลาใหฟงนะ”
“แตตอนนี้เจาลอง Whalesay ซึ่งเปนเบสิกของ Docker คลายๆ Hello, world ของการเขียนโปรแกรมกอน
สั่ง $ docker run docker/whalesay cowsay "Hi,I'm user"
เมื่อเราสั่งคําสั่งไปแลว Docker Engine จะไปดึง (Pull) Image ซึ่งเปนขนมชั้น (จะเห็นวามันโหลดมาเปน
Layer ๆ จาก Registry ซึ่ง Registry เองก็มี 2 สวนคือ Public คือ https://hub.docker.com
สวนนี้เอาไวเก็บ Official Image หรือ Image ที่ผูใชเปดสาธารณะ อีกสวนคือ Private เปน Registry
ที่เอาไวเก็บ Image ใน Datacenter ของผูใชเอง หรือจะใช https://hub.docker.com ก็ไดเหมือนกัน
แตถาจะเก็บเกิน 1 Private Image ตองจายเงิน สวนนี้จะเห็นเฉพาะผูไดรับอนุญาต เมื่อดึง Image
ลงมาไดครบทุก Layer ระบบก็จะหา Digest เพื่อรับประกันวาขอมูลที่ดึงมาครบถวน sha256 เปนชื่อ
Algorithms ที่ใชหา Digest จากนั้น Docker ก็จะสั่งให Container ทํางานโดยผานพารามิเตอร cowsay
"Hi,I'm user" ไปให cowsay เปนชื่อโปรแกรมปกติเปนวัวพูด แตใน Image นี้แกใหเปนวาฬพูด "Hi,I'm user"
เปนพารามิเตอรของ cowsay อีกทีบอกวาใหวาฬพูดวา "Hi,I'm user"
ถาเห็นวาฬพูดคํานั้นออกมาก็เปนอันใชได”
- 17.
ปรมาจารยอูเกวยกลาวพรอมเสียงไอ คอก แคก “กระบวนทาที่ 1 คงตองหยุดไวเทานี้เสียกอน”
เชื้อเพลิง ออกซิเจน และความรอนเปนเหตุใหเกิดไฟ
ขาพเจาและแมใคร ๆ มิอาจสั่งใหไฟนั้นกอติดได
การอาน การฟง และคิดวิเคราะหเปนเหตุของความรู
ขาพเจาและแมใคร ๆ มิอาจสั่งใหความรูนั้นกอเกิดได
ทั้งไฟและความรูเกิดจากเหตุของมัน ไมไดเกิดจากพระเจาอยากใหเปน
- เซอร จอหน ดราวนตัน -
กระบวนทาที่ 2 : ครอบครอง Dockerfile
แดดวันนี้รอนเกินที่จะจิบกาแฟหรือเลนกอกองทราย เด็ก ๆ ในสํานักนี้ลวนมีหนาที่แตกตางกันไป
บางเปนเบ บางเปนใบ บางเปนพี่ บางเปนนอง ทุกคนมุงหวังจะฝกวรยุทธเพื่อเอาไวชวยเหลือบานเมืองตน
แตไมใชทุกคนที่ประสบความสําเร็จแตทุกคนก็ไดวิชาติดเนื้อติดตัวกันไปพอไดใชรักษาชีวิตเปนครั้งคราว
“อาโป เก็บของวันนี้ขาจะพาเจาเขาเมือง” ปรมาจารยอูเกวยกลาวพลางหันไปซุปซิปกับปรมาจารยชิฟู
“ไดเลยครับทานอาจารย” อาโปรับคําพลันเก็บของลงยามสะพายหลัง
เวลาบายแก ๆ ของวัน แมจะไมเหมาะนักกับการเดินทางแตก็เปนเวลาที่ถูกกําหนดไวจากอูเกวย
แสดงวามันตองเปนธุรสําคัญแน ๆ ถึงตองเดินทางกันในเวลานี้
“วันนี้ขาจะสอนเจาเรื่อง Dockerfile” อูเกวยเอยขึ้นหลังจากที่เราเดินทางออกจากสํานักไดสัก 15 ลี้แลว
อาโปสงกระบอกไมใผบรรจุนํ้าใหอูเกวยที่นั่งพักไดดื่ม หลังจากดื่มนํ้าสองอึกใหญ ๆ
ไปแลวอาโปก็หยิบมาดื่มบาง พรอม ๆ กับตั้งใจฟง
“การจะสราง Docker Image มานั้นสามารถไดจาก 2 ทาง ทางแรกคือสรางโดยการคอมมิท Container
จากคําสั่ง $ docker commit วิธีนี้ประมาจารยหลายทานไมชอบพอนักเพราะทานเห็นวา Track
ดูรายการคําสั่งอะไรบางก็ลําบาก ไมมีชั้นมีตอน ตางจากการสรางจากสั่ง $ docker build จาก Dockerfile
- 18. ที่เปนขั้นตอน แกงาย สามารถเก็บไวใน Version Control เชนพวก Git ไดดีกวาการเก็บไบนารี่ของ Docker
Image ทั้งกอน บางทานก็วาใชมันทั้งคูนั่นแหละ”
“เอา เดี๋ยวทําทั้งสองวิธีใหดูกอนแลวเราคอยมาลงลึกกับ Dockerfile
● Docker Commit จะใชกรณีที่มี Container อยูแลว แลวตองการทําให Container
นั้นกลายเปนพื้นฐานใหกับ Container ตัวอื่นหรือจิวางาย ๆ ก็คือ Image ใหตัวอื่นเอาไปใชนั้นเอง
เอาหละสมมุติวามี Image ของ Busybox (Linux Distro ไซสเล็กขนาดไมกี่เม็ก) ที่ดึงลงมาจาก Docker Hub
อยู (Image มีชั้น 8ddc19f16526 อยูชั้นเดียวแบบนี้ Base Image ตัวจริงเสียงจริงแนนอน)
สั่งใหรัน
ดูสถานะหนอยวารันไดยัง
เขาไปใช Shell ของ Container
ลองสรางไฟลขึ้นมาสักไฟลหนึ่ง แลวลิสตดู จากนั้นก็ออกจาก Shell
จากนั้นจะ Commit ใหเปน Image ตัวใหม
ลองลิสต Images ดูวาได Image ออกมาจริง ๆ ไหม ก็จะเห็นวามี Image ตามชื่อที่ใหเรากําหนดโผลขึ้นมา
- 19. ● Docker Build จะสั่งคําสั่งนี้ไดเราก็ตองมี Dockerfile ซะกอน
วิธีการที่ทําใหดูนี้จะเอาไฟลยัดเขาไปในตัว Image ดวย
เอาหละเมื่อไฟลพรอมแลวก็จะสั่ง Build ถาสังเกตมันจะมีรายการคําสั่งที่อยูใน Dockerfile โชวขึ้นมาเปน
Step ๆ และระหวางทางมันก็จะมีการสราง Intermediate Container ขึ้นมาแลวก็ลบทิ้งไป
เนื่องจากบางคําสั่งตองการทํางานใน Container เชนพวก RUN apt-get update อะไรทํานองนั้นไง
โอเค เสร็จแลวลองลิสตดูวามี Image ชื่อ busybox_hello โผลมาหรือเปลา (ใชเครื่องหมาย Dash -
ในนี้ไมไดนะ)
สั่ง Run Container ดูวามันจะทํางานตาม Script ที่เราเขียนไวหรือเปลา
เอาหละเก็บเราจะเดินทางตอกันแลว ไวจะเลารายละเอียดใหฟงตอนที่เรากําลังเดินทางกันดีกวา
เดียวจะสายเกินไป” ปรมาจารยอูเกวยเก็บขาวของเดินนําหนาออกไป
….
เดินทางออกมาไดสักพักอูเกวยก็พูดขึ้นเพื่อทําลายความเงียบ “Dockerfile เจาก็ไดรูวิธีทําไปแลว
ทีนี้จะไดมาลงรายละเอียดกันซะที เอาเปนวาเริ่มเรียนรูคําสั่งที่ใชใน Dockerfile กันกอน
คําสั่ง คําอธิบาย
- 20. FROM เปนคําสั่งที่ใชบอกถึง Image ตั้งตนที่จะเอามาใชงานดวยลักษณะการของ Docker
Image คือจะมี Image ฐานของมันซึ่งจะเปน Image
ตัวไหนก็ไดแลวก็มีลักษณะขนมชั้นที่เพิ่มไปเรื่อย ๆ อยางถาอยากได Ubuntu
14.04 แลวจะสั่งติดตั้ง Nginx ฐานของเราก็คือ Ubuntu 14.04
แลวเราก็จะใชคําสั่งติดตั้ง Nginx ทีหลัง เนอ~อ แลวก็ FROM
นี่จะเปนคําสั่งเริ่มตนของทุก Dockerfile (ไมตองทอง ไมออกสอบ)
วิธีใช
FROM [ชื่อ Image ไหนก็ได]
ตัวอยาง
FROM Ubuntu:14.04
คําแนะนํา
ควรใชกับ Image ที่มีขนาดเล็ก หากตองการ Full Distribution
ที่มีของทุกอยางใหครบควรใช Image ของ Debian นะจะ ๆ
MAINTAINER คําสั่งนี้เอาไวบอกวาใครเปนคนสราง Image นี้ขึ้นมา เวลาดาจะไดดาถูกตัว
(วึ่งเวลาจะทําอะไรเกรียน ๆ เราก็จะใสชื่อเพื่อนลงไป)
วิธีใช
MAINTAINER [ชื่อคนสราง] “ใส Email ดวยก็ได”
ตัวอยาง
MAINTAINER AorJoa “bhuridech@gmail.com”
คําแนะนํา
การกําหนดคานี้จะไมมีผลกับกระบวนการ Build Image (ยกเวนใสชื่อ เจี๊ยบ
เลียบดวน ลงไป เครื่องทานอาจจะพังได
และทางเราปฏิเสธความรับผิดชอบในทุกกรณี)
RUN ใชสําหรับทํางานคําสั่งกับ Container อะ อยาเพิ่งงงนะ จําไดไมเรื่อง
Intermediate Container หนะมันก็คือ Container ที่ถูกสรางขึ้นมาระหวางการ
Build แลวมันก็ลบทิ้งไง อธิบายละเอียดอีกหนอยก็คือคําสั่ง Docker Build
มันไปสั่งใหสราง Container ขึ้นมาใชจาก Image ที่กําหนดไวในคําสั่ง FROM
แลวเอาคําสั่งที่อยูใน RUN ไปรันใน Contianer นั้น เมื่อรันเสร็จมันก็จะ Commit
เก็บไวใชในคําสั่งตอ ๆ ไปของ Dockerfile
วิธีใช
RUN คําสั่ง <======== แบบ shell
RUN [คําสั่ง] <======== แบบ exec
ตัวอยาง
RUN apt-get install -y nginx
- 21. คําแนะนํา
หลีกเลี่ยงคําสั่งที่ตองมีการโตตอบกับผูใชงาน ถาจะใช apt-get install ให update
กอนนะ และถามีหลายบรรทัดใหใชเครื่องหมาย คั่น เชน
RUN apt-get update && apt-get install -y
nginx
CMD อาการของคําสั่งนี้จะคลายกับ RUN แตวาการทํางานคําสั่งนี้จะเกิดขึ้นตอนที่สั่งให
Container เริ่มทํางาน สวนคําสั่ง RUN จะทํางานตอนที่สราง Image อยางถาสั่ง
CMD echo "I'm handsome." อยางนี้ หลังจาก Container
เริ่มทํางานไมวาจะเริ่มจากคําสั่ง Run หรือ Start ก็ตาม
แตเนื่องจากจุดประสงคของการสรางคําสั่งนี้มาเขาสรางมาเพื่อเปน คําสั่งเริ่มตน
นั่นหมายความวามันสามารถถูก Override
หรือทับคําสั่งดวยการใชคําสั่งในระดับอื่น เชน กรณีที่กําหนดใหใช echo “TEST”
ใน Dockerfile แตถามีการ Override คําสั่งก็จะเปลี่ยนไปตามคําสั่งที่ Override
คือเปลี่ยนเปน echo “Override” แทน
วิธีใช
CMD “คําสั่ง” “Parameter1” “Parameter2” <==== แบบ shell
CMD [“Parameter1”,“Parameter2”] <==== แบบ Default Parameter
CMD [“คําสั่ง”,“Parameter1”,“Parameter2”] <=== แบบ exec *แนะนํา
ตัวอยาง
CMD [“/usr/bin/curl”,”www.google.com”]
คําแนะนํา
(1) ถามีคําสั่ง CMD หลายอันมันจะทําแคอันสุดทาย
(2) มีขอแตกตางระหวางเครื่องหมาย ‘ กับ “ ขอแนะนําใหใช “
(3) ควรจะใช Full Path กับคําสั่งเชน /usr/bin/curl
(4) ตัวคําสั่งที่ Override มีความสําคัญกวา ดังนั้นถามีการ Override
มันจะทําเฉพาะ Override
ENTRYPOINT