ลองเข้าไปใน Container
จากตอนก่อนๆเราสร้างตัว Container ขึ้นมามากมายหลายตัว คราวนี้หลายคนคงเกิดข้อสงสัยขึ้นมาว่า เฮ้ยจะเข้าไปดูในเครื่อง Container ยังไง เป็นไปได้ไหม ซึ่งคำตอบก็คือได้ เรามาลองกันเลยครับ
EXEC เข้าเครื่องกัน
1 | # สร้างเครื่อง docker |
ซึ่งพอ run คำสั่งด้านบนแล้วเราจะเข้าใน container นั้นแล้วดังภาพ
คราวนี้ลองกดคำสั่งต่างๆใน container ได้เลยครับ เช่น ls , clear และอื่นๆ จะเห็นว่าคำสั่งพื้นฐานของ Linux ได้ คราวนี้ลองคำสั่งพวก vi ดูครับ ซึ่งพอลองแล้วจะเห็นว่าใช้งานไม่ได้ครับ หรือลองพิมพ์คำสั่ง java ดูก็จะพบว่าใช้งานไม่ได้
สร้าง container ขึ้นมาอีกตัว
1 |
|
จากการทดลองด้านบนเราจะเห็นว่ากับ container นี้เราสามารถใช้คำสั่ง java ได้ จากการทดลองนี้ทำให้เราทราบแล้วว่า container แต่ละตัวนั้นมีคำสั่งไม่เท่ากัน อันนี้เป็นผลมาจากเขาสร้าง image เพื่อใช้ในงานต่างกัน เช่น image httpd นั้นเป็น apache ก็ไม่จำเป็นต้องลง java เช่นกัน maven มีไว้ compile java ก็ไม่จำเป็นต้องมี httpd คำสั่งอย่างพวก vi ก็เช่นกันว่าไม่ต้องมีเพราะ container มีไว้ application ไม่มีใครเข้าไปใช้งาน vi อยู่แล้ว
ทำไมต้องลองเข้าไปใน container
จริงๆเราไม่ต้องเข้าไปใน container เลยก็ได้ครับ แต่เพื่อความเข้าใจ Image ที่เขาแจกว่าข้างในมีอะไรบ้าง หรืออยากไปดู config ของเครื่อง หรือตรวจสอบ image ของเราว่าสร้างได้ผลลัพธ์อย่างที่เราต้องการ แต่ที่ใช้งานบ่อยจริงๆคือเข้าไปดู config เช่น เข้าไปดู config ของ httpd ว่าเขาวางไว้ตรงไหน ตั้งค่าไว้ยังไงเป็นต้น เพราะเวลาเราต้องการเอา image ของเขาไป customize ต่อจะได้รู้ว่าต้อง customize ตรงไหน
แก้ไขไฟล์ใน container ไม่ได้ทำยังไง
ลงคำสั่งใน Container สิครับ
ก็อย่างที่บอกไปครับว่า container มันก็คือเครื่องจำลองนั่นแหละครับ ถ้าอยากมี vi ก็ install vi มันเลยสิ แต่การลงก็อาจจะยากหน่อยนะครับ เพราะเราต้องทราบด้วยว่า container ทีเราใช้อยู่เนี่ยเป็น distro ไหนของ linux เพราะแต่ละ distro นั้นลงไม่เหมือนกัน ถ้าเป็น ubuntu ก็ใช้ apt-get install vi แต่ถ้าเป็น CentOS จะต้องใช้ yum install เป็นต้น
1 | # ลง vim บน httpd |
เปิดมาได้หน้าตาแบบนี้
ทำการแก้เป็นแบบนี้
ลองเข้าผ่าน web browser ดู (ตอนผมสั่ง สร้าง docker ตัวนี้ผม bind port 80 ไว้กับเครื่องที่ลง docker เครื่องที่ผมลง docker อยู่ที่ 192.168.56.101)
เอาไฟล์จาก container ออกมาแก้ไข แล้วค่อยส่งกลับเข้าไป
จากวิธีการ Install คำสั่งในเครื่อง container ดูยุ่งยากพอสมควร docker เลยมีช่องทางให้เราสามารถเอาไฟล์จาก container ออกมาได้ และ ทำให้สามารถส่งกลับไปได้ด้วย ซึ่งใช้คำสั่ง
1 | # เอาไฟล์ index.html ออกมาจาก container |
จากนั้นลองเอาไฟล์ออกมาแก้ไขไฟล์ แล้วใส่กลับเข้าไปด้วยคำสั่ง
1 | docker cp /your/file/path/index.html my-httpd:/usr/local/apache2/htdocs/index.html |
จากนั้นลอง Test กับ Browser
Mount ไม่ได้เหรอ
จริงๆมีอีกวิธีที่ทำได้นะครับคือการใช้ Mount volume ( -v ตอนสั่ง docker run) แต่วิธีนี้จะใช้ไม่ได้เมื่อเรา mount volume เข้าไปใน path ที่มี file อยู่แล้วของ container ซึ่งเมื่อทำแบบนั้นข้อมูลใน path นั้นจะหายไป ตัวอย่างเช่น
1 | docker run --name no_mount_httpd -p 80:80 httpd |
จากนั้นลองเข้าดูผ่าน Browser จะได้แบบนี้
จากนั้นทำการ stop no_mount_httpd จากนั้นสั่งคำสั่งต่อไปนี้
1 | mkdir -p /root/share_docker/test_mount_httpd |
จากน้ันทำการเปิด Browser
จะเห็นว่ามีความเปลี่ยนแปลงซึ่งเมื่อเราลอง exec เข้าไปในเครื่องจะเห็นว่าไฟล์ index.html หายเพราะว่าเราทำการ mount /root/share_docker/test_mount_httpd ซึ่งเป็น Directory เปล่าๆเข้าไป map กับ path /usr/local/apache2/htdocs/ จึงทำให้ไฟล์ index.html หายไป จากการทดลองนี้ทำให้เราทราบว่า “เมื่อเรา mount volume อะไรเข้าไปใน container ตอนสั่ง docker run มันจะยึดข้อมูลที่อยู่บนเครื่องที่ลง Docker เป็นหลัก” อย่างในตัวอย่างมันจะยึดข้อมูลที่อยู่ใน /root/share_docker/test_mount_httpd ซึ่งไม่มีข้อมูลอะไรเลยเป็นหลัก
Container ถ้าลบแล้วก็หายไปเลย
ขอให้พึงระลึกไว้เสมอว่า Container ก็เหมือนเครื่องจำลองขึ้นมา เมื่อใดก็ตามที่เราสั่ง docker rm สั่งลบ Container นั้นไป ข้อมูลทั้งหมดที่อยู่ใน Container นั้นจะหายไป (ยกเว้นส่วนที่เราทำการ Mount volume ไว้) ดังนั้นเมื่อคุณแก้อะไรใน Container หรือเพิ่มอะไรเข้าไปใน Container เมื่อคุณลบมันแล้วสร้างมาใหม่ Container ที่สร้างมาใหม่จะไม่มีอะไรที่คุณแก้ไขไว้ใน Container เดิมนะครับ
สรุป
ในตอนนี้เรามาเริ่มเข้าไปใน Container เพื่อดูว่าในเครื่อง container นั้นมีอะไรอยู่บ้าง แล้วเราสามารถแก้ไขอะไรใน Container ได้บ้าง แก้ไขได้ด้วยวิธีใดบ้าง ข้อจำกัดบางประการของการแก้ไข ส่วนตอนต่อไปขอคิดก่อนละกันว่าจะทำ Docker Image หรือลองใช้ Docker compose ดี
โปรโมท Page
ผมทำ Page บน Facebook แล้วนะครับ ใครสนใจรับการแจ้งเตือนเวลาผมอัพเดท Blog ก็ไปกดติดตามกันได้ครับ กดตามลิ้งไปได้เลย Facebook page
ไม่เกี่ยวกับ Docker แต่เกี่ยวกับไอดอล
เช่นเดียวกับตอนที่แล้วอาจจะมีคนสงสัยว่า PIN กับ MARY คือใคร กดตามลิ้งค์ไปได้เลย น้องน่ารักมากๆครับ