docker 指定根目录 迁移根目录

docker 指定根目录

  • 1、问题描述
  • 2、问题分析
  • 3、解决方法
    • 3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容),事前就根本上解决根目录空间不够问题
      • 3.1.0、方法思路
      • 3.1.1、docker官网安装文档
      • 3.1.2、下载docker安装包
      • 3.1.3、安装docker 26.1.0
      • 3.1.4、配置docker systemd服务
    • 3.2、发现docker根目录爆满了,改变docker根目录为一个大的分区(支持动态扩容),事后解决根目录空间不够问题(需要迁移之前的根目录数据到新的根目录)

1、问题描述

默认启动docker后,默认的docker根目录是/var/lib/docker

使用docker info 命令查看docker根目录

bash 复制代码
docker info

在有些服务器上,/ 根目录空间非常小而且不能动态扩容,不能承载太多的docker镜像和数据,随着docker的运行,默认的docker根目录是/var/lib/docker 占用空间越来越大,导致/ 目录爆满,系统崩溃。(为什么不扩充根目录呢?因为在有些服务器上根目录不是LVM分区、不能动态扩容)

不指定配置文件,默认启动docker服务后,docker根目录如下,查看docker根目录的组织结构

bash 复制代码
ls -l /var/lib/docker

整个根目录大小是340K

根目录下各个子目录大小如下

docker 根目录结构如下 这些?所在的地方都是空格

bash 复制代码
[root@centos ~]# tree /var/lib/docker/
/var/lib/docker/
├── buildkit
│?? ├── cache.db
│?? ├── containerdmeta.db
│?? ├── content
│?? │?? └── ingest
│?? ├── executor
│?? ├── history.db
│?? ├── metadata_v2.db
│?? └── snapshots.db
├── containerd
│?? └── daemon
│??     ├── io.containerd.content.v1.content
│??     │?? └── ingest
│??     ├── io.containerd.metadata.v1.bolt
│??     │?? └── meta.db
│??     ├── io.containerd.runtime.v1.linux
│??     ├── io.containerd.runtime.v2.task
│??     ├── io.containerd.snapshotter.v1.blockfile
│??     ├── io.containerd.snapshotter.v1.native
│??     │?? └── snapshots
│??     ├── io.containerd.snapshotter.v1.overlayfs
│??     │?? └── snapshots
│??     └── tmpmounts
├── containers
├── engine-id
├── image
│?? └── overlay2
│??     ├── distribution
│??     ├── imagedb
│??     │?? ├── content
│??     │?? │?? └── sha256
│??     │?? └── metadata
│??     │??     └── sha256
│??     ├── layerdb
│??     └── repositories.json
├── network
│?? └── files
│??     └── local-kv.db
├── overlay2
│?? └── l
├── plugins
│?? ├── storage
│?? │?? └── ingest
│?? └── tmp
├── runtimes
├── swarm
├── tmp
└── volumes
    ├── backingFsBlockDev
    └── metadata.db

39 directories, 11 files
[root@centos ~]#

2、问题分析

有2个思路解决docker根目录空间爆满的问题
1、整体规划,防患于未然

在docker程序启动前,通过docke daemon的配置文件指定一个很大或者可以动态扩容的文件目录作为docker根目录。
2、后知后觉,整体规划没做好,事后处理

如果在生产环境上,运行docker程序签没有手动指定docker根目录,造成默认的docker根目录就是/var/lib/docker,并且环境已经运行一段时间发现根目录空间不够了,这种情况下仍然可以通过docke daemon的配置文件指定一个很大或者可以动态扩容的文件目录作为docker根目录,只不过要把之前docker根目录/var/lib/docker下哦数据迁移到新的docker根目录即可。。

3、解决方法

3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容),事前就根本上解决根目录空间不够问题

3.1.0、方法思路

在docker启动前,先在配置文件中指定docker根目录,这个根目录的空间要保证非常大,或者这个根目录是能够动态扩容的,比如LVM分区。

linux上docker daemon配置文件是/etc/docker/daemon.json

windwos上docker daemon配置文件是C:\ProgramData\docker\config\daemon.json

本文以linux系统为例描述配置docker根目录方法

参考链接: https://docs.docker.com/config/daemon/

在linux系统上安装完成docker后,先不要启动docker程序。

先编辑docker配置文件/etc/docker/daemon.json

bash 复制代码
mkdir /etc/docker
vi /etc/docker/daemon.json

注:默认情况下这个docker配置文件是没有的,这里实际也就是新建一个/etc/docker/daemon.json

写入以下内容 其中/path/to/docker是自定义的docker根目录,需要保证/path/to/这个目录存在

bash 复制代码
{
  "data-root": "/path/to/docker"
}

然后启动docker服务

bash 复制代码
systemctl start docker.service

安装过程如下

3.1.1、docker官网安装文档

https://docs.docker.com/engine/install/binaries/

3.1.2、下载docker安装包

官方下载链接:https://download.docker.com/linux/static/stable/

选择最新版 26.1.0 下载

文件名:docker-26.1.0.tgz

3.1.3、安装docker 26.1.0

上传docker-26.1.0.tgz到linux服务器

bash 复制代码
cd /path/to/docker-26.1.0.tgz
bash 复制代码
tar -xzvf docker-26.1.0.tgz
cp docker/* /usr/bin/

至此安装完成docker

查看docker版本

bash 复制代码
docker --version

3.1.4、配置docker systemd服务

bash 复制代码
vi /etc/systemd/system/docker.service

插入以下内容

bash 复制代码
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

为docker.service添加可执行权限

bash 复制代码
chmod +x  /etc/systemd/system/docker.service

重新加载docker.service配置文件,使得systemctl识别docker.service

bash 复制代码
systemctl daemon-reload

配置docker.service开机自启动

bash 复制代码
systemctl enable docker.service

查看操作系统文件系统目录

bash 复制代码
df -lTh

编辑docker配置文件/etc/docker/daemon.json

bash 复制代码
mkdir /etc/docker
vi /etc/docker/daemon.json

注:默认情况下这个docker配置文件是没有的,这里实际也就是新建一个/etc/docker/daemon.json

写入以下内容 其中/home/docker是自定义的docker根目录

bash 复制代码
{
  "data-root": "/home/docker"
}

启动docker服务前执行docker info 查看docker根目录 报错:docker服务未在运行

bash 复制代码
docker info

启动docker服务前查看docker根目录结构,还没有创建docker根目录

然后启动docker服务

bash 复制代码
systemctl start docker.service

启动docker服务时,会自动创建docker根目录/home/docker

查看docker服务

bash 复制代码
systemctl status docker.service

查看docker信息

bash 复制代码
docker info

得知docke的根目录是 /home/docker

查看docker根目录的组织结构

bash 复制代码
ls -l /home/docker

整个根目录大小是340K、根目录下各个子目录大小如下

导入镜像前查看 /home/docker/overlay2

bash 复制代码
ls -l /home/docker/overlay2

导入redis镜像文件

导入mysql像文件

查看操作系统文件系统目录

bash 复制代码
df -lTh

启动docker前的操作系统文件系统目录如下

bash 复制代码
df -lTh

发现导入2个镜像后 docker根目录所在的/homr分区 就增大了差不多1G。后期docker会导入更多的镜像、docker系统日志会占用很多空间,因此在启动docker服务前先编辑配置文件选择一恶搞大的分区作为docker根目录是很重要的。

3.2、发现docker根目录爆满了,改变docker根目录为一个大的分区(支持动态扩容),事后解决根目录空间不够问题(需要迁移之前的根目录数据到新的根目录)

停止docker服务

bash 复制代码
systemctl stop docker.service

建立新的docker根目录,执行命令df -h,找一个大的磁盘。

bash 复制代码
mkdir -p /path/to/docker

迁移/var/lib/docker目录下面的文件到 /path/to/docker

bash 复制代码
cp -r /var/lib/docker   /path/to/docker

编辑docker配置文件/etc/docker/daemon.json

bash 复制代码
vi /etc/docker/daemon.json

注:默认情况下这个docker配置文件是没有的,这里实际也就是新建一个/etc/docker/daemon.json

写入以下内容 其中/mnt/docker是自定义的docker根目录

bash 复制代码
{
  "data-root": "/path/to/docker"
}

然后启动docker服务

bash 复制代码
systemctl start docker.service

检查dockerx新的根目录是否配置成功

bash 复制代码
docker info | grep 'Docker Root Dir'

启动docker服务成功后,再确认之前的镜像和容器还在不

bash 复制代码
docker images
docker ps -a

迁移docker根目录后验证下面内容:

1、检查容器启动是否正常,docker logs 查看容器启动日志

2、执行容器内部服务检测,确认容器服务的接口调用是否正常

3、执行df -lh 查看输出确认docker根目录是否已迁移到新路径,

以上确认均没问题,到此!本次docker根目录迁移完成。

相关推荐
Nue.js31 分钟前
Docker中最常用的一些命令
docker·容器·eureka
basic_code2 小时前
Docker部署kafka集群
docker·容器·kafka
Z y..3 小时前
记:Docker部署kafka消费者注册不到问题
docker·容器·kafka
ly49834 小时前
docker--工作目录迁移
docker·容器·eureka
落非5 小时前
Ubuntu配置阿里云docker apt源
ubuntu·阿里云·docker
x2lab7 小时前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb
mit6.8249 小时前
[Docker#9] 存储卷 | Volume、Bind、Tmpfs | -v/mount | MySQL 灾难恢复 | 问题
linux·运维·docker·容器·架构
qq_167401519 小时前
Docker 组添加用户,设置允许普通用户操作 docker
docker·容器
Z1eaf_complete9 小时前
Docker的基础使用
运维·docker·容器·云计算
李少兄10 小时前
Docker 命令总结:从入门到入土
docker·容器·eureka