มาสนุกกับการใช้งาน Docker สำหรับ Data Science กัน

เมื่อพูดถึงโปรแกรมสำหรับการจัดการ packages ต่าง ๆ สำหรับงาน Data Science ทุกคนก็คงจะนึกถึงเจ้า งูยักษ์ของเรา นั้นก็คือ “Anaconda” นั้นเอง

เจ้า Anaconda นี้แหละคือผู้ที่คอยจัดการ packages ต่าง ๆ สำหรับงานในด้าน Data Analytics, Deep Learning และ Data Visualization เป็นต้น ถ้าใครเคยจับงานด้านพวกนี้ โดยไม่มีเจ้าตัว Anaconda ก็จะรู้ว่า โอโห้ !! มันช่าง install เยอะซะเหลือเกินและยังน่าปวดหัวอีกต่างหาก เพราะเจ้า Anaconda ตัวนี้ที่เป็นลูกมือ ค่อย install packages ต่าง ๆ ให้เรา ที่สำคัญยังสามารถสร้าง virtual environment ขึ้นมาและยังแยกออกจาก physical environment อีกด้วยทีนี้ก็สบายใจได้เลยกับการพัฒนางานต่าง ๆ ตามที่เราต้องการได้อย่างเต็มที่
เอาละ พูดถึงข้อดีมาก็เยอะแล้วนะครับ แต่เจ้า Anaconda ก็ยังมีปัญหากวนใจเล็กน้อยเหมือนกันคือ เรามักจะเจอว่าบางที ที่เรา ติดตั้ง package python บางตัวแล้วดันไปอ้างอิงถึง package python ตัวอื่น ๆ ที่เป็น version เฉพาะสำหรับ package python นั้น ๆ ทำให้ไม่สามารถติดตั้งได้หรือต้องถอยไปติดตั้ง version ที่ เข้ากันได้กับ environment ของเรา นั้นก็เป็นปัญหาหนึ่งที่ใครหลายคนอาจจะเจอกันมาบ้างแล้ว ซึ่งบอกได้เลยว่าปวดหัวกันเลยทีเดียว ฮ่า ๆ ยิ่งถ้า เผลอไปใช้คำสั่งอัพเดท conda update conda
หรือ conda update anaconda
นะครับ อาจจะปวดหัวยิ่งกว่าเดิมแน่นอน
แล้วถ้า project นี้เราไม่ได้ทำแค่คนเดียวละ จะเกิดอะไรขึ้น …. ถูกต้องแล้วครับ เอ๊ะ ยังไม่ได้ตอบเลย !! ความสนุกเกิดขึ้นแน่นอนครับ เพราะแต่ละคนก็มีความถนัดกันหลากหลาย ไม่ว่าจะเป็น บางคนชอบใช้ Windows บางคนชอบใช้ Linux
แล้วยังนี้เราจะจัดการยังไงหละเพื่อให้เกิดการพัฒนาร่วมกันได้อย่างสบายใจและมีจุดตรงกลางร่วมกัน ใช่ครับ ก็ให้ทางฝั่ง Linux ติดตั้ง Anaconda ซะสิ จะได้เหมือนกัน ฮ่า ๆ แต่ ๆ ช้าก่อน ซาร่า เรามี tool มาแนะนำ นั้นก็คือ Docker นั้นเอง แล้ว Docker คืออะไรหละ ?
Docker คือ ?

Docker คือแพลตฟอร์มซอฟต์แวร์ (PaaS) ที่ช่วยสร้าง ทดสอบ และติดตั้งแอปพลิเคชันของเราได้อย่างรวดเร็ว ให้ลองนึกภาพ เราสามารถใส่โค้ด และ packages python ต่าง ๆ ที่เราพัฒนา เข้าไปไว้ในตู้คอนเทนเนอร์ (container) เหมือนภาพ โลโก้ Docker เลย และตัว Docker เองจะมีคอร์หลักของตัวเองชื่อว่า Docker engine สามารถรันอยู่บน OS ได้ทั้ง Windows และ Linux ทำให้การใช้งานง่ายขึ้นโดยการแค่ยกทั้งตู้คอนเทนเนอร์ นั้นมารันบน Docker engine ของเราก็จะใช้งานอย่างมีประสิทธิภาพ ไม่ว่าจะอยู่บน OS ใด ๆ ที่ สนันสนุนการใช้งาน Docker นั้นเอง เท่านี้ก็ไม่มีปัญหากวนใจแน่นอน

ช่วงยกตัวอย่างให้เห็นภาพ นั้นคือ เมื่อเราพัฒนาเว็บเซอร์วิสซึ่งประกอบไปด้วย package python และชุดโค้ดที่พร้อมใช้งานแล้ว เราสามารถ นำสิ่งต่าง ๆ เหล่านี้ใส่ไว้ใน Docker container เพื่อนำไป deploy บน OS ต่าง ๆ ที่รองรับการใช้งาน Docker ได้เลย หรือจะเป็นการใช้ Docker ในการจำลองฐานข้อมูลที่เป็น RDBS หรือ NOSQL สำหรับทดสอบการอ่านและเขียนลงฐานข้อมูล ก็ทำได้เช่นกัน เป็นยังไงหละ เจ้าปลาวาฬสีฟ้า !!
แล้ว Docker ประกอบไปด้วยอะไรบ้างหละ ?
Docker Image
Docker image คือ ตัวต้นแบบในการสร้าง container ซึ่งภายในจะประกอบไปด้วยสิ่งต่าง ๆ ที่บอกว่า container ที่สร้างจาก image นี้ ประกอบไปด้วย package อะไรบ้าง รันอยู่ใน environment แบบไหน เป็นต้น ถ้าให้เปรียบเทียบง่าย ๆ นั้นก็คือ พิมพ์เขียวสำหรับ container แล้ว Docker image มากจากไหนล่ะ คำตอบก็คือ ตัว Docker นั้นจะมีสิ่งหนึ่งที่เรียกว่า Docker file และเจ้าตัว Docker file นี้หละที่จะเป็นตัวบอก Docker ของเราว่า Docker image นี้ ทำอะไรบ้างนั้นเอง
Docker Container
เป็นผลลัพธ์ที่เกิดจาก Docker image เปรียบเสมือนกับตู้คอนเทนเนอร์ ที่ฝั่งโค้ดและ package ต่าง ๆ ตามที่ Docker image ประกาศไว้

พอเห็นภาพกันบ้างหรือยังครับดูเหมือนเจ้า Docker จะใช้งานง่ายมาก ๆ งั้นเรามาเริ่มเล่น Docker กันเลย
เริ่มต้นเล่น Docker กัน !! (ในที่นี้ผู้เขียน ติดตั้งบน Windows ครับ)
เริ่มจากไปที่เว็บ Docker เพื่อ ดาวน์โหลด ตัวติดตั้ง และถ้าใครอยากได้ข้อมูลเพิ่มเติมสามารถเข้าไปดูได้ที่เว็บไซต์ Docker overview ได้เลย

เมื่อติดตั้งเสร็จแล้วให้เราทดสอบโดย เปิด PowerShell และลองทดสอบโดยการรัน คำสั่งดังต่อไปนี้เพื่อทดสอบการใช้งาน
> docker run -d -p 80:80 docker/getting-start

จากนั้นเข้าไปตรวจสอบว่า Docker container นั้นทำการรันอยู่หรือไม่ โดย เข้าไปที่ Docker Desktop ที่ notification area จะเห็นว่า container เราได้รันอยู่ดังภาพตัวอย่าง

เย้ ตอนนี้เราก็ได้ Docker engine สำหรับรัน container ของเราแล้วครับ จากนี้เราจะมาทำความรู้จักกับ Docker Hub กัน
Docker Hub คืออะไร?
Docker Hub เปรียบเสมือนจุดศูนย์รวมของ Docker image ต่าง ๆ จากทั่วโลกที่กลุ่มคนใช้ Docker แชร์ Docker images ที่ตัวเองสร้างขึ้นให้กับคนทั่วไปได้ใช้นั้นเอง เป็นไงยังไงครับ ดูยิ่งใหญ่มาก ฮ่า ๆ เราสามารถเข้าไปดูได้ที่ เว็บไซต์ Docker Hub

ซึ่งเราสามารถค้นหาชื่อหรือเครื่องที่ใช้ได้เลย อย่างเช่น Tensorflow Jupyter เป็นต้น ซึ่งในบทความนี้เราจะยกตัวการดึง Docker image ของ Jupyter มาใช้กัน

หลังจากที่เราได้ตัว images แล้วให้ทำการดึงลงมาจาก Docker Hub และ รันตัว Docker นั้นโดยใช้คำสั่ง
# -p คือ การ mapping port จากเครื่องเราไปยัง container <Host-port>:<Container-port>
> docker run -p 8888:8888 jupyter/scipy-notebook:17aba6048f44
เมื่อคำสั่งถูกรัน จะสังเกตได้ว่าจะมี container ถูกรันขึ้นมาหนึ่งตัว และเราสามารถเข้าไปตรวจสอบผลลัพธ์ ได้ที่ http://localhost:8888 ผ่านเว็บบราวเซอร์ กันได้เลยครับ


เป็นยังไงกันบ้างครับสำหรับเจ้าตัว Docker ของเราบทความนี้จะเป็นแค่เพียงจุดเริ่มต้นของการใช้งาน Docker สำหรับ Data Science เท่านั้น ถ้าสนใจและอยากรู้ว่า Docker ทำงานอะไรได้อีก ก็อย่างลืมติดตามบทความในตอนหน้านะครับ ขอบคุณครับ