Docker Part 4 - Inside Docker

ลองเข้าไปใน Container

จากตอนก่อนๆเราสร้างตัว Container ขึ้นมามากมายหลายตัว คราวนี้หลายคนคงเกิดข้อสงสัยขึ้นมาว่า เฮ้ยจะเข้าไปดูในเครื่อง Container ยังไง เป็นไปได้ไหม ซึ่งคำตอบก็คือได้ เรามาลองกันเลยครับ

EXEC เข้าเครื่องกัน

1
2
3
4
5
6
7
8
9
10
# สร้างเครื่อง docker
docker run -d --name my-httpd -p 80:80 httpd

# ลองเข้าเครื่อง container ด้วยคำสั่งนี้

docker exec -ti my-httpd bash

# exec เป็นคำสั่งที่สั่งให้ run คำสั่งที่อยู่ใน container จากตัวอย่างคือสั่งใช้งานคำสั่ง bash
# -t อันนี้เป็น options ที่ทำการสร้าง tty มองว่าทำให้เราสามารถพิมพ์และแสดงผลแบบ shell ได้
# -i อันนี้เป็น options ให้ทำให้เราเปิด std in ค้างไว้รอ แม้จะไม่ส่งอะไรเข้าไปก็ตาม

ซึ่งพอ run คำสั่งด้านบนแล้วเราจะเข้าใน container นั้นแล้วดังภาพ

คราวนี้ลองกดคำสั่งต่างๆใน container ได้เลยครับ เช่น ls , clear และอื่นๆ จะเห็นว่าคำสั่งพื้นฐานของ Linux ได้ คราวนี้ลองคำสั่งพวก vi ดูครับ ซึ่งพอลองแล้วจะเห็นว่าใช้งานไม่ได้ครับ หรือลองพิมพ์คำสั่ง java ดูก็จะพบว่าใช้งานไม่ได้

สร้าง container ขึ้นมาอีกตัว

1
2
3
4
5
6
7
8
9
10
11

docker run -ti --name maven maven bash

# bash ตัวท้ายสุดในคำสั่ง docker run มีควาหมมายว่า เราจะ run คำสั่งอะไรใน container นี้ โดยจากตัวอย่างเราสั่งใช้งานคำสั่ง bash
# จริงๆตรงนี้ไม่ได้หมายความว่าส่งคำสั่งเข้าไปอย่างเดียวนะครับ มันมีเงื่อนไขของมันเดี่ยวอธิบายในบทที่เราสร้าง image กัน

docker exec -ti maven bash

# ลองพิพม์

java

จากการทดลองด้านบนเราจะเห็นว่ากับ 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
2
3
4
5
6
7
8
9
10
11
12
# ลง vim บน httpd
# ขอ ลง vim แทนละกัน ลง vi ไม่ได้

docker exec -ti my-httpd bash
apt-get update
apt-get install vim

vim /usr/local/apache2/htdocs/index.html

# path : /usr/local/apache2/htdocs/ เป็น path ที่ image httpd นี้ใช้เป็นที่เก็บไฟล์ที่จะให้บริการกับ client
# เวลาเรียกใช้งาน httpd โดยเราจะแก้ไฟล์ index.html ให้เป็นอย่างอื่น เพื่อตรวจสอบดูว่าเวลาแก้ไขไฟล์นี้แล้ว
# เวลาเรียกใช้งานมันจะเปลี่ยนไหม

เปิดมาได้หน้าตาแบบนี้

ทำการแก้เป็นแบบนี้

ลองเข้าผ่าน web browser ดู (ตอนผมสั่ง สร้าง docker ตัวนี้ผม bind port 80 ไว้กับเครื่องที่ลง docker เครื่องที่ผมลง docker อยู่ที่ 192.168.56.101)

เอาไฟล์จาก container ออกมาแก้ไข แล้วค่อยส่งกลับเข้าไป

จากวิธีการ Install คำสั่งในเครื่อง container ดูยุ่งยากพอสมควร docker เลยมีช่องทางให้เราสามารถเอาไฟล์จาก container ออกมาได้ และ ทำให้สามารถส่งกลับไปได้ด้วย ซึ่งใช้คำสั่ง

1
2
3
4
5
6
7
# เอาไฟล์ index.html ออกมาจาก container
docker cp my-httpd:/usr/local/apache2/htdocs/index.html .

# docker cp เป็นคำสั่ง copy file จาก source ไปหา destiantion ว่าง่ายๆ เหมือน cp เลยแหละ โดยจะเอาเข้าหรือเอาออกจาก
# container ให้ดูที่ : อยู่กับตัวไหนตัวนั้นหมายถึง container โดยจากตัวอย่างข้างบนหมายถึง
# เอาไฟล์ที่ path : /usr/local/apache2/htdocs/index.html
# บน container my-httpd ออกมาไว้ที่ current directory ของเครื่องที่ลง Docker

จากนั้นลองเอาไฟล์ออกมาแก้ไขไฟล์ แล้วใส่กลับเข้าไปด้วยคำสั่ง

1
2
3
docker cp /your/file/path/index.html  my-httpd:/usr/local/apache2/htdocs/index.html 

# คำสั่งนี้เป็นการ copy file จากเครื่องที่ลง docker ไปวางที่ /usr/local/apache2/htdocs/index.html ของ container my-httpd

จากนั้นลอง 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
2
3
4
mkdir -p /root/share_docker/test_mount_httpd
docker run --name mount_httpd -p 80:80 -v /root/share_docker/test_mount_httpd:/usr/local/apache2/htdocs/ httpd

# Mount ไปที่ /usr/local/apache2/htdocs/ เพราะ image httpd เขากำหนดให้ path นี้เป็น path จะไว้เก็บไฟล์ไว้ให้ Httpd serve ไฟล์ให้ client ใช้งาน

จากน้ันทำการเปิด 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 คือใคร กดตามลิ้งค์ไปได้เลย น้องน่ารักมากๆครับ

Pin

Pin

Mary

Mary