遷移 Docker 容器儲存位置
- 2019 年 10 月 8 日
- 筆記
本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋
創建時間: 2019年07月14日 統計字數: 3500字 閱讀時間: 7分鐘閱讀 本文鏈接: https://soulteary.com/2019/07/14/migrate-docker-container-storage-location.html
遷移 Docker 容器儲存位置
這篇文章初稿是寫在遷移伺服器上的 GitLab 發布後,因為各種原因(忙碌+拖延症),一直躺在草稿箱種,考慮到使用容器的同學越來越多,系統減肥、數據遷移擴容類數據需求還是有的,所以趁著周末重新整理了一下這篇文章。
一般來說我們需要將系統磁碟和應用數據盤進行分離,除了能夠獲得更好的性能,最關鍵的還是能夠讓數據更安全可靠:多數雲服務數據盤支援備份快照、並且支援大容量 SSD 盤。
寫在前面
掛載數據盤,可以參考 早些時候的一篇部落格,這裡不做過的贅述,為了方便描述,我這裡使用一台新的主機作為演示,順手 docker pull
下載了一些常用鏡像。
先使用 df
了解下當前機器的分區狀況。
# df -hFilesystem Size Used Avail Use% Mounted onudev 2.0G 0 2.0G 0% /devtmpfs 395M 5.3M 390M 2% /run/dev/vda1 40G 8.3G 30G 22% /tmpfs 2.0G 0 2.0G 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup/dev/vdb1 20G 45M 19G 1% /datatmpfs 395M 0 395M 0% /run/user/0
可以看到系統盤有 40G,掛載在 /
根目錄,設備是 /dev/vda1
,而數據盤有20G,掛載在 /data
(個人習慣),設備為 /dev/vdb1
。
如果是老機器,有運行中的容器,可能會看到類似下面的輸出。
overlay 196G 24G 163G 13% /var/lib/docker/overlay2/69e985e9fbc2bbaee2fbdcd81c514d64c4ed9862233bf4797a75ac10df80ed1e/mergedshm 64M 4.0K 64M 1% /var/lib/docker/containers/14777d5d02f2600ea134a8eff061dc4d2fd440b747c936da6024386f457a9c2c/mounts/shm
在遷移之前,我們需要了解默認的容器數據保存位置。
# docker info | grep "Docker Root Dir"Docker Root Dir: /var/lib/docker
通過 docker info
我們可以看到默認的安裝位置在 /var/lib/docker
,沒錯,默認是在系統盤,隨著下載鏡像越來越多,構建鏡像、運行容器越來越多,系統盤可能會迅速被它蠶食而發生一些意料之外的事情: 系統無法啟動、或者嚴重變慢,所以強烈建議對它進行遷移。
開始遷移
考慮到有一些同學並不是新機器,所以這裡簡單啟動一個 Nginx 容器,來模擬「有數據」狀態,幫助我們驗證遷移結果。
docker run -d -p 8080:80 nginx
Nginx 啟動之後,我們使用 curl 驗證服務是否正常。
# curl 127.0.0.1:8080<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p> <p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p></body></html>
接著使用 du 命令來看看,上小節使用 docker info
了解到的 docker 默認數據目錄有多大。
# du -hs /var/lib/docker4.3G /var/lib/docker
如果你確定你的鏡像都已經妥善保存好、或者用的都是公開的鏡像,容器實例中沒有存儲特別的東西,可以考慮先執行 docker system prune
給 docker 數據目錄先減個肥,再進行遷移。
要進行數據遷移,需要先暫停 docker 服務。
service docker stop
創建遷移目錄(用來放新數據的目錄),我個人習慣將可備份的用戶數據存放於應用分區 /data
下。
mkdir -p /data/docker/
然後使用萬能的 rsync 對數據進行遷移。
rsync -avz /var/lib/docker/ /data/docker
在長長的螢幕日誌滾動之後,你將會看到類似下面的輸出:
docker/tmp/docker/trust/docker/volumes/docker/volumes/metadata.db sent 1,514,095,568 bytes received 3,096,373 bytes 4,998,984.98 bytes/sectotal size is 3,955,563,885 speedup is 2.61
數據就這樣遷移完畢了,完整性由 rsync 保證。接下來要修改 docker 的配置,讓 docker 從新的位置進行數據載入和存儲。
編輯 /etc/docker/daemon.json
配置文件,如果沒有這個文件,那麼需要自己創建一個,根據上面的遷移目錄,基礎配置如下:
{ "data-root": "/data/docker"}
如果你之前修改過 docker mirror (其他同理),那麼你的配置需要修改為這個樣子:
{ "data-root": "/data/docker", "registry-mirrors": [ "http://YOUR_MIRROR_LINK" ]}
將容器服務啟動起來。
service docker start
使用文章開頭的命令再次驗證下 docker 數據存儲設置,可以看到配置已經生效。
# docker info | grep "Docker Root Dir"Docker Root Dir: /data/docker
還記得這小節開頭提到的 Nginx 容器嘛,我們將它重新啟動,來驗證服務是否可用,先找到這個容器的「屍體」。
# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESfd9b79ae8574 nginx "nginx -g 'daemon of…" 44 minutes ago Exited (0) 31 minutes ago admiring_yalow
接著使用容器基礎命令將實例啟動。
docker start fd9b79ae8574
最後再使用 curl 驗證一下結果:
# curl 127.0.0.1:8080<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p> <p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p></body></html>
至此,遷移就大功告成啦。
對了,你還記得我們最開始看到的 /var/lib/docker
目錄嘛,它現在已經完全無用了,可以使用 rm-rf/var/lib/docker
將它清理掉啦。
最後
我一直以為這篇文章之前寫完發布了,然鵝前幾天重新配置新伺服器的時候,卻發現這篇文章一直安靜的待在編輯器草稿箱里,安靜的躺了快一年…
看來還是要多給自己下小任務,每周清理下之前的筆記和部落格草稿呀。
—EOF