วิธีรัน Docker บน WSL ( Windows Subsystem for Linux )
WSL ( Windows Subsystem for Linux ) เป็น kernel Linux ที่พ่วงมากับ Windows 10 เป็นต้นไป ช่วยให้ลูกค้า Windows สามารถรันระบบ Linux ได้ บทความนี้แอดมินจะแนะนำวิธีใช้งาน WSL ตั้งแต่เบื้อต้น ไปจนถึงระดับรัน container ยอดนิยม เช่น Docker ได้เลย ฝากสนับสนุนบริการ www.Limitrack.com เพื่อให้พวกเราได้นำสิ่งดีๆมามอบให้ลูกค้าครับ
- เตรียม WSL
- ติดตั้ง WSL
- ติดตั้ง Windows Terminal
- อัพเดท WSL ให้ใหม่เสมอ
- ติดตั้ง Linux ลง WSL
- กำหนดให้ WSL รันเวอร์ชั่น 2 เป็นค่าเริ่มต้น ( default )
- เตรียม systemd
- ติดตั้ง Docker บน WSL
- ตั้งค่าให้ WSL รัน background และ Auto Run
เตรียม WSL
ติดตั้ง WSL
เริ่มด้วยการพิมพ์ในช่องค้นหาของ Windows ด้วยคำว่า
Turn Windows Features on or off
แล้ว click กดเปิดหน้าต่าง Windows Features ขึ้นมา
ติ๊กถูกหน้า Windows Subsystem for Linux ( WSL )
แล้วกด OK
หลังจากนั้น restart Windows 1 รอบ
ติดตั้ง Windows Terminal
Command Prompt และ Windows Powershell ที่พ่วงมากับ Windows นั้นยังไม่เหมาะกับการใช้ WSL เท่าที่ควร
ดังนั้น Terminal ที่จะใช้ควบคุม WSL ได้ดีที่สุด ( ณ ปี 2024 ) คือ Windows Terminal
เราต้องเข้า Microsoft Store แล้วติดตั้ง Windows Terminal ( ดังภาพ )
หลังจากติดตั้งแล้ว เราจะได้โปรแกรม Windows Termial แบบนี้
นับจากนี้เป็นต้นไป เราจะใช้โปรแกรม Windows Terminal เป็นตัวหลักในการใช้คำสั่ง wsl.exe
เทคนิคเพิ่มเติม เราสามารถปรับแต่ง Windows Terminal ได้โดยกด Settings ( ดังภาพ )
อัพเดท WSL ให้ใหม่เสมอ
เปิดโปรแกรม Windows Terminal แล้วพิมพ์คำสั่งดังนี้
ดูเวอร์ชั่น wsl ที่เราติดตั้ง
wsl -v
ในภาพ WSL ของแอดจะเป็น WSL version 2.1.5.0 ล่าสุด ( ณ 04/2024 ) แล้ว
หาก WSL ยังเป็นเวอร์ชั่นเก่า ลูกค้าพิมพ์คำสั่งอัพเดท WSL ได้ดังนี้
wsl --update
ลูกค้าก็จะได้ WSL ล่าสุดไว้ใช้งาน
ติดตั้ง Linux ลง WSL
เลือกดูรายการ Linux distro ที่เราสามารถติดตั้งลง WSL ได้ด้วยคำสั่งนี้
wsl -l -o
สมมติลูกค้าเลือกติดตั้ง Ubuntu-20.04 ก็พิมพ์คำสั่งนี้
wsl --install Ubuntu-20.04
เริ่มใช้งาน Linux ( ที่เราติดตั้ง )
เปิดโปรแกรม Terminal ขึ้นมาแล้วกดปุ่ม + ด้านบน
แล้วเลือก Linux distro ที่ลูกค้าต้องการ
เริ่มใช้ bash ของ linux ได้ทันที
กำหนดให้ WSL รันเวอร์ชั่น 2 เป็นค่าเริ่มต้น ( default )
หากลูกค้าติดตั้ง WSL ในช่วงแรกๆเมื่อ 1-2 ปีก่อน ( ณ ตอนนี้ 04/2024 ) ลูกค้าจะได้ WSL เวอร์ชั่น 1
ซึ่งปัจจุบัน Microsoft ได้ปล่อย WSL 2 มาแล้ว ซึ่งจะมี feature หลากอย่างที่ดีขึ้นกว่า WSL 1 ( เช่น WSL 2 สามารถรัน systemd ได้ เป็นต้น )
จากตัวอย่างคำสั่งนี้ Linux ที่แอดติดตั้งใน WSL มีทั้งรัน WSL 1 และ WSL 2
ดังนั้น เราควรกำหนดให้ WSL รัน version 2 เป็นค่าเริ่มต้น ( deault ) เสมอ
โดยพิมพ์คำสั่งนี้
wsl --set-default-version 2
คำสั่งด้านล่างนี้ แอดจะกำหนดให้ Debian รัน WSL 2
wsl --set-version Debian 2
ฝากสนับสนุนบริการ www.Limitrack.com เพื่อให้พวกเราได้นำสิ่งดีๆมามอบให้ลูกค้าครับ
เตรียม systemd
ติดตั้ง systemd บน Linux (WSL)
systemd คืออะไร แล้วสำคัญอย่างไร ?
- systemd คือ daemon ของ Linux ที่ทำงาน background หรือเปรียบเสมือนระบบ Services ของ Windows
- application ยอดนิยมที่รันบน Linux เช่น Apache , Nginx , MySQL , PostgreSQL , อื่นๆอีกมากมาย ต้องทำงานบนผ่าน systemd
- ปกติ WSL จะไม่รองรับ systemd จนกระทั่ง Microsoft ประกาศว่า WSL ได้รองรับ systemd ตั้งแต่ version 2 เป็นต้นไป
3 ขั้นตอนการติดตั้ง systemd บน WSL ดังนี้
1. systemd จะรันได้ WSL จะต้องเป็น version 2 ( Windows 22H2 ) เป็นต้นไป
2. ต้องตั้งค่าให้ systemd ทำงานเอง Auto ใน /etc/wsl.conf ( ทำครั้งเดียว )
3. ต้องรีสตาร์ท WSL ใหม่เพื่อให้ systemd เริ่มทำงาน ( systemd จะไม่รัน Auto ถ้า Windows restart , แต่ systemd จะรัน Auto ถ้า Linux เริ่มทำงาน )
1. วิธีอัพเดท WSL 2
ดูได้ที่ http://docs.limitrack.com/books/wsl-windows-subsystem-for-linux/page/wsl-IxF
2. ตั้งค่าให้ systemd ทำงานเอง Auto
สมมติลูกค้าต้องการให้ Ubuntu 22.04 รัน systemd เอง Auto
วิธีคือ เปิดโปรแกรม Windows Terminal แล้วเลือก Ubuntu 22.04
ใน bash shell ของ Ubuntu 22.04 ให้ลูกค้าพิมพ์คำสั่งดังนี้
sudo nano /etc/wsl.conf
แล้วเพิ่ม 2 บรรทัดเข้าไป
[boot]
systemd=true
แล้ว save & exit ( Ctrl+X แล้วกดปุ่ม Y )
3. ต้องรีสตาร์ท WSL ใหม่เพื่อให้ systemd เริ่มทำงาน
ในหน้าต่าง Windows Terminal ( หรือ Powershell ก็ได้ ) ให้พิมพ์คำสั่งนี้เพื่อหยุดการทำงาน WSL
wsl --shutdown
จะพบว่า Linux ทุกตัวหยุดทำงานแล้ว
หลังจากนั้นให้ลูกค้าเปิด Linux ขึ้นมาใหม่ ก็จะพบว่า systemd เริ่มทำงาน Auto เองแล้ว ( ดังภาพ )
sudo systemctl list-units --type=service --state=running
ลูกค้าสามารถรัน application ที่เป็น system daemon อย่างเช่น web server , file server , database server , อื่นๆ ใน WSL ได้เลย
ฝากสนับสนุนบริการ www.Limitrack.com เพื่อให้พวกเราได้นำสิ่งดีๆมามอบให้ลูกค้าครับ
ติดตั้ง Docker บน WSL
ติดตั้ง Docker บน WSL
ขั้นตอนรัน Docker บน WSL
1. ติดตั้ง WSL
2. เปิดการทำงาน systemd
3. ติดตั้ง Docker
4. เพิ่มกลุ่มผู้ใช้งานในกลุ่ม docker
1. ติดตั้ง WSL
ดูวิธีติดตั้ง WSL ที่ เตรียม WSL
2. เตรียม systemd
ดูวิธีติดตั้ง systemd ที่ ติดตั้ง systemd
3. ติดตั้ง Docker
ดูวิธีติดตั้ง Docker ที่ https://docs.docker.com/engine/install/ubuntu/
4. เพิ่มกลุ่มผู้ใช้งานในกลุ่ม docker
หลังจากติดตั้ง docker เสร็จแล้ว เราจะยังรัน docker ไม่ขึ้น โดยจะขึ้น error ดังนี้
วิธีแก้คือ รันคำสั่งนี้
sudo usermod -aG docker $USER
ใช้งาน docker บน WSL ได้แล้ว
ฝากสนับสนุนบริการ www.Limitrack.com เพื่อให้พวกเราได้นำสิ่งดีๆมามอบให้ลูกค้าครับ
ตั้งค่าให้ WSL รัน background และ Auto Run
เราต้องทำให้ WSL ทำงานตลอดเวลา ( background ) และ systemd ทำงานเอง ( Auto Run ) เมื่อ Windows เริ่มต้นใหม่
เทคนิคพิเศษ ! ตั้งค่าให้ Linux รันตลอดเวลา ( bandground ) แม้จะปิดหน้าต่าง Linux Terminal
ปัญหาสำคัญในการรัน systemd บน WSL คือ เมื่อลูกค้าปิดหน้าต่าง Linux Terminal แล้วซักพัก Linux ตัวนั้นก็จะหยุดทำงาน ( Stopped )
นั่นทำให้ systemd หยุดทำงานไปด้วย
ลูกค้าลองปิดหน้าต่าง Linux แล้วรอซักครู่นะพบว่า Linux หยุด Stopped เอง
Trick พิเศษ !
แอดมินค้นหาวิธีแก้ไม่ให้ Linux ( WSL ) หยุดการทำงาน ( Stopped ) เอง ได้โดยใช้เทคนิคการสั่งรัน tmux ค้างไว้ ดังนี้
เปิดหน้าต่าง Linux ที่ลูกค้าใช้งานขึ้นมาซักตัว
1. ติดตั้ง tmux ก่อน โดยพิมพ์คำสั่งนี้
$ sudo apt install tmux
2. สร้าง tmux ไว้ 1 session ( เพื่อให้ tmux ทำงาน background ) โดยพิมพ์คำสั่งนี้
$ nano ~/.bashrc
แล้วพิมพ์ 3 บรรทัดนี้ต่อท้ายล่างสุดของไฟล์ .bashrc
if ! tmux ls > /dev/null 2>&1; then
tmux new -d > /dev/null 2>&1
fi
แล้วกดปุ่ม Ctrl+X และ Y และ Enter เพื่อ save ไฟล์
3. เปิดหน้าต่าง Linux เพิ่มขึ้นมาใหม่ แล้วพิมพ์ดูว่า tmux ถูกสร้าง session ไว้แล้วยัง
$ tmux ls
จะพบว่า tmux ถูกสร้างให้รัน background อย่างน้อย 1 session ทุกครั้งที่เราเปิดรัน Linux
วิธีนี้จะช่วยให้ Linux ไม่หยุดทำงาน ( Stopped ) เมื่อเราปิดหน้าต่าง Linux Terminal
4. ลูกค้าลองปิดหน้าต่าง Linux Terminal แล้วรอซักพัก แล้วพิมพ์คำสั่งนี้ใน Windowns Terminal
ก็จะพบว่า Linux จะ Running ตลอดไป แม้เราจะปิดหน้าต่าง Linux Terminal แล้วก็ตาม
นั่นคือ application & service ทุกๆตัวที่รันบน systemd ก็จะทำงาน background ตลอดไปด้วยเช่นกัน
ฝากสนับสนุนบริการ www.Limitrack.com เพื่อให้พวกเราได้นำสิ่งดีๆมามอบให้ลูกค้าครับ
เทคนิคพิเศษ ! ตั้งค่าให้ wsl รันเองอัตโนมัติ ( auto start ) เมื่อ Windows เริ่มต้นใหม่
[ ก่อนจะทำตามหน้านี้ ]
ลูกค้าต้องทำขั้นตอนนี้ก่อน > เทคนิคพิเศษ ! ตั้งค่าให้ Linux รันตลอดเวลา ( bandground ) แม้จะปิดหน้าต่าง Linux Terminal
ตั้งค่าให้ wsl รันเองอัตโนมัติ ( auto start ) เมื่อ Windows เริ่มต้นใหม่
หากเราต้องการให้ systemd ( ใน WSL ) รันพร้อมๆกันกับ Windows ก็ทำได้เช่นกัน โดยสร้าง Task Schedule เพื่อให้รัน Linux ตอนที่ Windows เริ่มใหม่ ดังนี้
1. เปิดโปรแกรม Task Schedule
2. กด Create Task เพื่อสร้าง Job ใหม่
3. แถบ General ทำตามภาพนี้
4. แถบ Triggers กดปุ่ม New
5. แถบ Action กดปุ่ม New แล้วพิมพ์คำสั่งรัน Linux distro ที่ต้องการนี้ลงไป
C:\Windows\system32\wsl.exe -d Ubuntu-22.04
ต้องแยกระหว่าง wsl.exe และ -d Ubuntu-22.04 ไว้คนละช่อง ดังภาพ
6. หน้า Conditions เอาติ๊กถูกออกให้หมด
7. หน้า Settings ตั้งค่าตามภาพนี้
แล้วกดปุ่ม OK
8. หลังจากลูกค้า restart Windows เมื่อเข้า Windows มาใหม่แล้วจะพบว่า Linux Ubuntu-22.04 รันเอง Auto แล้ว
และ application & service ที่เรารันใน systemd ก็จะทำงานด้วยเช่นกัน
ฝากสนับสนุนบริการ www.Limitrack.com เพื่อให้พวกเราได้นำสิ่งดีๆมามอบให้ลูกค้าครับ