溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

發(fā)布SQL Server Docker有哪些方式

發(fā)布時(shí)間:2021-11-11 11:03:13 來源:億速云 閱讀:143 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要介紹“發(fā)布SQL Server Docker有哪些方式”,在日常操作中,相信很多人在發(fā)布SQL Server Docker有哪些方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”發(fā)布SQL Server Docker有哪些方式”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

1 構(gòu)建【數(shù)據(jù)庫文件內(nèi)建于容器鏡像之內(nèi)】的 SQL Server Docker 發(fā)布步驟如下:

1 Pull 一個(gè)最原始的 sql server docker 鏡像

鏡像來自于微軟在 Docker Hub 上提供的初始容器。

2 編寫第一版的數(shù)據(jù)庫對(duì)象創(chuàng)建腳本

SQL 腳本:

CREATE DATABASE CRM 
GO 
USE CRM 
GO 
CREATE TABLE dbo.Account(
    AccountId INT IDENTITY(1,1),
    AccountName NVARCHAR(200) 
)

保存為 DBSchemaInit.sql

3 構(gòu)建新容器鏡像

構(gòu)建自定義的容器鏡像,最重要的是編寫 Dockerfile.

[root@centos00 v1]# cat Dockerfile
FROM microsoft/mssql-server-linux
MAINTAINER Lenis Huang "huangyun_122@163.com"
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=1QAZ2WSX3EDC
EXPOSE 1433

最終構(gòu)建成功了:

[root@centos00 v1]# docker build -t=sqlserver/v1 .
Sending build context to Docker daemon 3.584 kB
Step 1/5 : FROM microsoft/mssql-server-linux
 ---> b2b20452a15b
Step 2/5 : MAINTAINER Lenis Huang "huangyun_122@163.com"
 ---> Running in 532a5f141f11
 ---> 182a1a9aed84
Removing intermediate container 532a5f141f11
Step 3/5 : ENV ACCEPT_EULA Y
 ---> Running in c72d741f2f8e
 ---> ee590cf78e2b
Removing intermediate container c72d741f2f8e
Step 4/5 : ENV SA_PASSWORD 1QAZ2WSX3EDC
 ---> Running in 67559621fd8d
 ---> 7d92d6155c25
Removing intermediate container 67559621fd8d
Step 5/5 : EXPOSE 1433
 ---> Running in 2bb8ee0440a4
 ---> 67f770bfdacd
Removing intermediate container 2bb8ee0440a4
Successfully built 67f770bfdacd
[root@centos00 v1]# docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
sqlserver/v1                             latest              67f770bfdacd        36 seconds ago      1.44 GB

至此,一份嶄新的可用于項(xiàng)目部署的 sql server docker 構(gòu)建完畢。

[root@centos00 DockerNginx]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                     NAMES
f29258559cb4        sqlserver/v1                   "/opt/mssql/bin/sq..."   About a minute ago   Up 59 seconds       0.0.0.0:32793->1433/tcp   dev_sqlv1


從 docker ps 執(zhí)行的結(jié)果中看到運(yùn)行著 sqlv1 鏡像的容器,可以通過本機(jī)的 32793 端口連接到容器中 sql server 服務(wù)對(duì)應(yīng)的 1433 端口。

在 Dev, STG, UAT 環(huán)境,都以 sqlv1 為藍(lán)本,使應(yīng)用都連接到在 sqlv1 容器中運(yùn)行的數(shù)據(jù)庫。開發(fā)測試中出現(xiàn)任何問題,都可以拿著 sqlv1 重建一個(gè)新的容器來運(yùn)行數(shù)據(jù)庫。

4 開發(fā)新一版本的數(shù)據(jù)庫應(yīng)用,將其應(yīng)用于 sqlv1 鏡像,進(jìn)而構(gòu)建 sqlv2 鏡像

# Dockerfile
FROM sqlserver/v1
MAINTAINER Lenis Huang "huangyun_122@163.com"
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=1QAZ2wsx3EDC.
ENV PATH=${PATH}:/opt/mssql/bin:/opt/mssql-tools/bin
RUN mkdir sqlfiles
COPY DBSchemaInit.sql ./sqlfiles/DBSchemaInit.sql
COPY setup-database.sh ./sqlfiles/setup-database.sh
COPY entrypoint.sh ./sqlfiles/entrypoint.sh
RUN chmod a+x ./sqlfiles/setup-database.sh
RUN chmod a+x ./sqlfiles/entrypoint.sh
CMD bash ./sqlfiles/entrypoint.sh
# entrypoint.sh
echo 'starting database setup'
./sqlfiles/setup-database.sh &
/opt/mssql/bin/sqlservr
# setup-database.sh
echo 'please wait while database is starting up ...'
sleep 45s
echo 'try to connect to database in containder and create the sample db...'
/opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U sa -P 1QAZ2wsx3EDC. -d master -i ./sqlfiles/DBSchemaInit.sql
echo 'sample db have been created!'

作為數(shù)據(jù)庫部署,每次構(gòu)建新容器,要關(guān)注的便是編寫增量部署腳本,以替代第一次的數(shù)據(jù)庫初始化腳本 DBSchemaInit.sql.

5 如此循環(huán)達(dá)到持續(xù)集成和發(fā)布

在這種發(fā)布流程中,要思考的問題是,如何在生產(chǎn)環(huán)境發(fā)布。

按照 docker 發(fā)布數(shù)據(jù)庫的這套流程,能發(fā)現(xiàn)和規(guī)避的問題是:

數(shù)據(jù)庫發(fā)布腳本的一致性。

在dev, stg, uat,prod 都是使用了同一套腳本,并且腳本有錯(cuò)誤可以及時(shí)調(diào)整。不至于在單發(fā)生產(chǎn)環(huán)境的時(shí)候,由于在 dev,stg, uat 測試環(huán)境發(fā)布時(shí),沒有及時(shí)校驗(yàn)出腳本邏輯上錯(cuò)誤,或者因?yàn)榄h(huán)境的影響,比如大家隨意的在 dev,stg,uat 環(huán)境創(chuàng)建數(shù)據(jù)庫對(duì)象,而導(dǎo)致發(fā)布腳本本身沒有得以驗(yàn)證正確性與完整性。

數(shù)據(jù)庫發(fā)布的快捷性。

原本需要dev,stg,uat,prod 都重新部署一臺(tái)新的服務(wù)器。之后,應(yīng)用數(shù)據(jù)庫發(fā)布腳本?,F(xiàn)在只要竭盡全力構(gòu)建一臺(tái)正確可用的 docker 鏡像,基于這份鏡像,可以實(shí)現(xiàn)多個(gè)平臺(tái)同時(shí)部署。而應(yīng)用只需要指定相應(yīng)的 doker 名即可。在多臺(tái)集群環(huán)境中,這種部署手法給運(yùn)維帶來極大便利。還記得 Linux 的 ssh shell 嘛,發(fā)明遠(yuǎn)程無密登錄就是為了能讓運(yùn)維在多個(gè)服務(wù)器之間穿梭,而不用一臺(tái)臺(tái)去安裝軟件了。在大數(shù)據(jù)當(dāng)?shù)?,時(shí)不時(shí)要求上千臺(tái)集群服務(wù)器的時(shí)下,docker 可以看做是一劑良藥。

而這套流程,需要考慮的地方在于,生產(chǎn)環(huán)境的發(fā)布稍微不同。同樣的發(fā)布腳本,但是數(shù)據(jù)庫文件是游離于容器之外的。所以嚴(yán)格來說,不能以這樣的方式去發(fā)布生產(chǎn)環(huán)境。必須從頭至尾的,將數(shù)據(jù)庫文件隔離于容器。在構(gòu)建容器之時(shí),先附加數(shù)據(jù)庫文件到鏡像,再應(yīng)用發(fā)布腳本,最終構(gòu)建發(fā)布版本的容器鏡像。這樣的構(gòu)建腳本(Dockerfile)才具有可移植性。

2 構(gòu)建【數(shù)據(jù)庫文件游離于容器鏡像之外】的 SQL Server Docker 發(fā)布步驟如下:

有了上面的經(jīng)驗(yàn),這次就簡單很多了,就是對(duì) Dockerfile 增加 Volume 指令的修改。本質(zhì)上,是用 Volume 中的磁盤空間來存儲(chǔ)數(shù)據(jù)庫文件。

唯一不同的便是 dockerfile 的編寫 和指定掛載的本地文件

# Dockerfile 
FROM sqlserver/v1
MAINTAINER Lenis Huang "huangyun_122@163.com"
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=1QAZ2wsx3EDC.
ENV PATH=${PATH}:/opt/mssql/bin:/opt/mssql-tools/bin
RUN mkdir sqlfiles
COPY DBSchemaInit.sql ./sqlfiles/DBSchemaInit.sql
COPY setup-database.sh ./sqlfiles/setup-database.sh
COPY entrypoint.sh ./sqlfiles/entrypoint.sh
RUN chmod a+x ./sqlfiles/setup-database.sh
RUN chmod a+x ./sqlfiles/entrypoint.sh
VOLUME /sql/data
CMD bash ./sqlfiles/entrypoint.sh

加了 VOLUME 指令用來指定所有掛載的本地文件都被掛載到 /sql/data 上。

[root@centos00 v4]# mkdir -p /sql/data
[root@centos00 v4]# docker run -p 1433 --rm --name=dev_sqlv5 -v sqlvolume:/sql/data sqlserver/v5
[root@centos00 data]# docker volume inspect sqlvolume
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/sqlvolume/_data",
        "Name": "sqlvolume",
        "Options": {},
        "Scope": "local"
    }
]

在 sqlvolume 指定的目錄下面,我們可以看到任何被放在 docker 中 /sql/data 目錄下的文件。當(dāng)然我們也可以自己創(chuàng)建一個(gè) volume 掛載上去。

到此,關(guān)于“發(fā)布SQL Server Docker有哪些方式”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI