สำหรับ Blog ตอนนี้ เนื่องจากมี Project ใหม่ทีใช้ SQL SERVER เป็นหลักแล้ว ยังมี VM จาก Project ก่อนที่เป็น RedHat 8 + Podman เป็นมรดกอยู่ครับ ซึ่งเป็นโอกาศที่ดีเลยที่จะทดสอบ SQL SERVER บนระบบปฏิบัติการ RedHat 8 ครับ
ข้อควรระวัง
- Container ของ SQL Server 2019 ถูกปรับให้ user เป็น non-root เข้ามาจัดการ ทำให้ยังมี Issue เกี่ยวกับเรื่องสิทธิของการ Mount Volume Unable to run SQL Server 2019 docker with volumes and get ERROR: Setup FAILED copying system data file - Stack Overflow
สำหรับใน Blog ตอนนี้ออกจะเป็นแนว Hack นิดๆ เพราะ เป็นการใช้ SQL Server 2019 container แบบ rootless mode ครับ
เตรียมความพร้อม SQL Server 2019 container (rootless mode)
- มี Internet หรือ Image SQL Server 2019 container โดยสำหรับระบบปฏิบัติการ RedHat SQL Server Red Hat Container
- เพิ่ม User สำหรับจัดการ Container ของ SQL Server 2019 ครับ ต้องกำหนด id ของ user เป็น 10001 เพื่อที่จะได้ Map ชนกับ id ของ user mssql (id = 10001) โดยสามารถทดสอบได้ ตามคำสั่ง ดังนี้ครับ
podman run -it mcr.microsoft.com/mssql/server id mssql
- Script ที่ใช้สร้าง User สำหรับจัดการ Container SQL Server 2019 ชื่อ Group กับ User อันนี้ปรับแก้ได้เลยครับ
#### Add Groups #### groupadd -r -g 20001 invsdbadm #### Add Users #### useradd -u 10001 -g invsdbadm -G invsdbadm invsmssql
- กำหนด Path สำหรับ Mount ระหว่าง Host และ Container โดยที่ Owner ต้องเป็น user id = 10001 โดยใช้คำสั่ง ดังนี้
sudo mkdir -p /var/mssql/data sudo chmod 755 -R /var/mssql/data sudo chown invsmssql /var/mssql/data
ขั้นตอน Deploy SQL Server 2019 container
- Login ด้วย user id=10001 ในที่นี้ invsmssql ครับ
- จากนั้นทดสอบดึง Image จาก Repository ของ RedHat ด้วยคำสั่ง
podman pull mcr.microsoft.com/mssql/rhel/server:2019-latest
- Run Container ขึ้นมา ด้วยคำสั่ง
podman run --userns=keep-id -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=Password1' --name 'MSSQL2019' -p 1433:1433 -v /var/mssql/data:/var/opt/mssql/data:Z -d mcr.microsoft.com/mssql/rhel/server:2019-latest
- สำหรับคำสั่งที่ Run Container ขึ้นมามีการตั้งค่า ดังนี้
- --userns=keep-id : Map id 10001 ของ host กับ user mssql (id = 10001) ของ container
- -e 'ACCEPT_EULA=Y' : ยอมรับในข้อกำหนด ตรงนี้อ่านจาก doc ของ Container ได้ครับ
- -e 'MSSQL_SA_PASSWORD=Password1' : กำหนด Password ของ User SA ในที่นี้กำหนดเป้น Password1
- --name 'MSSQL2019' : ชื่อของ Container ในที่นี้ผมกำหนดชื่อเป็น MSSQL2019
- -p 1433:1433 : Port ที่ให้เชื่อมต่อกับ Network ด้านนอกครับ ในที่นี้ เป็น port 1433 ที่เป็น default ครับ ถ้าอยากแก้ตาม Hardening สามารถปรับ Port ได้เลย เช่น -p 14330:1433 ใช้ Port 14330 ให้เครื่อง Client เข้ามาเชื่อมต่อแทน เป็นต้น
- -v /var/mssql/data:/var/opt/mssql/data:Z : Mount ข้อมูลระหว่าง Host และ Container ครับ
- Host: /var/mssql/data
- Container: /var/opt/mssql/data
- :Z ต้องใส่ เพราะ podman เพื่อให้ไม่ติด SELinux (จริงๆ มันกำหนด Rule เพิ่มได้นะ เดี๋ยวถ้ามีเวลาจะเขียนอีก Blog นึง)
- -d mcr.microsoft.com/mssql/rhel/server:2019-latest ระบุที่อยู่ของ Image ถ้ายังไม่ได้ pull มามันจะไป Download มาให้
- step ทั้งหมด
ทดสอบหลัง Deploy Container
- ตรวจสอบสถานะของ Container ด้วยคำสั่ง
podman ps
invsmssql@tm-cep:~$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7e7e7c80c36 mcr.microsoft.com/mssql/rhel/server:2019-latest /opt/mssql/bin/sq... 2 minutes ago Up 2 minutes ago 0.0.0.0:1433->1433/tcp MSSQL2019
- ลอง Query Default Database ด้วยคำสั่ง
podman exec -it MSSQL2019 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Password1' -Q 'SELECT name FROM master.sys.databases'
invsmssql@tm-cep:~$ podman exec -it MSSQL2019 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Password1' -Q 'SELECT name FROM master.sys.databases' name -------------------------------------------------------------------------------------------------------------------------------- master tempdb model msdb (4 rows affected)
- ตรวจสอบ Path ที่ Mount ว่ามีอะไรบ้าง
- ทดสอบ Connection โดยใช้ user SA ครับ
หมายเหตุ: ถ้า Connect จากเครื่องอื่นเข้ามาไม่ได้ อย่าลืมไปเพิ่ม Rule ใน Firewall-cmd ด้วย เช่น
sudo firewall-cmd --permanent --add-port=1433/tcp sudo firewall-cmd --reload
หรือ ถ้าเปลี่ยน Port เป็น 14330 ใช้คำสั่งนี้
sudo firewall-cmd --permanent --add-port=14330/tcp sudo firewall-cmd --reload
สำหรับ blog ตอนต่อไป เป็นการ Restore DB จากไฟล์ .bak ครับ
Reference
- mssql/rhel/server - Certified Container Image - Red Hat Ecosystem Catalog
- Restore a SQL Server database in Docker - SQL Server | Microsoft Docs
- Unable to run SQL Server 2019 docker with volumes and get ERROR: Setup FAILED copying system data file - Stack Overflow
- Using Volumes with 2019 · Issue #542 · microsoft/mssql-docker · GitHub
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.