本文介绍如何为Docker数据目录挂载数据盘。挂载数据盘可以扩容Docker数据目录,从而当在机器上运行的容器或者镜像数量不断增加时,保证有足够的磁盘空间可以满足使用需求。

Docker数据目录

Docker的数据通过联合文件系统的方式存储到磁盘上。Docker默认的容器和镜像数据存储在/var/lib/docker目录下。您可以通过du命令查看这个目录目前占用的磁盘大小。

du -h --max-depth=0 /var/lib/docker

预期输出:

7.9G    /var/lib/docker

增加数据盘

很多Docker镜像较大,因此可能几个镜像就会占用大量磁盘空间。较大的镜像或较多的容器,都会导致磁盘空间的不足。为了满足您增加镜像或容器的需求,您需要为Docker的数据目录增加数据盘。

  1. 创建ECS数据盘,并挂载到需要扩容的机器上。具体操作,请参见创建云盘
    1. 通过云服务器ECS控制台创建需要配置的云盘。
    2. 选择左侧导航栏中的实例与镜像 > 实例
    3. 单击目标ECS实例ID,进入实例详情页面。
    4. 单击云盘页签。
    5. 单击右上角的挂载云盘
    6. 挂载云盘对话框中,选择创建的磁盘作为目标磁盘。单击确定
    7. 单击执行挂载,挂载新磁盘到目标ECS实例,并记录挂载点/dev/xvd*或者/dev/vd*
  2. 登录ECS实例,对刚才挂载的磁盘进行格式化。
    1. 执行ls -l /dev/xvd*或者ls -l /dev/vd*命令,验证是否和上述步骤中记录的挂载点一致。
    2. 通过fdisk命令对磁盘进行分区,然后使用mkfs.ext4命令格式化磁盘。
      格式化磁盘
  3. 移动Docker数据到新的磁盘。
    如果不希望中断节点上正在运行的应用,您需要对应用进行迁移。关于迁移Swarm集群的操作,请参见 指定多节点调度。关于迁移Kubernetes集群的操作,请参见 Safely Drain a Node while Respecting Application SLOs
    1. 停止Docker Daemon和kubelet,保证迁移时的数据完整。可以使用service kubelet stopservice docker stop命令进行停止。
    2. 移动Docker的目录到一个备份的目录。例如:mv /var/lib/docker /var/lib/docker_data
    3. 将已格式化的新磁盘挂载到/var/lib/docker/var/lib/kubelet目录。例如:
      echo "/dev/xvdb1    /var/lib/container/     ext4    defaults        0 0" >>/etc/fstab
      echo "/var/lib/container/kubelet /var/lib/kubelet none defaults,bind 0 0" >>/etc/fstab
      echo "/var/lib/container/docker /var/lib/docker none defaults,bind 0 0" >>/etc/fstab
      mkdir /var/lib/docker
      mount -a
    4. 将之前备份的Docker数据移动到新的磁盘上。例如:mv /var/lib/docker_data/* /var/lib/docker/
  4. 启动Docker Daemon和kubelet,并检查数据位置。
    1. 启动Docker Daemon和kubelet,命令分别是service docker startservice kubelet start
    2. 执行df命令,可看到/var/lib/docker挂载到了新的磁盘上。如果需要启动Kubernetes集群,请跳过此步骤。
      启动集群
    3. 执行docker ps命令,查看容器是否丢失。根据需要,重启相关容器。如没有设置restart:always标签的容器。
      设置标签
  5. 您可以通过调度的方式使被迁移走的容器回归到该节点上。

    更多容器服务的相关内容,请参见容器服务