มาใช้ Docker กันเถอะ #2
ต่อจาก Part ที่แล้ว ที่เราได้พูดถึง Concept ของ Docker ไปแล้ว ในส่วนของ Part นี้เราจะมาพูดถึง วิธีการใช้งานกันบ้าง โดยจะเริ่มที่การติดตั้ง เราสามารถ Download และติดตั้ง Docker จาก Website Official ได้เลย
Download and Install Docker
https://docs.docker.com/engine/install/
เมื่อติดตั้งเสร็จแล้วก็ทำการ start ตัว Docker ได้เลย โดยจะสังเกต ได้ว่า Docker Start แล้ว ได้จากสถานะ Running
จากนั้นก็เปิดตัว Terminal ของเราขึ้นมา เพื่อใช้งานได้เลย โดยเราจะเริ่มต้นด้วย การสร้าง Container ขึ้นมา ก่อนอื่นเรามาตรวจดู Container ทั้งหมดที่ทำงานอยู่กันก่อน ด้วย command docker ps
โดยจากรูปจะเห็นว่ามี Container 2 อันที่ทำงานอยู่ “แต่เดี๋ยวอย่าพึ่งสงสัยว่าทำไมของเราไม่เห็นหว่า” พอดีผมได้ทำการรัน Container 2 อันนี้ไว้ก่อนแล้วทำให้อาจจะแตกต่างกับของเพื่อนๆไป นอกจากนี้ในกรณีที่เราอยากดู Conatiner ที่ไม่ได้ทำงานอยู่ ณ ตอนนี้สามารถเพิ่ม option -a เข้าไป เป็น command docker ps -a
จากรูปจะเห็นว่ามี Container ทั้งหมด 5 ตัว แต่ Container ที่ตอนนี้ไม่ได้ทำงาน มี 3 ตัว ทำให้เหลือที่ทำงานอยู่แค่ 2 ตัว ต่อมาเราจะมาเช็คดูว่าเรามี images ที่เปรียบเสมือนแบบแปลนในการสร้าง Container ต่างๆอะไรไว้แล้วบ้างด้วย command docker images
จากรูปจะมีชื่อและ version ของ images ต่างๆที่เราได้ทำการ Download ไว้แล้ว ดังนั้นเราก็สามารถที่จะสร้าง Container จาก images ต่างๆเหล่านี้ได้
ทีนี้ Docker Container ที่ผมสนใจแล้วจะลองสร้างในวันนี้คือ mysql ซึ่งเรายังไม่มี Docker Image นี้อยู่ ฉะนั้นเราต้อง Download มันมาเสียก่อนด้วย commnad docker pull mysql:tag
โดยในที่นี้เราจะไม่ใส่ tag ทำให้ตัว Docker จะทำการ Download image ที่เป็น latest version มาให้
ณ ตอนนี้เราก็ได้ตัวแบบแปลนมาเป็นที่เรียบร้อย “ต่อมาเราก็มาเริ่มสร้าง Container ของเรากันเถอะว่าแต่ต้อง Config อะไรบ้างละ” เราสามารถดูการใช้งาน image หรือ configuration ต่างๆของ image นั้น ได้จาก Docker hub ซึ่งเป็นตัว Docker registry ที่เก็บ image มากมาย
Docker hub
https://hub.docker.com/_/mysql
ในการสร้างตัว Container สามารถทำได้ด้วย command docker run [options] <container_name>
แต่เราสามารถ config container ด้วย options ต่างๆเหล่านี้ได้ (“โดยในที่นี้เอามาแค่บาง option นะ”)
- - - name คือชื่อของ Container ที่เราจะสร้าง
- - e คือกำหนดค่า Environment variable ให้กับ Container
- - v คือการ Map ตัว volume พูดง่ายๆคือการให้ resource ที่อยู่ในเครื่องเรา แชร์ไปอยู่กับ Container (“เดี๋ยวจะขยายความเพิ่มให้นะครับ”)
- - p คือการ Expose port ให้ port ของ container สามารถสื่อสารกับ port ของเครื่องได้ (“เดี๋ยวจะขยายความเพิ่มให้นะครับ”)
- - d คือการที่สร้างและรัน Container ใน Background mode
ขยายความ -v
จากรูปจะเป็นตัวอย่างประกอบการ map volume โดยเราจะมีเหมือนโลก 2 ใบ “เอ๊ะแปลกๆ …เอ้ยไม่ใช่เรื่องอย่างนั้น” โลกในที่นี้คือส่วนที่เป็นของ computer เรา และอีกโลกคือส่วนของ Docker โดยทั้ง 2 โลกนี้จะ Isolate จากกัน ในกรณีที่เราต้องการให้ resource ซึ่งอยู่ใน folder dev ในโลกของ computer มาอยู่ในโลกของ Docker เราสามารถทำได้โดยการ map volume นี้ โดยจะระบุได้ว่าจะให้ไปอยู่ที่ส่วนไหนของโลก Docker ซึ่งในที่นี้ ผมก็มี folder dev ในโลกของ Docker เช่นกัน ก็เลยให้มาอยู่ที่เดียวกัน *** แต่เข้าใจไว้อย่างนะว่าจริงๆ มันไม่ใช่การย้ายของจากโลกหนึ่งมาอีกโลก แต่เหมือนการเปิดประตูมิติระหว่าง 2 โลกให้เชื่อมกันมากกว่า ฉะนั้นถ้ามีการเปลี่ยนแปลงก็จะเกิดขึ้นทั้ง 2 ที่***
ขยายความ -p
โดยจากรูปจะเป็นตัวอย่างของการ expose port โดยในการที่ computer ของเราจะคุยกับ container ได้ เราจะติดต่อผ่าน port ที่ได้ทำการ expose ไว้จากรูป ใน container กล่องบนมีการรันอยู่ที่ port 3306 ภายใน container และ expose port 3307(port computer) มาเพื่อใช้ติดต่อกับส่วนของคอมเรา ในกรณีที่เราต้องการเชื่อมต่อกับ container นี้ เราจะต้องติดต่อผ่าน port 3307 โดยประโยชน์ของการ expose port คือทำให้เราสามารถ เลือกที่จะ expose port แปลกๆแล้วเก็บ port หลักไว้ใช้สำหรับ computer หลักของเราได้ เช่น เรารัน container ด้วย port 3306 ซึ่งเป็น port mysql และ expose port 3307 ทำให้ใน computer ของเราก็ยังใช้งาน port 3306 ได้อยู่
คิดว่าเพื่อนๆน่าจะพอเข้าใจกันแล้ว ทีนี้ผมจะเริ่มสร้างตัว container ของ mysql ต่อเลย โดยผมใช้ command
docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=XXX -d mysql:tag
เมื่อรันเสร็จเราจะได้ผลลัพธ์หน้าตาประมาณนี้
จะเห็นชื่อ container ที่เราสร้าง และก็ port ที่เรา expose มาใช้ในการเชื่อมต่อกับ container ต่อมาเรามาลองทดสอบเชื่อมต่อกับ DB ตัว mysql กันดีกว่าว่ามันทำงานอยู่ ในที่นี้ให้เพื่อนๆเลือกใช้ tools ในการต่อ DB ที่ตัวเองถนัดได้เลย ในที่นี้ผมใช้ Data Grip “ซึ่งผมว่าใช้งานง่ายดีนะ เป็นของ JetBrain โอ้วๆไม่ได้ขายของนะ 555”
จากรูปก็จะเห็นว่าเราต่อ DB ได้เรียบร้อยแล้ว ในที่นี้เราก็ใช้งานตัว DB ผ่าน container โดยไม่ต้อง install DB ใน local แล้ว นอกจากนี้ยังเปลี่ยน version DB ได้ในกรณีที่เรามีหลาย container “ไงละเริ่มเห็นความ Wow!!! ของมันแล้วละสิ จริงๆมันทำได้มากกว่านั้นอีกเยอะ ไม่ว่าจะใช้สร้าง container ของ microservice แล้วให้เชื่อมกับ container ของ DB แล้ว คุยกับอีก microservice อื่นซึ่งเป็น container โดยใช้ network คนละวงกันก็ทำได้ นอกจากนี้ยังมีเรื่อง Dockerfile และ Docker Swarm อื่นๆอีกเป็นต้น”
ซึ่งใน scope ของหัวข้อนี้ ผมแค่อยากให้เพื่อนๆเข้าใจการทำงานของ Docker มากขึ้นในเชิงปฎิบัติ และหวังว่าบทความนี้จะมีประโยชน์ไม่มากก็น้อยกับเพื่อนๆ หรือหากมีส่วนใดผิดพลาดก็ขออภัยนะที่นี้
#ขอแถมให้นิดนึง อันนี้เป็น Cheat Sheet Command ที่ใช้บ่อยๆ
docker ps = แสดง container ที่รันอยู่docker ps -a = แสดง container ที่รันและไม่ได้รันอยูd่ocker stop = stop container ที่รันอยู่docker start = รันตัว container ที่ stop อยู่docker restart = restart ตัว container ที่รันอยู่docker build [options] <path> = สร้างตัว docker image จาก Dockerfiledocker run [options] <image_name> = สร้าง container จาก imagedocker rm = ลบ container ที่ stop docker rmi <image_name> = ลบ image ใน local registrydocker images = แสดงรายการ image ทั้งหมดใน local registrydocker pull <image_name> = download image จาก docker hub registrydocker logs [options] <container_name> = แสดง log ที่เกิดขึ้นของ container docker exec [options] <container_name> [command]= ใช้ execute command ให้กับ container ที่รันอยู่docker inspect <container_name> = แสดงรายละเอียด low-level ของ container
….. From Teeny Backend Developer