在 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,這裡有一個 範例 可以參考

參考資料

https://hub.docker.com/r/microsoft/mssql-server-linux/ https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-connect-and-query-sqlcmd https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-troubleshooting-guide#connection https://github.com/Microsoft/mssql-docker/blob/dc52dd5391fe397455430d04ffeb4ecb547e80fe/linux/preview/Dockerfile#L15

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.