Docker Part 2 - Basic Docker

Docker ขั้นพื้นฐาน

หลังจากตอนที่แล้วสอนการลง Docker ไปแล้ว ตอนนี้มาเริ่มใช้งานกันดีกว่า ส่วนใครอยากทราบว่า Docker คืออะไร อันนี้สามารถตามอ่านได้จาก Net ทั่วไป เช่น ของคุณ Rachata Tongpagdee จริงๆเขาสอน Basic ทั้งหมดในนั้นแล้วด้วย ฮ๋าๆๆๆๆ สำหรับผมถ้าพูดง่ายๆมันคือการจำลองเครื่อง server ขึ้นมาให้เราใช้งาน โดยเครื่อง server นั้นเราสามารถกำหนด spec ให้มันได้ว่ามี program อะไร run อยู่ ทำงานอะไรได้บ้าง จริงๆมันก็คล้ายๆ VM นะ แต่อันนี้เบากว่าและเหมือนจะใช้งานง่ายกว่าด้วย

เริ่มใช้งานเบื้องต้น

docker ps

docker ps : เป็นคำสั่งแสดง Container (มองว่าเป็นเครื่องจำลองก็ได้ครับ) ที่เรา Run ไว้ในขณะนี้

1
docker ps

ลองพิมพ์คำสั่งที่ command line, shell, terminal หรืออะไรที่ท่านอยากเรียก ซึ่งเมื่อ Run เสร็จจะได้ผลลัพธ์ดังภาพ หรืออาจไม่เหมือนถ้าท่าน Run docker container ไว้แล้ว หรือ ท่านไม่ได้ Start service docker (ลองสั่ง service docker start) อันนี้อยากให้ลองกดดูก่อนเพื่อจะได้รู้ว่า docker service มัน run อยู่รึเปล่า

docker run

docker run : เป็นคำสั่งสร้าง Container (มองว่าเป็นเครื่องจำลอง) ขึ้นมา

ลองใช้คำสั่งด้านล่างแล้วจากนั้นลองใช้คำสั่ง docker ps เพื่อดูว่ามี Container run ขึ้นมาอีก

1
2
3
4
5
6
7
docker run -d --name server_1 httpd

# -d คือ Option ของ docker run เพื่อให้คำสั่ง docker run มันคืน shell เพื่อให้เราสามารถทำอย่างอื่นได้ ถ้าใครสงสัยลองเอา -d ออกครับ มันจะกิน shell ของคุณ คุณจะทำอย่างอื่นไม่ได้ จนกว่าจะกด Ctrl + C ถึงจะออกมาได้ (กิน shell ศัพท์อย่างบ้านนอก)

# --name คือ คือ option ของ docker run เพื่อตั้งชื่อให้กับ Container โดยตัวอย่างจะตั้งชื่อให้ว่า server_1 โดยหากเราไม่กำหนดชื่อให้มัน มันจะสุ่มตั้งชื่อให้ โดยชื่อตรงนี้ห้ามซ้ำ ถ้าซ้ำมันจะ Error ขึ้นมา

# httpd อันนี้เป็นชื่อ Image (ตัวต้นแบบที่เราจะเอามาสร้างเป็น Container)

จากการ Run docker ps เราจะเห็นข้อมูลที่เพิ่มขึ้นมาครับ โดยแต่ละ Column จะอธิบายเกี่ยวกับ Container ที่ Run อยู่ดังต่อไปนี้

  • CONTAINER ID

มันคือเลขที่ใช้อ้างอิงถึง Container ตัวนี้ เลขนี้มันจะ gen มาให้ ซึ่งการันตีว่าไม่ซ้ำ

  • IMAGE

เป็นตัวบอกว่า Container นี้สร้างมาจากต้นแบบอะไร จากตัวอย่างคือสร้างจากต้นแบบที่ชื่อ httpd (apache นั่นเอง)

  • COMMAND

บอกว่าตัว Container นี้ Run อยู่ด้วยคำสั่งอะไร

  • CREATED

บอกว่าตัว Container นี้ถูกสร้างมาแล้วนานเท่าไหร่

  • STATUS

บอกว่าตัว Container นั้นมีสถานะอะไรอยู่ในปัจจุบัน

  • PORTS

บอกว่าตัว Container มี Port อะไรให้เราสามารถเข้าไปใช้งานได้บ้าง

  • NAMES

บอกว่าตัว Container นี้มีชื่อว่าอะไร ใช้ไว้อ้างอิงแบบเดียวกันกับ Container ID แต่อันนี้ใช้อ้างอิงง่ายกว่า เพราะมันอ่านออก

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

จากนั้นลองสร้าง container ขึ้นมาอีกตามคำสั่งต่อไปนี้

  • docker run -d –name server_1 httpd

คำสั่งนี้จะ Error ครับ พร้อมบอกว่าชื่อ server_1 มีคนใช้ไปแล้ว

  • docker run -d –name server_2 httpd

อันนี้สร้างขึ้นมาได้

ลองใช้ docker ps ดูอีกรอบคราวนี้จะเห็น container สร้างขึ้นมาสองตัวแล้ว

Stop , Start, Remove

เมื่อสร้าง Container มันคล้ายๆเครื่องจำลองดังนั้นมันก็ต้อง ปิด เปิด หรือ ทำลายได้เช่นกัน โดยคำสั่งจะมีประมาณนี้

  • docker stop : เป็นคำสั่งในการหยุดทำงาน Container แค่หยุดนะครับไม่ใช่ทำลาย โดยลองสั่งคำสั่งต่อไปนี้
1
2
3
docker stop server_1

# server_1 คือตัวอ้างอิงไปหา Container ตัวนั้น โดยมันอ้างอิงได้จาก ชื่อ หรือ Container ID ดูได้จาก

มันทำการสั่งเสร็จเราใช้ docker ps อีกครั้งจะเห็นว่า container 1 เราหายไป แต่ไม่ต้องตกใจมันหายไปเพราะ docker ps จะแสดงเฉพาะ Container ที่ทำงานอยู่ ถ้าอยากเห็นหมดต้องสั่ง

1
2
3
docker ps -a

# -a เป็น Parameter ในการ Show Container ทั้งหมด ไม่ว่าจะ Start อยู่หรือ Stop อยู่

  • docker start : เป็นคำสั่งที่สั่งให้ Container เริ่มทำงาน คำสั่งจะคล้ายๆกับ docker stop
1
docker start server_1

พอสั่งแล้วกด docker ps -a ดูอีกรอบจะเห็นว่า Container : server_1 เริ่มทำงานแล้ว

  • docker rm : เป็นคำสั่งทำลาย Container
1
docker rm server_1

พอสั่งแล้วมันจะ Error ครับ เพราะ Container : server_1 มันยัง Run อยู่ครับ ให้ลองสั่ง

1
2
3
4
5
6
7
8
docker stop server_1
docker rm server_1

# หรือลองสั่ง

docker rm -f server_1

# -f คือ parameter เพื่อสั่งให้ลบ container โดยไม่สนว่ามันจะ start อยู่หรือไม่

อ่านมาตั้งนานไม่เห็นได้ลองใช้งานเลย สร้างขึ้นมาทำไม

จริงๆตอนเราสร้าง Container ขึ้นมาคือมันใช้งานได้แล้วล่ะครับ สภาพมันจะเป็นตามภาพ

แต่ที่เราใช้ไม่ได้เพราะเราไม่รู้ว่าเครื่องมันอยู่ตรงไหนครับ (IP Adress) คือเรารู้ที่อยู่เครื่อง Machine ที่เราลงอยู่ครับแต่เราไม่รู้ว่า Container อยู่ตรงไหน ซึ่งจริงๆเรารู้ครับแต่จากการที่เราอยู่นอกวงที่ติดต่อได้ อยู่ Net คนละวง ด้วยความยุ่งยากประมาณนี้ Docker เลยช่วยเราโดยการใช้วิธี Bind port ให้ครับ

มายกตัวอย่างกันตอนนี้ผมสร้าง Container ขึ้นมาตัวนึงชื่อ my_http_server โดยใช้คำสั่ง

1
docker run -d --name my_server httpd

จากการ Run เราจะได้สถานการณ์ประมาณนี้

หลายคนคงบอกว่าเฮ้ยรู้ได้ไงว่า Container เปิด Port 80 สามารถดูได้หลายที่ครับ ที่แรกคือ สั่ง docker ps ครับ หรือเปิด Manual ของ Image ที่เราเอามาใช้ครับ เช่นของผมจะไปอ่านว่าเขาเปิด Port ไหนที่ Link นี้ หรือ มันเป็นเรื่องที่โดยทั่วไปในวงการเช่น httpd เขาก็เปิด 80 อยู่แล้ว อันนี้อาจโหดร้ายกับน้องใหม่ แต่เขาคิดว่ามันธรรมดามากๆจนไม่เขียน แต่ทุกวงการมีเรื่องอย่างนี้หมดครับ อย่าไปใส่ใจมันมาก พออยู่ในวงการไปสักพักจะค่อยๆรู้เอง อย่างวงการไอดอลเขามีขาย “เซกิ” ฟังครั้งแรกนี่งงเลยดิ ฮ่าๆๆๆ

คราวนี้จากภาพเราจะเห็นว่าเรารู้แต่ IP เครื่องที่ลง Docker แต่เราอยากติดต่อเครื่อง Container ที่อยู่ภายในเครื่องนั้นตัว Docker ก็แบบให้เราสามารถทำได้ง่ายๆโดยใช้วิธี Bind port โดยใช้คำสั่ง

1
2
3
4
5
6
7
# กรุณาลบ Container my_server ทิ้งก่อนแล้วค่อยสั่ง

docker run -d --name my_server -p 80:80 httpd

# -p คือ parameter ในการ Bind port โดยในตัวอย่างคือ -p 80:80
# โดย 80 หน้า : หมายถึง port 80 ของเครื่องหลัก
# โดย 80 หลัง : หมายถึง port 80 ของเครื่อง Container

โดยสถานการณ์จากการ run คำสั่งด้านบนจะเป็นดังภาพ คือเครื่อง Machine ทำการ ผูก Port 80 เข้าหากัน

เมื่อเรา Run แล้วลองเข้า Browser แล้วใส่ ip ของเครื่องหลักครับ (กรณีของผมเครื่องหลักอยู่ที่ 192.168.56.101) เราจะได้ผลลัพธ์ดังภาพ

เพื่อความเข้าใจที่มากขึ้นลองทำการ Bind port เครื่องหลักที่ไม่ใช่ 80 ดูกัน

1
2
3
# กรุณาลบ Container my_server ทิ้งก่อนแล้วค่อยสั่ง

docker run -d --name my_server -p 8080:80 httpd

แล้วลองเข้า Browswer แล้วกรอก ip ตามด้วย : port จากตัวอย่างของผมจะเป็น 192.168.56.101:8080

สรุป

ในตอนนี้ผมได้แนะนำวิธีการใช้ docker แบบเบื้องต้นมากๆ ตั้งแต่ Create , Start , Stop, Remove แล้วก็ Bind port ให้สามารถใช้งาน container ผ่านทางเครื่องหลักได้ ในตอนต่อๆไปจะค่อยๆสอนใช้ Docker ไปเรื่อยๆ โดยแนะนำตามที่ผมค่อยๆเรียนรู้และนำไปใช้งานกับงาน สำหรับคนผ่านมาอ่านตอนนี้ผมเปิด Page Facebook แล้วนะครับ ใครเล่น Facebook แล้วอยากได้แจ้งเตือนตอน Update blog ไปกดติดตามกันได้ครับ

เพลงประกอบการเขียน Blog

เพลงเพราะๆของพี่แอน ธิติมา คือฟังเพลงพี่เขามาตั้งแต่เด็กๆ เสียงพี่เขานี่ดึงอารมณ์เพลงได้สุดยอดมากจริงๆ เพลงใสๆหวานๆนี่จะฟินโคตรๆ แต่เพลงเศร้านี่ฟังแล้วดำดิ่งกันสุดๆ