迁移 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、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)

关于折腾群入群的那些事

相关文章
相关标签/搜索