เรียนรู้ Docker part 1: Kitematic

Phai Panda
Tech INNO
Published in
6 min readJul 23, 2020

เรื่องมันเริ่มจากไปแอบได้ยินชาวบ้านเขาคุยกัน! ใช้ Docker เป็นไหม รู้จัก Docker Compose ด้วยหรือเปล่า เอาจริงๆใช้งานผมไม่จำ หนนี้เพราะชาวบ้านเขาคุยกันแท้ๆ

Kitematic is a simple application for managing Docker containers on Mac, Linux and Windows.

เพื่อนๆมือใหม่คงจะไม่อื้อหืออื้อหากับ 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

ผล

list all images

ถามหา Docker Container ทั้งหมด

docker container ls -a

ผล

list all containers

ถามหา Docker Container เฉพาะที่กำลังทำงาน

docker container ls

ผลคือยังไม่มีแม้ container เดียวที่ทำงานอยู่ขณะนี้

เทียบกับ Kitematic ก็คือพื้นที่ในกรอบสีแดง

all containers

จากภาพข้างต้น ขอให้มือใหม่สังเกตให้ดีนะครับ 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 ดีกว่าครับ

mssql container is running

ถึงตรงนี้มือใหม่จะพอเห็นภาพว่า ผมได้สั่งให้โปรแกรมฐานข้อมูล 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

ผล

search on Kitematic

หรือจะค้นจาก Docker Hub แบบนี้เลยก็ได้

search on Docker Hub

MySQL Docker Image ที่ปรากฏตามภาพข้างต้นมาจากหน่วยงานที่พัฒนาและปล่อย image นี้สู่สาธารณะโดยตรง เรียกว่า official หรือเป็นทางการ สามารถเชื่อถือได้ มีจำนวนดาวน์โหลด (pull) กว่า 2 ล้านครั้งและชื่นชอบ (ให้ดาวหรือหัวใจ) กว่า 9.8K ครั้ง

โปรดสั่งเกตก่อนจะ pull มาใช้งานว่า มีตัวเลือก … ลองคลิกเข้าไปดูครับ

image option

เขาบอกว่า image นี้มี tag นะ ซึ่งทุก Docker Image ต้องมี tag เสมอ เป็น latest ด้วย หมายความว่า image นี้ติด tag ล่าสุด คำว่าล่าสุดนี้ไม่ได้หมายความว่าเป็นเวอร์ชัน stable มันหมายถึงเวอร์ชันล่าสุดที่ถูกปล่อยออกมา

เขายังบอกอีกว่า image นี้ใช้ network ประเภท bridge อันนี้สำคัญมากแต่ยังไม่ถึงเวลากล่าวถึง สัญญาว่าผมจะบอกหมดที่รู้

ให้เราลองกด latest ครับ

latest image tag

จากภาพปรากฏว่า 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 แล้วกัน

Settings Tab

เลือก 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

ผล

ตอนนี้เราอยู่ใน Linux OS แล้ว

ปกติเมื่อลงโปรแกรมฐานข้อมูล 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;

mydb is created already

หรืออยากดูภายใน
/var/lib/mysql
ก็ทำได้ โดยออกจาก prompt ของ MySQL นี้ก่อน (พิมพ์ exit) จากนั้นพิมพ์
cd /var/lib/mysql แล้ว ls อีกรอบ

ผล

กรอบสีแดงนั่นก็คือโปรแกรม mysql ใน OS ตัวนี้ครับ

กลับมาที่ Kitematic กันบ้าง กดที่ปุ่ม EXEC

มันจะเปิด Terminal (iTerm) หรือ Command Line ขึ้นมา พิมพ์ ls

open terminal (iTerm)

เข้าถึง MySQL ใน Docker Container จากโปรแกรมภายนอก

คงเป็นการยากถ้าเราไม่สามารถคุยกับ MySQL ใน container จากโปรแกรมภายนอกได้ Docker มีหนทางให้ผ่านสิ่งที่เรียกว่า port

ที่แท็บ Settings เลือก Hostname/Ports

host name and ports panel

จากภาพ port หมายเลข 3306 ถูกจับคู่กับ localhost:32773 (PUBLISHED IP) นั่นหมายความว่าหากต้องการคุยกับ MySQL ให้เข้าผ่าน localhost:32773 ตัวอย่างต่อไปนี้จะใช้โปรแกรม DBeaver

ค้นหา mysql จากนั้นเลือก MySQL 8+ เพราะเราใช้ MySQL เวอร์ชัน 8.0.21

เลือก MySQL 8+

ทดลองเชื่อมต่อ

ผล

แก้ไขให้ allow public key

ผล

เชื่อมต่อสำเร็จ
พบ mydb dababase

ประโยชน์อีกอย่างของการใช้งาน Docker Container คือพวกมันแยกจากกัน เราสามารถ START หรือ STOP หรือ RESTART container ที่ต้องการได้ โดยไม่กระทบกับ container อื่นที่ทำงานอยู่ ดังจะเห็นได้ตรงนี้

docker control status buttons

มิหนำซ้ำ image ของมันยังอยู่

จึงนำมาสร้างเป็น container ได้ไม่จำกัด หรือพูดง่ายๆว่าจะมี MySQL เท่าไรก็ได้ แต่โดยทั่วไปไม่ค่อยมีใครสร้าง container หลายตัวจาก image tag เดียวกัน มักสร้าง container จาก image ที่ต่าง tag (ต่างเวอร์ชัน) กันมากกว่าครับ

สรุป

Kitematic ทำให้เราสามารถใช้งาน Docker ผ่าน GUI ได้อย่างง่ายดาย ยิ่งเพื่อนๆมีทักษะการใช้ Docker ผ่าน Command Line มาบ้างแล้วก็จะสามารถสร้างและจัดการ container ได้ในทันที มีรายละเอียดข้อมูลพื้นฐานของ container ที่จำเป็นให้อีกด้วย

แล้วพบกันใหม่จ้า

--

--