Error message

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls in menu_set_active_trail() (line 2404 of /usr/share/drupal7/includes/menu.inc).

在 Docker 中使用 Linux 版微軟 Microsoft SQL Server

最近向我尋求顧問諮詢的組織單位中,其中一個再也受不了微軟的天價授權費勒索,打算用 Linux (Ubuntu) 替換掉所有 Windows Server。用 PHP、Java 以及其他跨平台語言撰寫的服務要轉移很容易。但是其中一些系統使用 MicroSoft SQL Server 作為資料庫。
治本的方法是轉移到 MySQL、MariaDB 或其他 OpenSource 資料庫系統,但那需要時間來處理所有 schema 以及 query 的轉換。
另一個方法是在 Docker 中使用 Linux 版微軟 Microsoft SQL Server 作為暫時性的過渡時期解法。

環境: Ubuntu 16.04

執行 docker image

取得並執行

$ docker run --name mssql-server-linux -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -d microsoft/mssql-server-linux

檢查是否執行成功

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c73a9a4d0ef microsoft/mssql-server-linux "/bin/sh -c /opt/m..." 25 minutes ago Up 25 minutes 0.0.0.0:1433->1433/tcp mssql-server-linux

連線並執行 T-SQL 查詢

一旦執行起來後,你可以使用內建的 mssql tools 連線

docker exec -it mssql-server-linux /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password'

>1

試著執行一些查詢:建立資料酷、查詢資料庫、建立資料表、新增資料、查詢資料

1> SELECT Name from sys.Databases;
2> GO
Name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
master                                                                                                                          
tempdb                                                                                                                          
model                                                                                                                           
msdb                                                                                                                            

(4 rows affected)
1> CREATE DATABASE testdb;
2> GO
1> USE testdb;
2> GO
Changed database context to 'testdb'.
1> CREATE TABLE inventory (id INT, name NVARCHAR(50), quantity INT);
2> GO
1> INSERT INTO inventory VALUES (1, 'banana', 150);
2> INSERT INTO inventory VALUES (2, 'orange', 154);
3> GO
(1 rows affected)

(1 rows affected)
1> SELECT * FROM inventory WHERE quantity > 152;
2> GO
id          name                                               quantity   
----------- -------------------------------------------------- -----------
          2 orange                                                     154

(1 rows affected)
1> QUIT

其他資訊

Data 資料目錄的儲存路徑 root@7c73a9a4d0ef:~# ls /var/opt/mssql/data/

master.mdf   model.mdf     msdbdata.mdf  tempdb.mdf   testdb.mdf
mastlog.ldf  modellog.ldf  msdblog.ldf   templog.ldf  testdb_log.ldf

在官方的 Dockerfile 設定檔中,我們可以發現並沒有 entrypoint.sh MSSQL server 是在 docker instance 開機後直接被呼叫執行啟動的 CMD /opt/mssql/bin/sqlservr.sh

如果你想要以這個 image 延伸建立你的應用程式專案,並有自己的 entrypoint.sh,這裡有一個 範例 可以參考

參考資料

Add new comment