版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。歡迎通路我的部落格 https://blog.csdn.net/smooth00/article/details/82884538
很多人不知道SqlServer還有Linux版的,微軟官方于2016年就釋出了SqlServer 2017 for Linux,使得SqlServer資料庫可以運作在Linux核心的伺服器上。按照微軟官方的解釋,SQL Server 2017 在所有支援的平台(包括 Linux)上具有相同的基礎資料庫引擎。 是以,在 Linux 上,許多現有功能運作方式相同。既然有了Linux版,那麼就應該在Docker Hub上能找到對應的Docker鏡像:
https://hub.docker.com/r/microsoft/mssql-server-linux/要使用容器,我們先需要安裝一下基礎環境:
1. 安裝docker要使用centos 7以上版本,使用centos 6及以下版本會出現各種問題
2. docker CE安裝過程
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #建立倉庫
$ sudo yum install docker-ce #安裝docker
$ sudo systemctl start docker #開啟docker
3. dockerfile準備
開始建構一個基于項目應用的SqlServer容器,首先我們標明基礎鏡像:microsoft/mssql-server-linux:2017-latest,然後我們需要有個初始化資料腳本(開發人員會提供),往生成的容器中導入我們的項目資料。這個腳本的開頭部分大概是這樣:
USE [master]
GO
/****** Object: Database [LayIM] Script Date: 2017/2/24 9:39:19 ******/
CREATE DATABASE [LayIM]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'LayIM', FILENAME = N'/var/opt/mssql/data/LayIM.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'LayIM_log', FILENAME = N'/var/opt/mssql/data/LayIM_log.ldf' , SIZE = 1280KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [LayIM] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [LayIM].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
--修改現有databases的排序規則
ALTER DATABASE [LayIM]
COLLATE Chinese_PRC_CI_AS
GO
--以下省略SQL腳本
我們可以看出以上腳本,和windows下最大的不同是,資料檔案路徑FILENAME配置成Linux下的路徑了,另外修改了資料庫的排序規則,用簡體中文的規則(對于Linux下來說,編碼規則要特别強調,否則就容易出現中文亂碼),為了避免在Linux檢視SQL腳本出現中文亂碼,建議sql腳本也用編輯器儲存為UTF-8格式(windows下生成的腳本預設是ANSI/ASCII格式)。
其次,我們需要把啟動SqlServer和初始化導入資料的批處理寫到一個腳本中,如setup.sh:
#!/bin/bash
set -e
#設定語言為簡體中文
/opt/mssql/bin/mssql-conf set language.lcid 2052
echo '1.啟動mssql....'
#啟動mssql
/opt/mssql/bin/sqlservr
sleep 3
ps -ef|grep sqlservr
echo '2.開始導入資料....'
#導入資料
if [ -d /var/opt/mssql/data/LayIM.mdf ] ; then
echo '3.資料庫已存在,中止導入....'
else
/opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U "sa" -P "yourStrong(!)Password" -d "Database" -i "/home/mssql/schema.sql" -o /home/mssql/initsql.log
echo '3.導入資料完畢....'
fi
#sleep 3
echo 'mssql容器啟動完畢,且資料導入成功'
tail -f /dev/null
在這個腳本中,我們先設定了SqlServer的中文編碼ID為2052(簡體中文的ID号),然後啟動sqlserver,導入sql腳本,最後通過 tail -f /dev/null來避免容器關閉前台(這是容器的機制,前台一關閉容器就會stop)。
有了以上兩個腳本檔案,我們就可以編制Dockerfile,将檔案寫到鏡像中:
FROM microsoft/mssql-server-linux:2017-latest
#将所需檔案放到容器中
COPY setup.sh /home/mssql/setup.sh
COPY LayIM.sql /home/mssql/schema.sql
RUN chmod +777 /home/mssql/setup.sh
#設定容器啟動時執行的指令
CMD ["sh", "/home/mssql/setup.sh"]
4. Build鏡像和生成容器
最後我們就可以Build鏡像(進入到Dockerfile目錄下)
docker build -t fzfda-mssql:1.0 .
生成鏡像後,就直接run(需要注意的是應該先建立卷目錄mkdir -p /var/opt/mssql并賦寫權限,然後是ACCEPT_EULA授權為Y,sa密碼要以和以上腳本保持統一,資料庫端口配置正确):
docker run --name fzfda-mssql -d --restart=unless-stopped -p 1433:1433 -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -v /var/opt/mssql:/var/opt/mssql fzfda-mssql:1.0
5. 連接配接資料庫
容器起的過程中就完成了資料初始化,連接配接後就能看到:
我用的是Navicat工具連接配接資料庫,預設連接配接sqlserver的端口是1433,如果不是1433,就需要配置端口了,注意端口和IP是用逗号分隔的(這點比較坑):