เรียนรู้ Docker part 1: Kitematic
เรื่องมันเริ่มจากไปแอบได้ยินชาวบ้านเขาคุยกัน! ใช้ Docker เป็นไหม รู้จัก Docker Compose ด้วยหรือเปล่า เอาจริงๆใช้งานผมไม่จำ หนนี้เพราะชาวบ้านเขาคุยกันแท้ๆ
เพื่อนๆมือใหม่คงจะไม่อื้อหืออื้อหากับ Docker อีกแล้ว เดาว่า Dockerfile, Docker Image, Docker Container เหล่านี้รู้จักเป็นอย่างดี ผมเองก็ใช้ Docker มาบ้างแต่ไม่ลึกล้ำ เคยได้พบจอมยุทธ์ outsource ท่านหนึ่งสอนวิชา Docker เหยียบเมฆา ป๊ะ!หมอนี่บ้าปะเนี่ย? กล่าวคือประทับใจ ในตาเขาดุจมีน้ำใสๆไหลอยู่ภายใน (สงสัยปัญหาทางบ้าน) เวลาคุยกันเรื่อง Docker มันรู้สึกลึกตื่นหนาบางอย่างไรบอกไม่ถูก คำหนึ่งที่จอมยุทธ์ท่านนั้นกล่าวมา เขาว่า “ติดใจ”
เป็นปกติที่เราใช้ Docker ผ่าน Command Line ทว่าหนนี้ผมอยากนำเสนอ GUI ไปพร้อมกันครับ มันจะได้น่าสนใจ (หรือเปล่า) ขึ้นอีกนิด ตัวที่เลือกคือ Kitematic
เครื่องมือ (Tools)
- ติดตั้ง Docker สำหรับเครื่อง Mac ที่นี่, แต่ถ้าเครื่อง Windows ก็ที่นี่ (อย่าลืมดูหัวข้อ System Requirements นะ)
- Docker ที่ถูกพัฒนาจะมีรุ่น stable กับ edge ก็แนะนำให้ลงรุ่น stable แต่ถ้าอยากลองของใหม่ที่อยู่ระหว่างการพัฒนาและเก็บ bug ก็จัด edge ได้ครับ
- GUI มีหลายจ้าวน่าสนใจ แต่ค้น Google แล้วได้จ้าวนี้มาอันดับต้นๆ เขาชื่อ Kitematic ให้ติดตั้งหลังจากติดตั้ง Docker เรียบร้อยแล้ว
- ในเวลาที่กำลังเขียนบทความนี้ Docker หรือชื่อยาวหน่อยว่า Docker Desktop ในรุ่น edge นั้นมี GUI ที่พวกเขาอยากนำเสนอชื่อ Docker Desktop Dashboard ซึ่งจะมาแทน Kitematic
As a result, we plan on achieving feature parity and archiving the Docker Kitematic Project during 2020. After we archive the Kitematic Project there will be no new releases of Kitematic. (อ้างอิง)
Kitematic
Kitematic คือเครื่องมือ Graphical User Interface (GUI) ใช้กับ Docker เป็น open source ใช้งานได้ฟรี ตัวมันเน้นไปที่การแสดงสถานะของประดา Docker Container
หลังจากดาวน์โหลดและติดตั้ง (แน่นอนว่าต้องภายหลังติดตั้ง Docker Desktop เสร็จแล้ว) เราจะพบหน้ารวม (all) ที่หน้านี้แสดงกลุ่มของ Docker Image จำนวนหนึ่งและยังมีช่องให้ค้นหา Docker Image ด้วย
บอกกับมือใหม่ก่อนว่าหัวใจของ Docker ก็คือ Docker Container ที่สามารถทำงานได้ เราสามารถสร้าง Docker Container จาก Docker Image และเราสามารถหา Docker Image ได้ที่ Docker Repository หรือที่เรียกว่า Docker Hub
Docker Hub เป็นทั้งที่เก็บ (repository) และแจกจ่าย (sharing) Docker Images เราสามารถ push (เอาไปเก็บ) และ pull (เอามาใช้) Docker Image ได้ทั้งในนามของเราหรือองค์กร
ผมไม่ได้ติดตั้ง Docker ครั้งแรกเมื่อใช้ Kitematic และบทความนี้ก็เพิ่งมาเขียน ฉะนั้นผมจะมี Docker Image อยู่บ้างแล้ว เรามาเริ่มไปพร้อมกันครับ
ถามหา Docker เวอร์ชัน
docker -v
ผล
Docker version 19.03.8, build afacb8b
ถามหา Docker Images ที่อยู่ในเครื่อง
docker image ls
ผล
ถามหา Docker Container ทั้งหมด
docker container ls -a
ผล
ถามหา Docker Container เฉพาะที่กำลังทำงาน
docker container ls
ผลคือยังไม่มีแม้ container เดียวที่ทำงานอยู่ขณะนี้
เทียบกับ Kitematic ก็คือพื้นที่ในกรอบสีแดง
จากภาพข้างต้น ขอให้มือใหม่สังเกตให้ดีนะครับ Docker Image กับ Docker Container มันไม่เหมือนกัน ตัว Docker Image จะใช้ทำงานไม่ได้ ต่างจาก Docker Container ซึ่งจะสามารถทำงานได้หรือจะให้หยุดทำงานก็ได้ กรณีของผมจากในภาพคือมี Docker Container เพียงตัวเดียวและไม่ได้ทำงาน
สั่งให้ Docker Container ทำงาน
เราสามารถสั่งให้ Docker Container ใดๆทำงานได้ด้วยคำสั่งต่อไปนี้
docker container start [OPTIONS] CONTAINER [CONTAINER...]
จากตัวอย่างผมมี mssql container ที่ถูกสร้างไว้แล้ว ผมจะสั่งให้มันทำงานก็ว่า
docker container start mssql
เมื่อ
- CONTAINER คือชื่อ container ว่า mssql
ผลมันจะแจ้งแค่ชื่อของ Docker Container นั้นกลับมา ให้ลองไปดูที่ Kitematic ดีกว่าครับ
ถึงตรงนี้มือใหม่จะพอเห็นภาพว่า ผมได้สั่งให้โปรแกรมฐานข้อมูล MS SQL Server ทำงาน ไม่เห็นจะมีอะไรแปลกใหม่ ก็เหมือนกับติดตั้ง MS SQL Server ลงในเครื่องธรรมดานั่นแหละ ถูกต้องครับ แต่อยากให้สังเกตอีกนิดว่าตัว MS SQL Server นั้นถูกติดตั้งลงในระบบปฏิบัติการ Linux สภาพแวดล้อมมันเป็น Linux ไม่ใช่ MacOS ที่ผมกำลังใช้งานอยู่นี้
นั่นเท่ากับว่าเราสามารถเลือกโปรแกรมที่ชอบกับ OS ที่ใช่มาใช้งานผ่าน Docker ได้ยังไงล่ะ มันดียังไงน่ะเหรอ เบื้องต้นให้คิดว่าเราพัฒนาโปรแกรมอยู่ที่เครื่องของเรา มีทั้งเว็บ API ฐานข้อมูลและอื่นๆ เมื่อพัฒนาแล้วเสร็จหรือต้องการทดสอบโปรแกรมบนระบบของเครื่อง server (อาจเป็น on cloud หรือ on premise) สิ่งที่เรามุ่งหมายคือมันต้องสามารถทำงานได้ไม่ต่างจากที่รันบนเครื่องของเราจริงไหม แล้วพอจะมีทางไหนการันตีเรื่องนี้ได้? บางคนบอกก็ผลการทดสอบไง นั่นก็ถูก แต่คงดีกว่านี้ถ้าสามารถจำกัดขอบเขตของปัญหาที่อาจจะเกิดขึ้นให้แคบลงด้วยการควบคุมสภาพแวดล้อมในการพัฒนา ผมอยากบอกว่า Docker มาพร้อมกับความสามารถนั้นครับ
ค้นหา Docker Image
เราจะค้นหา MySQL Docker Image จาก Docker Hub ผ่าน Kitematic พิมพ์ไปว่า
mysql
ผล
หรือจะค้นจาก Docker Hub แบบนี้เลยก็ได้
MySQL Docker Image ที่ปรากฏตามภาพข้างต้นมาจากหน่วยงานที่พัฒนาและปล่อย image นี้สู่สาธารณะโดยตรง เรียกว่า official หรือเป็นทางการ สามารถเชื่อถือได้ มีจำนวนดาวน์โหลด (pull) กว่า 2 ล้านครั้งและชื่นชอบ (ให้ดาวหรือหัวใจ) กว่า 9.8K ครั้ง
โปรดสั่งเกตก่อนจะ pull มาใช้งานว่า มีตัวเลือก … ลองคลิกเข้าไปดูครับ
เขาบอกว่า image นี้มี tag นะ ซึ่งทุก Docker Image ต้องมี tag เสมอ เป็น latest ด้วย หมายความว่า image นี้ติด tag ล่าสุด คำว่าล่าสุดนี้ไม่ได้หมายความว่าเป็นเวอร์ชัน stable มันหมายถึงเวอร์ชันล่าสุดที่ถูกปล่อยออกมา
เขายังบอกอีกว่า image นี้ใช้ network ประเภท bridge อันนี้สำคัญมากแต่ยังไม่ถึงเวลากล่าวถึง สัญญาว่าผมจะบอกหมดที่รู้
ให้เราลองกด latest ครับ
จากภาพปรากฏว่า latest ก็คือเวอร์ชัน 8.0.21
เราสามารถเลือก pull เวอร์ชันใดก็ได้ที่ใช่ สมมติผมไม่คิดมาก เอา latest นี่แหละ งั้นกลับมากดปุ่ม CREATE ได้เลย
ผล
ไปดูที่ command บ้าง
docker container ls -a
สิ่งที่อยากให้สังเกต
- CONTAINER ID คือ ID ของ container ตัวนี้
- IMAGE ประกอบด้วย 2 ส่วนคือ image name กับ tag คั่นด้วยเครื่องหมาย :
- CREATED เวลาที่ได้สร้าง container ตัวนี้ (จาก image ที่ได้ pull มาเก็บไว้)
- STATUS บอกสถานะว่าทำงานอยู่หรือไม่ ให้รู้ 2 สถานะเบื้องต้นก่อน ได้แก่ Up หมายถึงทำงานปกติ กับ Exited หมายถึงไม่ได้ทำงาน
- PORTS คือช่องทางการสื่อสารระหว่างโปรแกรมที่อยู่ภายใน container กับภายนอก
- NAMES คือชื่อของ container นี้ สามารถใช้แทน container id ได้ ดังนั้นชื่อนี้ต้องไม่ซ้ำกันเลย
ทำงาน (รัน) Docker Container
MySQL Docker Container ยังไม่ถูกทำงาน แม้เราพยายามกดปุ่ม START เท่าใดก็ไม่เป็นผล นั่นเพราะมันแจ้งเราว่าต้องกำหนดค่าให้กับหนึ่งใน 3 ตัวแปรต่อไปนี้เสียก่อน
- MYSQL_ROOT_PASSWORD คือกำหนดรหัสผ่านเอง
- MYSQL_ALLOW_EMPTY_PASSWORD คือกำหนดว่าไม่ใส่ password ก็ได้
- MYSQL_RANDOM_ROOT_PASSWORD ให้ MySQL สุ่มรหัสผ่านให้
ผมเลือกกำหนด MYSQL_RANDOM_ROOT_PASSWORD แล้วกัน
เลือก container ชื่อ mysql กดแท็บ Settings ส่วนของ Environment Variables เพิ่มตัวแปร MYSQL_RANDOM_ROOT_PASSWORD กำหนดค่าเป็น y แล้วกด SAVE
ผล
กลับไปที่แท็บ Home เราจะพบว่ารหัสผ่านถูกสุ่มสร้างให้แล้ว ส่วนโปรแกรม mysql นั้นอยู่ที่
/var/lib/mysql
ซึ่งอยู่ภายใน container ที่กำลังทำงานอยู่ตอนนี้
แล้วจะเข้าใช้งาน MySQL นี้อย่างไร?
ใช้งาน MySQL ใน Docker Container
แต่ละ container ที่ได้ก็มีวิธีการใช้งานแตกต่างกันไปขึ้นอยู่กับว่ามันทำหน้าที่อะไรในงานของเรา สำหรับ MySQL นี้เป็นฐานข้อมูล ดังนั้นเราคงอยากจะสร้างฐานข้อมูลและตารางถูกไหม
ให้มองว่าแต่ละ container นั้นมีระบบปฏิบัติการ (OS) เป็นของตนเอง ส่วนมากจะเป็น Linux เราก็ต้องมีความเข้าใจสถาปัตยกรรมของมันด้วย มือใหม่ที่ใช้งาน Windows ก็จะมองหา ไดรฟ์ C หรือไดรฟ์ D ส่วนคนใช้ Mac ก็จะมองหา root ไม่ก็ home อย่างไรก็ตาม Docker มีวิธีการให้เราสามารถเข้าไปใช้งานระบบปฏิบัติการที่อยู่ภายใน container ที่กำลังทำงานอยู่
ด้วยคำสั่ง
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
เช่น
docker exec -it mysql /bin/bash
เมื่อ
- CONTAINER คือชื่อ container ชื่อ mysql
- COMMAND ข้างต้นประกอบด้วย path และโปรแกรมชื่อ bash ภายใน Linux
- ส่วน -it ประกอบจาก 2 options ได้แก่ -i กับ -t
ผล
ปกติเมื่อลงโปรแกรมฐานข้อมูล MySQL ใน Windows มันจะถูก set path ให้เลย นั่นหมายความว่าสามารถเรียกใช้ mysql ได้ทุกที่ เป็นต้นว่า
mysql -u root -p
เมื่อ
- root คือ username แรกเริ่ม
ใน Linux ไม่ต่างกัน ผลคือ
จากนั้นให้เราใส่รหัสผ่านที่มันสุ่มมาให้
ผมได้: iexohphivaishaMohRoos2Eigheibeid
ของเพื่อนๆก็จะต่างกันออกไป
ผล
ลองสร้างฐานข้อมูลชื่อ mydb
CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_general_ci;
ผล show databases;
หรืออยากดูภายใน
/var/lib/mysql
ก็ทำได้ โดยออกจาก prompt ของ MySQL นี้ก่อน (พิมพ์ exit) จากนั้นพิมพ์cd /var/lib/mysql
แล้ว ls
อีกรอบ
ผล
กรอบสีแดงนั่นก็คือโปรแกรม mysql ใน OS ตัวนี้ครับ
กลับมาที่ Kitematic กันบ้าง กดที่ปุ่ม EXEC
มันจะเปิด Terminal (iTerm) หรือ Command Line ขึ้นมา พิมพ์ ls
เข้าถึง MySQL ใน Docker Container จากโปรแกรมภายนอก
คงเป็นการยากถ้าเราไม่สามารถคุยกับ MySQL ใน container จากโปรแกรมภายนอกได้ Docker มีหนทางให้ผ่านสิ่งที่เรียกว่า port
ที่แท็บ Settings เลือก Hostname/Ports
จากภาพ port หมายเลข 3306 ถูกจับคู่กับ localhost:32773 (PUBLISHED IP) นั่นหมายความว่าหากต้องการคุยกับ MySQL ให้เข้าผ่าน localhost:32773 ตัวอย่างต่อไปนี้จะใช้โปรแกรม DBeaver
ค้นหา mysql
จากนั้นเลือก MySQL 8+ เพราะเราใช้ MySQL เวอร์ชัน 8.0.21
ทดลองเชื่อมต่อ
ผล
แก้ไขให้ allow public key
ผล
ประโยชน์อีกอย่างของการใช้งาน Docker Container คือพวกมันแยกจากกัน เราสามารถ START หรือ STOP หรือ RESTART container ที่ต้องการได้ โดยไม่กระทบกับ container อื่นที่ทำงานอยู่ ดังจะเห็นได้ตรงนี้
มิหนำซ้ำ image ของมันยังอยู่
จึงนำมาสร้างเป็น container ได้ไม่จำกัด หรือพูดง่ายๆว่าจะมี MySQL เท่าไรก็ได้ แต่โดยทั่วไปไม่ค่อยมีใครสร้าง container หลายตัวจาก image tag เดียวกัน มักสร้าง container จาก image ที่ต่าง tag (ต่างเวอร์ชัน) กันมากกว่าครับ
สรุป
Kitematic ทำให้เราสามารถใช้งาน Docker ผ่าน GUI ได้อย่างง่ายดาย ยิ่งเพื่อนๆมีทักษะการใช้ Docker ผ่าน Command Line มาบ้างแล้วก็จะสามารถสร้างและจัดการ container ได้ในทันที มีรายละเอียดข้อมูลพื้นฐานของ container ที่จำเป็นให้อีกด้วย
แล้วพบกันใหม่จ้า