由於之前為了可以將開發環境帶在身上,因此將開發環境都建置於我的筆電上,但最近因為疫情關係,長時間都只能待在家中進行開發。而筆電雖然在移動環境上尚有一定程度的能力但速度與家中的桌機還是有不小的落差,於是開始研究該怎麼將開發環境遷移。其實在筆電設置開發環境時就有想過之後有可能需要移轉,因此在最一開始就使用了WSL+Docker的方式進行建置,而今天實際上在進行移轉時也省去不少功夫。
此篇主要為記錄將筆電上,進行開發練習的SQL SERVER container進行打包,並在另一台電腦上進行完整還原。而WSL移轉的部分將會另外再寫一篇說明。
打包原Container
首先docker提供了三種不同的打包方式,三種方式各自所打包的東西也不盡相同,主要分為
- docker save
docker save -h Usage: docker save [OPTIONS] IMAGE [IMAGE...] Save one or more images to a tar archive (streamed to STDOUT by default) --help Print usage -o, --output Write to a file, instead of STDOUT
- docker export
docker export -h Usage: docker export [OPTIONS] CONTAINER Export a container's filesystem as a tar archive --help Print usage -o, --output Write to a file, instead of STDOUT
- docker commit
docker commit -h /tmp/pkg_debian (debian) choldrim-pc Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] Create a new image from a container's changes -a, --author Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") -c, --change=[] Apply Dockerfile instruction to the created image --help Print usage -m, --message Commit message -p, --pause=true Pause container during commit
從上面三個指令的Usage與提供參數可以發現,save指令主要是作為輸出image使用,而由於之前在建立此SQL Server資料庫時,並未使用volume的方式將data與container做分離,因此目標在於將整個container完整的打包並複製到另一台電腦上。
commit則是結合了save、load、export、import這些指令的集合,將當前的container進行保存於local當中,也就是將當過去commit過的cotainer再疊加上新的一層,我的理解這個指令有點像是git的版本管控,但仍非我們本次想做的事。
最後則是export這個指令,從它的說明中可以清楚了解它是將container的filesystem用tar進行打包並輸出,因此本次將使用export這個指令進行container的輸出打包,並進行移轉。
在這裡我們使用以下指令,將tag name為sql1之container進行export並再壓縮為.tgz檔案(僅為了縮減檔案大小方便移轉,順便練習壓縮指令😂)。
# 原主機
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4106fce6959f mcr.microsoft.com/mssql/server:2019-latest "/opt/mssql/bin/perm…" 2 months ago Exited (0) 10 minutes ago sql1
$ docker export sql1 | gzip > sql1.tgz
輸出完檔案後即可直接將檔案copy至欲移轉的電腦上,並使用import指令匯入docker中,雖然在export時我們是將整個container打包,然而在import進docker內他將此container以image的方式輸入,因此還需要重新執行一次run指令,不過由於container init相關已經做過設定,因此只需要設定好port以及name等即可。
# 新主機
$ zcat sql1.tgz | docker import - sql1
sha256:66b6eebb2add3a91e8fd778fa668a0b72891fb9fbeff8eb8d58bba86cb36aeed
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sql1 latest 66b6eebb2add 12 seconds ago 1.77GB
$ sudo docker run -p 1433:1433 --name sql1 -h sql1 -d sql1
docker: Error response from daemon: No command specified.
See 'docker run --help'.
然後你就會收到錯誤訊息了🤣
主要是因為docker export是導出文件系統,而不是container內的所有東西,所以在其他地方匯入時,需要指定command來讓他執行,因此要回到原主機上的docker查詢該container的command。
# 原主機
$ docker ps -a --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4106fce6959f020e5b4301be28d9f6acf458872eeb615639cf83ddec41e75412 mcr.microsoft.com/mssql/server:2019-latest "/opt/mssql/bin/permissions_check.sh /opt/mssql/bin/sqlservr" 2 months ago Exited (0) 2 hours ago sql1
查詢完command後將其加入使用之image後方即可,指令如下,可以對照上方出錯的指令有哪些不同之處。
# 新主機
$ sudo docker run -p 1433:1433 --name sql1 -h sql1 -d \
sql1 /opt/mssql/bin/permissions_check.sh /opt/mssql/bin/sqlservr
到了這裡大致上就完成docker container的遷移作業了,這是我第一次寫技術blog,在文章中多半還是以自身的角度及經驗去撰寫,很多技術面的部份也不是這麼熟稔,若有寫得不夠周全或錯誤煩請指正。
參考資料
https://bobcares.com/blog/move-docker-container-to-another-host/
https://blog.hinablue.me/docker-bi-jiao-save-export-dui-yu-ying-xiang-dang-cao-zuo-chai-yi/
https://zhuanlan.zhihu.com/p/152219012
https://blog.csdn.net/u010365819/article/details/87372667
https://docs.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash