遷移 Docker 容器儲存位置

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)html

本文做者: 蘇洋nginx

建立時間: 2019年07月14日 統計字數: 3500字 閱讀時間: 7分鐘閱讀 本文連接: soulteary.com/2019/07/14/…git


遷移 Docker 容器儲存位置

這篇文章初稿是寫在遷移服務器上的 GitLab 發佈後,由於各類緣由(忙碌+拖延症),一直躺在草稿箱種,考慮到使用容器的同窗愈來愈多,系統減肥、數據遷移擴容類數據需求仍是有的,因此趁着週末從新整理了一下這篇文章。web

通常來講咱們須要將系統磁盤和應用數據盤進行分離,除了可以得到更好的性能,最關鍵的仍是可以讓數據更安全可靠:多數雲服務數據盤支持備份快照、而且支持大容量 SSD 盤。docker

寫在前面

掛載數據盤,能夠參考 早些時候的一篇博客,這裏不作過的贅述,爲了方便描述,我這裏使用一臺新的主機做爲演示,順手 docker pull 下載了一些經常使用鏡像。編程

先使用 df 瞭解下當前機器的分區情況。json

# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  5.3M  390M   2% /run
/dev/vda1        40G  8.3G   30G  22% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vdb1        20G   45M   19G   1% /data
tmpfs           395M     0  395M   0% /run/user/0
複製代碼

能夠看到系統盤有 40G,掛載在 / 根目錄,設備是 /dev/vda1,而數據盤有20G,掛載在 /data (我的習慣),設備爲 /dev/vdb1ubuntu

若是是老機器,有運行中的容器,可能會看到相似下面的輸出。安全

overlay         196G   24G  163G  13% /var/lib/docker/overlay2/69e985e9fbc2bbaee2fbdcd81c514d64c4ed9862233bf4797a75ac10df80ed1e/merged
shm              64M  4.0K   64M   1% /var/lib/docker/containers/14777d5d02f2600ea134a8eff061dc4d2fd440b747c936da6024386f457a9c2c/mounts/shm
複製代碼

在遷移以前,咱們須要瞭解默認的容器數據保存位置。bash

# 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 and
working. 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/docker
4.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/sec
total 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 -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
fd9b79ae8574        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 and
working. 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


我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。

在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索