Hướng dẫn Dockerize SQL Server trên Linux: Cấu hình Volume, User và Backup/Restore thực chiến

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Bối cảnh: Tại sao nên đưa SQL Server vào Docker?

Hãy tưởng tượng bạn nhận dự án mới và mất cả buổi sáng chỉ để cài đặt SQL Server, cấu hình instance và xử lý xung đột phiên bản. Với Docker, quy trình này gói gọn trong một câu lệnh. Việc Dockerize SQL Server giúp đồng nhất môi trường từ máy cá nhân lên Staging và Production, loại bỏ hoàn toàn câu nói kinh điển: “Máy em chạy bình thường mà?”

Trước đây, SQL Server gắn liền với Windows Server cồng kềnh. Hiện tại, phiên bản trên Linux chạy cực nhẹ và ổn định. Qua thực tế triển khai, mình thấy container SQL Server khởi động chỉ mất khoảng 15-20 giây, tiêu tốn ít tài nguyên hơn hẳn so với chạy trực tiếp trên Windows.

Cài đặt SQL Server với Docker Compose (V2)

Thay vì dùng lệnh docker run dài dặc và khó nhớ, bạn nên dùng docker-compose.yml. Cách này giúp quản lý cấu hình tập trung và dễ dàng chia sẻ cho đồng đội.

# Tạo không gian làm việc
mkdir mssql-docker && cd mssql-docker
touch docker-compose.yml

Dưới đây là file cấu hình tối ưu. Một lưu ý quan trọng: SQL Server cần ít nhất 2GB RAM để vận hành. Nếu cấp thấp hơn, container sẽ thoát ngay lập tức với mã lỗi không rõ ràng.

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: mssql_db
    restart: always
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_SA_PASSWORD=YourStrong@Password123
      - MSSQL_PID=Developer
    ports:
      - "1433:1433"
    volumes:
      - mssql_data:/var/opt/mssql

volumes:
  mssql_data:

Điểm cần lưu ý:

  • MSSQL_SA_PASSWORD: Mật khẩu phải có chữ hoa, chữ thường, số và ký tự đặc biệt.
  • MSSQL_PID: Chọn bản Developer để có đầy đủ tính năng của bản Enterprise nhưng miễn phí cho mục đích phát triển.

Cấu hình Volume: Tuyệt chiêu giữ dữ liệu an toàn

Dữ liệu trong container sẽ biến mất nếu bạn xóa container mà không dùng Volume. Tuy nhiên, mount dữ liệu trên Linux thường gây lỗi “Permission denied” do vấn đề phân quyền UID.

SQL Server chạy với user mssql có UID là 10001. Nếu bạn dùng Bind Mount (trỏ thẳng vào thư mục trên máy), bạn phải cấp quyền thủ công. Lời khuyên của mình là hãy dùng Named Volume như ví dụ trên để Docker tự quản lý quyền hạn, giúp hệ thống chạy ổn định hơn.

# Nếu bắt buộc dùng bind mount, hãy chạy lệnh này để cấp quyền
sudo chown -R 10001:0 ./mssql-data

Quản lý User: Đừng bao giờ dùng tài khoản SA cho App

Dùng tài khoản sa trong code ứng dụng là một lỗ hổng bảo mật nghiêm trọng. Bạn nên tạo một User riêng với quyền hạn vừa đủ. Hãy truy cập trực tiếp vào container để thực thi lệnh:

docker exec -it mssql_db /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U sa -P 'YourStrong@Password123'

Sau khi kết nối thành công, hãy chạy script sau để khởi tạo database và user mới:

CREATE DATABASE MyProjectDB;
GO
USE MyProjectDB;
CREATE LOGIN app_user WITH PASSWORD = 'AnotherStrongPassword!';
CREATE USER app_user FOR LOGIN app_user;
EXEC sp_addrolemember 'db_owner', 'app_user';
GO

Quy trình Backup và Restore “chuẩn chỉ”

Đừng đợi đến khi mất dữ liệu mới cuống cuồng tìm cách backup. Với Docker, việc sao lưu cực kỳ nhanh gọn thông qua sqlcmd.

1. Backup dữ liệu

Lệnh này sẽ tạo ra một file .bak ngay trong container, sau đó chúng ta sẽ copy nó ra máy thật để lưu trữ:

# Bước 1: Backup trong container
docker exec -it mssql_db /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123' -Q "BACKUP DATABASE [MyProjectDB] TO DISK = N'/var/opt/mssql/MyProjectDB.bak'"

# Bước 2: Copy ra ngoài
docker cp mssql_db:/var/opt/mssql/MyProjectDB.bak ./MyProjectDB_$(date +%F).bak

2. Restore dữ liệu

Khi cần khôi phục dữ liệu ở máy khác, bạn chỉ cần làm ngược lại:

# Copy file vào container
docker cp ./MyProjectDB.bak mssql_db:/var/opt/mssql/

# Chạy lệnh Restore
docker exec -it mssql_db /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123' -Q "RESTORE DATABASE [MyProjectDB] FROM DISK = N'/var/opt/mssql/MyProjectDB.bak' WITH REPLACE"

Kiểm tra trạng thái và Công cụ quản lý

Để biết SQL Server có đang “khỏe” hay không, hãy kiểm tra log thường xuyên. Nếu thấy dòng Service Broker manager has started, nghĩa là mọi thứ đã sẵn sàng.

docker logs -f mssql_db

Về công cụ quản trị, mình khuyên bạn nên dùng Azure Data Studio. Nó nhẹ hơn SQL Server Management Studio (SSMS) rất nhiều và hỗ trợ cực tốt cho Linux lẫn macOS.

Một mẹo nhỏ: Nếu ứng dụng của bạn bị lệch giờ, hãy thêm biến môi trường TZ=Asia/Ho_Chi_Minh vào file Compose. Dù engine SQL Server thường dùng UTC, nhưng việc đồng bộ múi giờ sẽ giúp bạn đối soát log hệ thống dễ dàng hơn nhiều.

Hy vọng những chia sẻ này giúp bạn tự tin hơn khi triển khai SQL Server trên Docker. Cứ mạnh dạn thử nghiệm, vì điểm hay nhất của Docker là nếu sai, bạn chỉ việc xóa đi và làm lại trong vài giây!

Share: