一、DOCKER 容器的數據
docker 主要有兩種數據存儲形式, 一種是storage driver(也叫做 Graph driver), 另一種是 volume driver. stroage driver主要是存儲那些無狀態的數據, 寫入密集型的場景應該使用 volume driver.
======================
storage driver
======================
容器運行的文件系統是鏡像層和容器層組成的, 一層一層疊加, 只有最上面的那層是可寫的, 其他層都是只讀的. Docker通過Union FS技術支持文件的讀寫和新建, Docker 采用插件式的方式支持多種Union FS實現, 官方文檔中一般使用stroage driver術語, 目前已經有多種實現的插件, 比如: aufs/overlay/overlay2/devicemanger等等.
======================
volume driver
======================
volume driver 經常用來實現數據持久化和文件共享功能, 具體有兩種存在方式, 分別是:
1. bind mount 方式:
是將host的目錄或文件直接mount到容器中, host的目錄或文件既可以容器運行之前就已存在的, 也可以是在容器運行之前不存在的.
如果在docker run 命令中采用了 -v /host/dir_or_file:/container/dir_or_file的形式, 就是bind mount方式, 即指定了host的掛載點的絕對路徑.
2. volume 方式:
是由 Docker 管理, 該volume最終存儲到host的 /var/lib/docker/volumes 下. volume 方式還分為 named volume 和 Anonymous volume.
named volume 有兩種創建方法,
(1) docker run 命令中采用了 -v one_volume_name:/container/dir_or_file , 這里的one_volume_name不是host中的絕對路徑, 而是一個名稱.
(2) 通過 docker volume create 創建的, 該命令支持更多的選項, 推薦使用.
匿名volume方式 是通過 docker run 命令中傳入了 -v /container/dir 類型的參數.
3. bind mount 方式和volume方式的簡單對比:
bind mount方式, docker容器直接訪問host的目錄或文件, 性能是最好的.
bind mount方式, docker容器直接訪問host的目錄或文件, 對於該host絕對目錄可能會引入權限問題. 如果容器僅需要只讀訪問權限, 最好是顯式設定只讀方式.
對於 volume方式, 如果host中落地目錄為空, docker先將容器中的對應目錄復制到host下, 然后再進行掛載操作; 對於bind mount方式, 掛載之前沒有復制操作.
容器要依賴host主機的一個絕對路徑, 使得容器的移植性變差, docker 官方並不推薦這個方法, 而是推薦使用volume.
二、MSSQL SERVER 數據庫數據的持久化
1、數據庫文件存放位置
不考慮容器的移植,選用bind mount方式實現數據持久化,將主機的目錄直接mount到容器中。生成容器mssql 時的參數 -v /f/sqlserver_data:/mnt/mssql/data 就完成了主機F盤
sqlserver_data目錄直接映射到容器內/mnt/mssql/data目錄下
2、數據庫附加數據文件
將數據庫文件拷貝到持久化目錄下,在主機下運行SMSS,如圖填寫登錄資料。密碼參數 -e "SA_PASSWORD=<SQLOnLinux123>", 端口參數 -p 1533:1433
附加數據庫,指定到持久化目錄
選擇數據庫數據文件,系統自動識別出數據文件和日志文件,這里由於主機為WINDOWS操作系統,容器為LINUX操作系統,在文件區域斜杠要調整,否則系統找不到文件
調整斜杠后,文件路徑變為:/mnt/mssql/data/test.mdf,/mnt/mssql/data/test_log.ldf ,數據庫文件順利導入數據庫