ITS KM

การใช้ Docker เบื้องต้น

1. ทำไมถึงใช้ Docker 

2. Software Container คืออะไร

3. ความแตกต่างระหว่าง Virtual Machine กับ Container

4. Docker คืออะไร

5. องค์ประกอบต่างๆของ Docker

6. การติดตั้ง Docker

7. การทำงานกับ Docker

- Docker Image 

- Docker Container 

- Dockerfile 

 

1. ทำไมถึงใช้ Docker 

        ก่อนจะไปใช้งาน Docker เรามาดู ที่มาที่ไปกันก่อนว่าทำไมถึงมีคนพัฒนา software แบบ Docker นี้ ขึ้นมา เจ้า Docker นี้ เป็น application ประเภทที่เรียกว่า software Container ซึ่งมีวัตถุประสงค์หลักในการลดปัญหาในเรื่องของ software version conflict และปัญหาความแตกต่างของ environment ระหว่างเครื่อง develop และ production      

        สมมติว่า เราต้องทำการพัฒนา application เพื่อทำงานบน Linux โดยเครื่อง production มีสภาพแวดล้อมคือใช้ MySQL + PHP 7.0 ในขณะที่เครื่อง development นั้นติดตั้งเพียง PHP 5.6 และไม่สามารถยกเลิกได้เนื่องจากยังมี application อื่นที่กำลังพัฒนาอยู่เช่นกัน ในสถานการณ์อย่างนี้ จะเกิดความยุ่งยากขึ้นมาทันที ดีไม่ดีก็ต้องหาเครื่อง development ใหม่ซึ่งคงขอมาไม่ได้ง่ายๆ        

        อีกตัวอย่างหนึ่ง สมมติว่าใน server ที่เราใช้งานอยู่นั้นมี application ทำงานอยู่หลายตัว และเราเกิดมีความจำเป็นต้อง upgrade ตัวใดตัวหนึ่งในนั้น ซึ่งการ upgrade นี้ จะต้องใช้ library ที่มี version ไม่ตรงกับที่ใช้อยู่ในเครื่อง และไม่สามารถเปลี่ยนแปลงได้เนื่องจาก application อื่นๆ ก็ใช้งานอยู่ด้วย แบบนี้ก็ทำให้เราไม่สามารถ upgrade application เป็นบางตัวได้ คือ ถ้าจะทำก็ต้องทำทั้งหมด ทั้งที่ตัวที่เราจะ upgrade มีตัวเดียว เป็นต้น

        นอกจากนี้ สิ่งที่ software Container เข้ามาช่วยก็คือ ลดความยุ่งยากในการ deploy application และการ test ที่ซ้ำซ้อนระหว่างเครื่อง development และ production เนื่องจาก application ที่ทำงานอยู่ภายใน software Container นั้น จะมีทุกอย่างครบในตัวอยู่แล้ว เมื่อต้องการนำไปใช้งานก็เพียงเอา Container ไปติดตั้งบน server แล้วก็ run มันขึ้นมา โดยไม่จำเป็นต้อง install อะไรเพิ่มเติมอีกแล้ว ทั้งนี้ ยกเว้น application ที่มีความจำเป็นต้อง communicate กับ application ที่อยู่ใน Container อื่นๆ ซึ่งก็จะต้องทำการ config และ test เหมือนเดิม

 

2. Software Container คืออะไร 

          Software Container เป็น concept ของการสร้างสภาพแวดล้อมเฉพาะให้ซอฟต์แวร์ทำงานได้โดยไม่กวนกับซอฟต์แวร์ตัวอื่นบนระบบปฏิบัติการเดียวกัน เราสามารถเอา Container ไปรันในคอมพิวเตอร์หรือ Server เครื่องไหนก็ยังทำงานได้เหมือนเดิม โปรแกรมใน Container ยังทำงานได้ปกติไม่ผิดเพี้ยนจากเดิม ที่ผ่านมา Software Container มีการพูดถึงและมีการใช้งานกันมานานแล้ว อาทิ LXC (Linux Container), Solaris Containers, OpenVZ เป็นต้น แต่ไม่เป็นที่แพร่หลายมากนัก เนื่องจากมีการใช้งานค่อนข้างยุ่งยาก

 

3. ความแตกต่างระหว่าง Virtual Machine กับ Container

- Container จะเป็นการเพื่อจำลองและควบคุมสภาพแวดล้อมสำหรับการรันเฉพาะบาง Service เช่น Container ที่รัน nginx ใน ubuntu ก็จะบรรจุ Environment เหล่านี้ไว้เป็น 1        Container และรัน service เท่าที่จำเป็นต้องใช้เท่านั้น ทำให้ใช้ทรัพยากรน้อยกว่า Virtual Machine

 - Virtual Machine จะเป็นการจำลอง Environment มาทั้ง OS รันขึ้นมาเป็นเครื่อง Server 1 เครื่อง และมีการรัน service หลายๆ service ใน VM เดียวกัน ทำให้แต่ละ VM ต้องใช้ทรัพยากรจำนวนมาก อย่างไรก็ดี ด้วยสถาปัตยกรรมนี้ ทำให้ Container ไม่สามารถทำงานบน Host ที่มี Kernel ต่างไปจาก Host ที่ทำการพัฒนา application นั้นมา เช่น application ที่พัฒนามาบน Linux เมื่อนำไปใส่ไว้ใน Container ก็ไม่สามารถนำ Container นั้นไปทำงานบน Windows Native ได้ เป็นต้น

 

4. Docker คืออะไร

          Docker ก็เป็น Software Container ที่ถูกพัฒนาขึ้นมาให้สามารถการจัดการ Container ได้ง่าย Image มีขนาดเล็ก แยกเป็นชั้นๆ สร้างแนวคิด build, ship, run ในการ deploy application

Docker มีชุดซอฟต์แวร์ให้ใช้งานดังนี้

- Docker Engine เป็น Core หลักในการทำงาน • Docker Machine เป็นซอฟต์แวร์สำหรับสร้าง หรือ เซ็ตอัพเครื่องให้พร้อมสำหรับ Container

 - Docker Swarm เป็นซอฟต์แวร์ที่เอาไว้เชื่อมต่อ Docker Engine หลายๆ เครื่องมาเชื่อมต่อรวมกันให้เป็น cluster

- Docker Compose เป็นซอฟต์แวร์สำหรับอำนวยความสะดวกในการรัน Container โดยสามารถสั่งรันหลายๆ Container ได้พร้อมๆ กัน ตั้งค่าต่างๆ รวมไปถึงเชื่อมโยง Container ให้สามารถทำงานร่วมกันได้

- Kitematic คือ เครื่องมือ GUI ที่รวบรวมคำสั่งของ Docker Command ต่าง ๆ ในรูปแบบ UI ให้สามารถใช้งานได้ง่าย ๆ ยิ่งขึ้น

 

5. องค์ประกอบต่างๆของ Docker

Docker Image

          คือต้นแบบของ Container ข้างในจะเป็น Linux ที่มีการติดตั้ง Application และ มีการ Configuration เอาไว้แล้ว ซึ่งเกิดมาจากการ build ไฟล์ Docker file ขึ้นมาเป็น image

Docker Container

          Container จะถูกสร้างมาจาก Docker Image ที่เป็นต้นแบบ เกิดเป็น Container จะได้ Service หรือ Application ที่สามารถเรียกใช้งานได้ทันที

Docker Registry

          เราสามารถสร้าง Docker Image แล้วนำไปเก็บรวบรวมไว้บน server (ลักษณะเดียวกับการเก็บ Source Code ไว้บน Github) โดย Docker Registry ณ ปัจจุบันก็มีให้เลือกใช้งานได้หลากหลายโดยมี Docker Hub เป็น Docker Registry หลัก ในการเรียกใช้(pull) Docker Image และนอกจากนี้ยังมีผู้ให้บริการ Docker Registry เจ้าอื่นๆ ด้วย เช่น Gitlab, Quay.io, Google Cloud เป็นต้น

 

6. การติดตั้ง Docker

สามารถ Download มาติดตั้งตาม OS ที่เราจะใช้งานได้เลยตาม link

ด้านล่างนี้ https://www.docker.com/products/docker-desktop

          สำหรับ Docker for Windows นั้นต้องใช้ฟีเจอร์ Hyper-V ด้วย ซึ่งใน Windows Home version จะไม่มี Hyper-V ก็จะไมสามารถติดตั้งได้ โดย Docker ในเวอร์ชัน Windows และ Mac จะเรียกว่า Docker Desktop ส่วนใน Linux based จะเรียกว่า Docker Engine ตัวฟรีทั้งหมดสามารถโหลดได้จาก link ด้านล่างนี้ (ปกติ การติดตั้งใน Linux จะใช้ผ่านระบบ installation ของ Linux นั้นๆมากกว่าการ download เอง)

https://hub.docker.com/search/?type=edition&offering=community

          สำหรับ Docker Desktop นั้น เมื่อติดตั้งเสร็จแล้ว จะมี icon ปรากฎบนหน้าจอ (ยกเว้นไปเอา check box ออก ก็ไปรันจาก start menu เอา) เมื่อ run โปรแกรม มันจะเป็น System service ซึ่งจะเห็นไป icon อยู่ใน System Tray ด้านล่างขวา เมื่อโปรแกรม start แล้ว จะปรากฎหน้าต่างแนะนำ และให้เราทำการ login เข้าระบบของ Docker (ก่อนที่เราจะ download ได้ มันก็จะบังคับให้ลงทะเบียนไว้แล้ว) ในการติดตั้ง โปรแกรมจะถามว่าจะใช้ Windows based Container แทน Linux หรือไม่ ตรงนี้ให้ใช้เป็น Linux based ไปก่อน ก็ไม่ต้องไปเลือกอะไร

          เมื่อทำการ login แล้ว ให้ลอง right click ที่ icon จะปรากฎเมนูขึ้นมา เลือก Settings เพื่อมากำหนดค่าต่างๆก่อน ในส่วนของ General โปรแกรมจะเลือก Start Docker Desktop when you login เอาไว้เลย ทำให้มันทำงานทันทีเมื่อเรา login ซึ่งหากเราแค่จะใช้เพื่อทดสอบ ก็แนะนำให้เอาออก ส่วน option อื่นๆก็ตามชอบ หากต้องการเป็นส่วนหนึ่งในการพัฒนา Docker ก็เลือก Send usage statistic ไว้ แต่ถ้าไม่อยากเปลือง net ก็เอาออก ส่วนอันสุดท้ายไม่จำเป็นก็ไม่ต้องไปเลือก

          ต่อไปให้ไปที่หัวข้อ Shared Drives ซึ่งจะเป็นการกำหนดว่าจะใช้ Drive ไหนในการทำงานกับ Docker ถ้าไม่เลือกไว้ก็จะมีปัญหาในการรันคำสั่ง Docker เลือกแล้วอย่าลืม Apply

 - ในส่วน Advanced จะเป็นการกำหนด resources ให้กับ Docker ทั้ง vCPU, Memory และ พื้นที่เก็บ Image

 - ส่วนของ Network จะเป็น virtual network สำหรับใช้ระหว่าง Container ภายในของเครื่อง

 - ส่วนของ Proxies Daemon และ Kubernetes ให้ใช้ default setting

 - ถ้าต้องการ reset ค่ากลับเหมือนเดิม ก็เลือกเมนู Reset

          สำหรับการใช้งาน Docker นั้นจะต้องใช้คำสั่งในการสั่งงาน ผ่าน Command Line เมื่อติดตั้งเสร็จแล้ว ให้เปิดโปรแกรม Terminal หรือ cmd ในแบบ “Run as Administrator” เพื่อป้องกัน permission error ตัวอย่างคำสั่งแรก ลองใช้คำสั่งตรวจสอบ version ดังนี้

docker --version หรือ docker -v

ถ้ามี Output ที่ไม่ใช่ Error ก็แปลว่าการติดตั้งเสร็จสมบูรณ์

 

7. การทำงานกับ Docker

         ในเอกสารชุดนี้ จะนำเสนอการใช้งานแบบเบื้องต้นเท่านั้น ซึ่งยังอาจไม่สามารถนำไปประยุกต์ใช้กับการทำงานจริงได้ แต่จะนำเสนอให้เห็นภาพกว้างๆของวิธีและแนวทางในการใช้งาน

Docker Image

          Docker Image ก็เหมือนกับบะหมี่กึ่งสำเร็จรูป ที่เราสามารถนำมาปรับแต่งแล้วก็ใช้งานได้เกือบจะในทันที โดย image เหล่านี้สามารถหาโหลดได้จาก Docker Hub ตาม link นี้ https://hub.docker.com/

Workshop

- ค้นหา MySQL image บน docker hub

- ระบบจะแสดงผลของ Image ที่เป็น MySQL ทั้งหมด ซึ่งมีเยอะมาก (18,950) ทั้งนี้ image ในระบบของ Docker Hub จะมี 2 ประเภทหลักๆคือ Official Image กับ Shared Image ก็คือ Image ที่มีคนสร้างไว้แล้วนำมา shared ลงใน Docker Hub การจะพิจารณาว่าจะใช้ image ไหนก็ให้พิจารณาจากจำนวนการ download และ จำนวน stars ที่ image นั้นได้รับ

- ทำการ pull image ด้วยคำสั่ง Docker image pull mysql ดังรูป

- Docker ก็จะทำการ download image มาเก็บไว้ในเครื่อง ทีนี้ จะมีส่วนรายละเอียดอีกเล็กน้อยดังนี้

- Tag – เปรียบเสมือน version ของ image หากเราไม่ระบุ ก็จะได้ latest มาเป็น default หากจะระบุ tag ให้ใส่ “:” ต่อท้ายชื่อ image แล้วตามด้วย tag label เช่น

docker image pull mysql:8

- Layers – ในสถาปัตยกรรมของ Docker จะแบ่ง image ออกเป็นหลายๆส่วน แต่ละส่วนเรียกว่า Layer แต่ละ Layer ก็จะมี ID กำกับ อย่างในกรณีของ mysql จะเห็นว่ามี Layer ใน image อยู่ทั้งหมด 12 Layer ข้อดีของการใช้ Layer ก็คือ หากมีการ update ในตัว image ระบบจะ download เฉพาะ Layer ที่เปลี่ยนมาใช้เท่านั้น

- ทดลองเรียกดูว่าในขณะนี้มี image ในระบบของเราทั้งหมดเท่าไหร่ด้วยคำสั่ง

          docker image ls

จะเห็นว่ามี image อยู่ในระบบ 2 ตัว คือ mysql และ docker4w/nsenter-dockerd ก็คือตัว Docker Desktop นั่นเอง

 

Further Commands

- หากต้องการดูว่ามี command / option อะไรบ้างในสว่นของ docker image ให้ใช้คำสั่ง

           docker image –help

- หากต้องการลบ image ที่ไม่ใช้ สามารถลบได้ดังนี้  

           docker image rm <image:tag>

- จำไว้ว่า การลบด้วย rm นั้น ระบบจะไม่ทำการ ลบ ออกไปจาก hard disk จริงๆ ก็เหมือนกับการ delete บน Windows ซึ่งหมายความว่า มันจะยังคงใช้เนื้อที่อยู่นั่นเอง หากต้องการลบ image เหล่านี้ออกอย่างถาวรให้ใช้คำสั่ง

docker image prune

จะเป็นการ purge image ทั้งหมดที่เคยถูกลบไปแล้วออกจากเครื่องอย่างถาวร

- หากต้องการดูรายละเอียดของ image สามารถใช้คำสั่งดังนี้

docker image inspect <image_name>

Docker Container

     เมื่อเราได้ docker image มาแล้ว หากต้องการนำมาใช้งาน เราก็ต้องนำเอา image นั้น มาสร้างให้เป็น Container นึกสภาพก็คล้ายกับ เรามีของที่จะบรรจุตู้ Container แล้ว ก็ต้องหา Container มาใส่ ถ้าเราใส่ของเหมือนๆกันอยู่ภายใน Container หลายๆตู้ ก็เหมือนกับเราสร้าง Container ของ docker image ที่เหมือนกันหลายๆอัน ซึ่งนี่เป็นจุดเด่นในเรื่องของการ deploy โปรแกรมที่ทำ image ไว้แล้วได้อย่างรวดเร็ว Workshop

• ดูวิธีการ run ตัว mysql จาก docker hub จะเห็นคำแนะนำเกี่ยวกับการใช้คำสั่ง ตามรูปด้านล่าง

• ทดลองรันตามตัวอย่างดังนี้

 

อธิบาย option แบบคร่าวๆได้ดังนี้

     o --name คือการตั้งชื่อให้กับ Container ที่กำลังรัน หากไม่ตั้งชื่อ เราจะได้ชื่อเป็น random id ยาวๆ ใช้งานลำบาก

     o -d คือออพชันที่บอกให้ Container นี้ทำงานแบบ daemon หรือทำงานเป็นพื้นหลัง

     o -e เป็นการกำหนดค่าให้กับ Environment Variable ที่ Container จะเอาไปใช้แทนที่ค่านั้นๆตามที่กำหนด ตามตัวอย่างนั้น mysql ต้องการ MYSQL_ROOT_PASSWORD ในการสร้าง Container เราจึงต้องกำหนดค่านี้ หากไม่กำหนดก็จะไม่สามารถสร้าง Container ได้ และจะมี error เกิดขึ้น

• ตรวจสอบการทำงานของ Container ด้วยคำสั่ง docker ps ดังนี้

จะเห็นว่ามี Container ชื่อ some-mysql ทำงานอยู่ จาก image ชื่อ mysql:latest สร้างเมื่อ 4 นาทีที่แล้ว ทำงานที่พอร์ต 3306 

• ทดลองเชื่อมต่อไปยังพอร์ต 3306 บนเครื่อง localhost

 

จะเห็นว่า ไม่สามารถต่อเชื่อมได้ ทั้งนี้เนื่องจาก Container นั้นเปรียบเสมือน VM Server ตัวหนึ่ง มันจะมี IP เป็นของมันเอง ถ้าเราไม่ได้ทำการ map port ออกมาที่ host แล้ว ก็ไม่สามารถเข้าถึง service นั้นๆได้

• ดูรายละเอียดของ Container ด้วยคำสั่ง

docker Container inspect <Container-name>

 

ด้วยคำสั่งนี้ เราจะเห็นรายละเอียดทั้งหมดของ Container หากดูไล่ลงมาเรื่อยๆก็จะเห็นรายละเอียดเกี่ยวกับ Network Setting ดังนี้

จะเห็นว่า Container นั้น ได้ IP คือ 172.17.0.2 มี Gateway IP คือ 172.17.0.1 เป็นต้น

• หยุดการทำงานของ Container ด้วยคำสั่ง 

docker Container stop <Container-name>

จากนั้นลองเช็คด้วย 

docker ps และ docker ps -a ดังรูป

 

จะเห็นว่าเมื่อทำการ stop Container แล้ว หากใช้ docker ps ตามปกติ จะไม่มีอะไรแสดงขึ้นมาเลย แต่หากใช้ docker ps -a แล้ว ก็จะเห็นว่ามี Container 1 ตัว สถานะเป็น Exited เมื่อ 6 วินาทีที่แล้ว ทั้งนี้ option 

“-a” จะเป็นการแสดงผล Container ทั้งหมด ที่ทำงานและไม่ได้ทำงาน

NOTE: เราไม่สามารถ restart Container ได้ ไม่ว่ากรณีใด ทำได้เพียงสร้างขึ้นมาใหม่เท่านั้น

• ทดลอง run Container แบบเดิมอีกครั้ง

 

ระบบจะแจ้งเตือน error ว่าชื่อซ้ำ ทั้งที่ Container นั้นไม่ทำงานแล้ว นั่นก็คือ Container ที่ปิดไปแล้วก็ยังคงค้างอยู่ในระบบแบบเดียวกับ image ทั้งนี้ storage path ที่ถูกกำหนดให้ Container จะยังคงอยู่ ซึ่งเราสามารถไป copy ข้อมูลที่สำคัญมาก่อนได้ เราสามารถลบ Container เป็นการถาวรได้ด้วยคำสั่ง

docker Container prune เหมือนกับการลบ image ซึ่งเมื่อรันแล้ว storage path จะถูกลบทิ้งไปด้วยแบบถาวรและเราจะไม่สามารถกู้ข้อมูลใดๆกลับมาได้อีก

• ทดลองลบ Container ที่ปิดแล้วและลองรันใหม

จะเห็นว่าหลังจาก prune แล้ว เราสามารถรัน Container โดยใช้ชื่อเดิมซ้ำได้

NOTE: Docker for Windows จะเก็บ storage ใน Virtual HD ดังนั้นเราจะไม่สามารถเห็น storage นั้นได้โดยตรง

• โดย Concept ของ Container แล้ว ตัว Container ไม่ควรจะมีขนาดที่ใหญ่ขึ้น แล้วถ้าเป็น Container ของ MySQL ที่เป็น database แล้วจะทำอย่างไร? คำตอบคือ เราควรต้องกำหนด External Volume ที่อยู่บน host แยกออกมาต่างหาก ข้อดีก็คือ External Volume นี้ จะไม่ถูกลบแม้ว่า Container จะถูกลบไป ทำให้เราสามารถรัน Container ขึ้นมาใหม่โดยใช้ External Volume เดิมได้ ก็จะสามารถใช้ข้อมูลเดิมได้ ก่อนจะทำการ map volume เข้าไปใน Container เราต้องรู้ก่อนว่า มี path อะไรที่จะสามารถ map เข้าไปได้บ้าง เราสามารถสังเกตุได้จากการใช้คำสั่ง Docker image inspect ได้ เช่นในกรณีของ MySQL เราจะเห็นข้อมูลดังนี้

 

จะเห็นว่ามี Volumes ที่กำหนดอยู่คือ /var/lib/mysql เราจสามารถกำหนด External Path ให้ไป map กับ volume นี้ได้

• ทดลองสร้าง Container แบบกำหนด mapping port และ external path ดังนี้

docker run --name mysql-01 -e MYSQL_ROOT_PASSWORD=mysecret -d -p 3306:3306 -v d:/DockerTest/mysql:/var/lib/mysql mysql:latest

 

เมื่อรันแล้ว จะมี pop-up ถามการอนุญาตเรื่อง network port ก็ให้ตอบ Yes / OK 

จากนั้น หากไปดูใน D:\DockerTest\mysql จะเห็นว่ามีไฟล์ของ mysql อยู่

 

option “-“ นั้น ไว้สั่งให้ docker ทำการ map port จาก Container มายัง host โดยเลขที่อยู่ข้างหน้า “:” คือ port บน host ที่ต้องการจะเปิด ส่วนเลขที่อยู่ข้างหลังคือ port ของ Container

option “-v” ไว้สั่งให้ docker ทำการ map volume จาก host path ไปยัง Container path

• ทดลองต่อเข้าพอร์ต 3306 ผ่าน localhost ด้วย telnet หรือ mysql connector ใดๆ เช่น telnet localhost 3306 จะพบว่าสามารถเชื่อมต่อเข้าไปได้

 

 

Dockerfile 

          นอกจากการเอา image ที่มีอยู่แล้วมาสร้างเป็น Container นั้น เราสามารถสร้าง image ขึ้นมาเองได้ การสร้าง image จะมีด้วยกัน 2 วิธี คือ การ build image จาก Container ที่กำลังทำงานอยู่ หรือ การใช้ Dockerfile ในการช่วยสร้าง image

Workshop 1 - สร้าง custom image ผ่าน Container

- โหลด ubuntu มาด้วยคำสั่ง docker image pull ubuntu

- รัน Container ด้วยคำสั่ง docker Container run -it --name=ubuntu-01 ubuntu ด้วย option -it จะทำให้เรา access เข้าไปยัง Container ที่รันขึ้นมา ก็จะเห็นเป็น Ubuntu prompt

- รันคำสั่งใน ubuntu ดังนี้

apt-get update - เพื่อ update ระบบ และ repository

apt-get install apache2 - เพื่อติดตั้ง apache2

- ออกจาก Container โดยไม่ terminate ด้วยปุ่ม ตามด้วย

- ทำการสร้าง image จาก Container ubuntu-01 ดังนี้

docker commit ubuntu-01

- ตรวจสอบ image ด้วยคำสั่ง docker image ls จะเห็น image ที่ไม่มีชื่อ ให้จำ ID หรือ copy ไว้

- ทำการเปลี่ยน Tag ของ image เพื่อให้ง่ายต่อการใช้ด้วยคำสั่ง

docker tag my-ubuntu:1.0

เราจะอ้างอิง image นี้ว่าเป็น my-ubuntu เวอร์ชัน 1.0

- ลองรัน Container ขึ้นมาใหม่พร้อม map port 80 ดังนี้

docker run -it --name ubuntu-01 -p 80:80 my-ubuntu:1.0

- เมื่อเข้ามาใน Ubuntu prompt ทำการรัน apache2 service ดังนี้

service apache2 start

จะเห็นได้ว่า package ของ Apache2 ได้ถูกติดตั้งไว้ใน Container เรียบร้อยแล้ว ซึ่งแตกต่างจาก ubuntu ตัวหลักที่เราโหลดมาเป็นต้นแบบ

- ลองใช้ browser บน host เปิดไปยัง http://localhost ควรจะเห็น default page ของ Apache2

          จะเห็นได้ว่า เราสามารถใช้ image ใดๆเป็น แม่แบบในการสร้าง Container จากนั้นเราสามารถทำการ update Container นั้นๆแล้วนำมาสร้างเป็น image แบบที่ต้องการได้

 

Workshop 2 – สร้าง custom image ด้วย Dockerfile

• สร้าง folder สำหรับเก็บ Dockerfile ไว้ที่ตรงไหนก็ได้

• สร้างไฟล์ชื่อ Dockerfile (ตัวเล็ก ตัวใหญ่ ตามนี้ และไม่มีนามสกุลไฟล์) ไว้ใน folder จากข้อที่แล้วด้วย content ดังนี้

       

รายละเอียดสามารถอธิบายได้คร่าวๆดังนี้

o FROM ไว้ระบุ image ที่จะเป็นต้นแบบ ควรใส่ Tag ที่ชัดเจน ปกติจะไม่ใช้ latest

o RUN เสมือนการรันคำสั่งจากภายใน Container คล้ายกับที่เรารันคำสั่งผ่าน Ubuntu prompt

o EXPOSE ไว้ระบุว่า Container นี้ จะมี port อะไรบ้าง

o CMD เพื่อบอกว่า หลังจาก Container start แล้ว จะให้ทำคำสั่งอะไร จะมีความแตกต่างจาก RUN ที่จะเป็นการทำงานในระหว่างการสร้าง image เท่านั้น

• ใน windows prompt ให้ cd ไปยัง drive และ folder ที่มี Dockerfile แล้วรันคำสั่ง

docker build -t my-ubuntu:2.0 .

(อย่าลืม ‘.’ ที่อยู่หลังสุด!!!)

 

• หลังจากสร้างแล้ว ลองตรวจสอบด้วย docker image ls ดู จะต้องมี image ชื่อ my-ubuntu Tag 2.0 อยู่ในรายการ

 

• ทำการรัน Container ด้วยคำสั่ง

docker Container run -d -- name ubuntu-01 -p 80:80 my-ubuntu:2.0

PS1 : อย่าลืม stop Container ตัวที่แล้วก่อน เพราะจะใช้ชื่อและ port เดียวกัน ถ้าจะทดลองคนละชื่อและคนละ port ก็ไม่ต้อง stop

PS2 : ถ้าลบแล้ว อย่าลืมใช้ docker Container prune ไม่อย่างนั้นแล้วก็จะใช้ชื่อ ubuntu-01 ไม่ได้

• ทดสอบด้วยการเปิด browser เช่นเดียวกับ Workshop ก่อนหน้านี้

 

Air Jordan
You are here: Home KM ITS KM การใช้ Docker เบื้องต้น