[MSSQL] Deploy SQL Server 2019 container บน RedHat8 + Podman

สำหรับ Blog ตอนนี้ เนื่องจากมี Project ใหม่ทีใช้ SQL SERVER เป็นหลักแล้ว ยังมี VM จาก Project ก่อนที่เป็น RedHat 8 + Podman เป็นมรดกอยู่ครับ ซึ่งเป็นโอกาศที่ดีเลยที่จะทดสอบ SQL SERVER บนระบบปฏิบัติการ RedHat 8 ครับ

ข้อควรระวัง

สำหรับใน 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


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.