将 docker 卷移动到不同的分区

问题描述 投票:0回答:5

我有一台服务器,在其中运行一些带有卷的容器。我的所有卷都在

/var/lib/docker/volumes/
中,因为 docker 正在管理它。我使用 docker-compose 来启动我的容器。

最近,我试图停止我的一个容器,但这是不可能的:

$ docker-compose down
[17849] INTERNAL ERROR: cannot create temporary directory!

所以,我检查了数据是如何安装在服务器上的:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7,8G     0  7,8G   0% /dev
tmpfs           1,6G  1,9M  1,6G   1% /run
/dev/md3         20G   19G     0 100% /
tmpfs           7,9G     0  7,9G   0% /dev/shm
tmpfs           5,0M     0  5,0M   0% /run/lock
tmpfs           7,9G     0  7,9G   0% /sys/fs/cgroup
/dev/md2        487M  147M  311M  33% /boot
/dev/md4        1,8T  1,7G  1,7T   1% /home
tmpfs           1,6G     0  1,6G   0% /run/user/1000

如你所见,

/
只有20Go,所以它已经满了,我无法使用docker-compose停止我的容器。

我的问题是:

  • 有一个简单的解决方案可以增加可用空间

    /
    ,使用
    /dev/md4

  • 或者我可以将卷移动到另一个地方而不丢失数据吗?

docker ubuntu docker-compose system partition
5个回答
14
投票

Docker Daemon 的这一部分是可配置的。最佳做法是更改数据文件夹;这可以使用操作系统级 Linux 命令(如符号链接)来完成...我想说最好实际配置 Docker 守护进程以将数据存储在其他地方!

您可以通过编辑 Docker 命令行(例如启动 Docker 守护进程的 systemd 脚本)或更改

/etc/docker/daemon.json
来做到这一点。

该文件应包含以下内容:

{
  "data-root": "/path/to/your/docker"
}

如果您添加新的硬盘驱动器、分区或挂载点,您可以在此处添加它,docker 会将其数据存储在那里。


4
投票

我来到这里是因为我遇到了同样的问题。尽管一些消息来源建议您可以使用符号链接来完成此操作,但这会导致各种问题。

根据操作系统和 Docker 版本,我遇到了格式错误的图像、奇怪的错误或 docker-daemon 拒绝启动。

Here是一个解决方案,但似乎不同版本略有不同。对我来说,解决方案是:

打开

/lib/systemd/system/docker.service

并更改此行

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

至:

ExecStart=/usr/bin/dockerd -g /mnt/WHATEVERYOUR/PARTITIONIS/docker --containerd=/run/containerd/containerd.sock

3
投票

我解决了这个问题,创建了一个指向更大尺寸分区的符号链接:

ln -s /scratch/docker_meta /var/lib/docker

/scratch/docker_meta 是我在更大分区中的文件夹。


0
投票

进行绑定安装。

例如,将

/docker/volumes
移动到
/mnt/large

将行添加到

/etc/fstab

/mnt/large /docker/volumes none bind 0 0

然后。

mv /docker/volumes/* /mnt/large/
mount /docker/volumes

如果您使用的是非 root docker,请先不要忘记

chown
chmod
/mnt/large


0
投票

要移动现有的 docker 数据文件夹,请执行以下操作:

  1. 停止 docker 守护进程:
service docker stop
  1. 创建/编辑
    /etc/docker/daemon.json
    配置文件以及新数据目录的位置:
{
    "data-root": "/new/path"
}
  1. 将 docker 文件复制到新位置:
rsync -aP /var/lib/docker/ /new/path
  1. 删除旧目录(重命名为安全)
mv /var/lib/docker /var/lib/docker.old
  1. 创建符号链接:
ln -s /new/path /var/lib/docker

注意: 如果我不创建符号链接,则会收到此错误:

Error response from daemon: error evaluating symlinks from mount source "/var/lib/docker/...": lstat /var/lib/docker: no such file or directory

Here它说可以通过更改

/new/path/containers/*/config.v2.json
文件中的路径来修复错误,但这对我不起作用,原始的
/var/lib/docker
路径重新出现在这些文件中。

  1. 启动守护进程
service docker start
  1. 测试
docker run --rm hello-world

应该看到类似这样的东西:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
  1. 清理
rm -rf /var/lib/docker.old
© www.soinside.com 2019 - 2024. All rights reserved.