docker overlay2 空间满了_docker修改容器端口

docker overlay2 空间满了_docker修改容器端口因为在一个服务器中部署的软件系统太多,而Docker中overlay2默认是70G,当其爆满时导致部署的系统软件无法正常使用

CentOS 8 下 Docker 的 overlay2 扩容保姆级实战教程

····因为在一个服务器中部署的软件系统太多,而 Docker 中 overlay2 默认是 70G,当其爆满时导致部署的系统软件无法正常使用。基本上我们大家实际使用时都会遇到这样的问题,明明我的服务器有好几个TB的容量,为什么会出现空间容量不足呢,实际上就是因为 Docker 中 overlay2 爆满的原因。

····那么这个 overlay2 到底是个什么东西呢?overlay2 是 Docker 中的一种存储驱动程序,用于管理容器的文件系统。它是一种联合文件系统,允许将多个文件系统层叠在一起,并呈现为单个文件系统。overlay2 存储驱动程序提供了高效的文件系统层叠和写时复制(copy-on-write)功能,这使得在 Docker 容器中创建、修改和管理文件系统的操作变得更加高效和快速。

····在 overlay2 中,每个容器都有自己的文件系统层,而且容器之间可以共享基础镜像的文件系统层,从而节省存储空间。此外,overlay2 还支持写时复制技术,当容器需要修改文件时,它会创建一个新的文件层,而不会直接在原始层上进行修改,这有助于减少磁盘空间的占用和提高性能。

····总之,overlay2 存储驱动程序为 Docker 容器提供了高效的文件系统管理功能,使得容器的创建、启动和管理变得更加灵活和高效。

····当时我在解决解决这个问题时搜索出的解决方案大多数是对 overlay2 进行清理,而一些扩容解决方法很少,且讲解并不清晰,甚至一些仅仅只是对其进行复制粘贴,当创建新的镜像容器还是会使用原来的空间。

····为了解决这个问题,我也是测试了好多,最终还是Spring雷博主的Docker overlay2磁盘占用过高文章是最好的,后面也是经过测试,创建新的镜像容器时不会再次用回 70G。

····本文相关参考如下

········CSDN博主:Spring雷

········链接:Docker overlay2磁盘占用过高

一、前期准备

····由于公司不允许直接在服务器操作,故本人自己创建的虚拟机,所以需要一些前期准备,初学者或者想要测试的朋友可以参考,如自己有实际环境可在目录跳过当前准备。

····前提条件:运行 mysql:8.0.32 镜像容器,并在其中创建任意数据库和数据表,用于验证扩容后数据是否存在丢失。编辑虚拟机配置,增加一个硬盘,共计2块,一个100GB,一个200GB(通常服务器的存储配置就是一个256GB或512GB存放系统的固态硬盘,n 多个大容量机械硬盘组成的)。

1、运行 MySQL 镜像容器

1.1、创建挂载到容器内的目录
# 创建文件夹,用于将宿主机的/docker/mysql目录挂载到Docker容器内的/var/lib/mysql目录
# `-p` 参数选项用于创建多级目录
# 当 docker 文件夹不存在时会自动创建后,再在 docker 文件夹中创建 mysql 文件夹
mkdir -p /docker/mysql
1.2、运行 MySQL 镜像容器
# 直接运行 mysql:8.0.32
docker run  --restart=always -p 3306:3306 --name mysql -v /docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=test123 -d mysql:8.0.32

Docker 运行 mysql:8.0.32 命令详解:

  • 为什么当不存在该镜像的情况时直接运行可以成功,请参考
  • docker run:用于在 Docker 中运行一个新的容器。
  • --restart=always:表示容器在退出时总是重新启动。
  • -p 3306:3306:将容器的 3306 端口映射到宿主机的 3306 端口,使得可以通过宿主机访问 MySQL 服务。
  • --name mysql:为容器指定一个名称为 mysql。
  • -v /docker/mysql:/var/lib/mysql:将宿主机上的 /docker/mysql 目录挂载到容器中的 /var/lib/mysql 目录,用于持久化存储 MySQL 数据。
  • -e MYSQL_ROOT_PASSWORD:设置 MySQL 数据库的 root 用户密码。
  • -d mysql:8.0.32:使用 MySQL 8.0.32 镜像来运行容器,并在后台以守护进程方式运行。
1.3、进入 MySQL 镜像容器
# 通过命令查看当前所有正在运行的镜像容器
docker ps
# OR
# 通过命令查看当前所有的镜像容器(包含停止运行、运行错误导致的停止运行的镜像容器)
docker ps -a
# 进入 Docker 容器
docker exec -it <容器ID> bash

在这里插入图片描述

在这里插入图片描述

1.4、创建测试数据库、数据表
# 使用 MySQL 命令行客户端连接到 MySQL 数据库。
mysql -u root -p

····当出现Enter password:提示后,输入在运行时设置的参数-e MYSQL_ROOT_PASSWORD后 MySQL 数据库的 root 用户密码。输入完成后回车即可。

····注意:输入密码时不会有任何字符显示在控制台。

在这里插入图片描述

-- 显示所有数据库
SHOW DATABASES;
-- 创建 test 数据库
CREATE DATABASE test;
-- 选择 test 数据库
USE test;

····注意:如果不选择任何数据库,你仍然可以执行一些操作,比如创建新的数据库、创建表、插入数据等。但是在执行任何查询操作时,你需要明确指定要操作的数据库。

在这里插入图片描述

-- 创建 test 数据表,其中ID为int类型主键自增,text字段为字符串类型
CREATE TABLE test (
    ID INT PRIMARY KEY AUTO_INCREMENT,
    text VARCHAR(255)
);
-- 显示当前数据库下的所有数据表
SHOW TABLES;
-- 向 test 数据表中插入数据
INSERT INTO test (text) VALUES ('aa'), ('bb'), ('cc'), ('dd'), ('ee');
-- 查询 test 数据表中的全部数据
SELECT * FROM test;
-- 退出 MySQL 命令行客户端及 MySQL 镜像容器
exit

在这里插入图片描述

1.5、 显示文件系统的磁盘使用情况
# 显示文件系统的磁盘使用情况
df -h

在这里插入图片描述

​ 此处就可以看到 overlay2 的使用情况及存储位置了

​ OK,至此咱们的前期准备工作就完成了。

2、挂载硬盘

····还记得前期准备工作中提示的给虚拟机增加的硬盘吗,后面咱们的 overlay2 扩容迁移的位置就是这块新硬盘。但是这块硬盘因为没有做任何分区挂载的操作,所以它目前是不可用的状态。

····此处因为整理本篇博文时发现篇幅太长,就把这块单独作为一篇博客发出来了,大家可以参考这篇:

····CSDN博文:CentOS 8 分区挂载硬盘图文教程

····注意:本分区挂载硬盘非专业,仅供参考或本文主题教程使用!如不需分区,直接进行第三步。

二、overlay2 扩容

注意:此方法需停止容器,迁移docker运行目录,请在业务空闲期,备份好数据后操作!

····Docker运行时使用的目录默认 /var/lib/docker,该目录占用根目录磁盘空间,根目录磁盘容量普遍较小。日常生成环境 Linux 常会挂载大容量数据盘,可以将 Docker 默认运行目录修改到数据盘。

····在参考博文中博主介绍了两种方法来修改:

········1、迁移/var/lib/docker数据,创建软连接。此种方法不需要改配置文件。
········2、迁移/var/lib/docker数据,修改 Docker 配置文件。

····那么两者是有一定区别的:

····这两种方法都是修改 Docker 运行路径的,但它们的区别在于对 Docker 本身的配置和操作的影响程度:

  1. 迁移/var/lib/docker数据,创建软连接:

    • 这种方法简单快捷,只需要将/var/lib/docker目录中的数据迁移到新的位置,并在原来的位置创建一个符号链接指向新的位置。这样 Docker 仍然会认为数据存储在原来的位置,对Docker本身的操作和配置没有影响,因此相对来说比较安全。
    • 但是,如果有其他程序直接依赖于/var/lib/docker目录,可能会导致一些问题。
  2. 迁移/var/lib/docker数据,修改 Docker 配置文件:

    • 这种方法需要修改 Docker 的配置文件,将 Docker 的运行路径指定为新的位置,通常需要编辑Docker 的 systemd 配置文件或者 Docker 配置文件来实现。这种方法需要对 Docker 的配置文件进行修改,因此操作相对来说更加复杂,但可以更彻底地改变 Docker 的运行路径。
    • 这种方法对Docker本身的配置和操作有一定影响,如果配置不正确可能会导致 Docker 无法正常启动。

····总的来说,第一种方法相对简单,对 Docker 本身的配置影响较小,但可能会对其他程序造成影响;而第二种方法则更加彻底,但需要谨慎操作以确保 Docker 能够正常运行。所以在选择方案上更贴近于实战,并且减小对其他程序造成的影响和修改的更加彻底,这里仅介绍第二种方法,如果对其他方式感兴趣,可以阅览参考博文。

1、停止所有容器

# 停止所有容器,避免迁移时影响业务
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

····这个命令的作用是停止所有正在运行的 Docker 容器,除了第一行的标题信息之外。让我来解释一下这个命令的各个部分:

  • docker ps -a:列出所有的容器,包括正在运行的和已经停止的。
  • awk '{ print $1}':使用 awk 命令提取出每行中的第一个字段,即容器的 ID。
  • tail -n +2:从第二行开始显示输出,即去掉第一行的标题信息。
  • docker stop $(...):使用 $() 将以上命令的输出作为参数传递给 docker stop 命令,从而停止所有获取到的容器。

····综合起来,这个命令的作用是获取所有容器的 ID,然后停止除了第一个容器之外的所有容器。

在这里插入图片描述

2、备份 Docker 默认运行目录

# 通过复制实现 Docker 默认运行目录的备份(此处建议重命名后放在相同目录下,防止用到时找不到)
cp /var/lib/docker /var/lib/docker-backup -r

-r :这表示递归地复制目录及其内容,所以整个目录结构都会被复制到备份目录中。

在这里插入图片描述

3、切换 Docker 默认运行目录

在此步之前切记优先备份好数据,避免在切换时出现错误导致数据丢失!

# 通过剪切实现切换 Docker 默认运行目录
mv /var/lib/docker <目的目录>

我在准备工作中完成了挂载硬盘的操作,所以我会将 Docker 的运行目录切换到我挂载的硬盘/data/sdb1

在这里插入图片描述

4、修改docker配置文件,添加 “data-root” 路径

# 编辑 Docker 配置文件
vim /etc/docker/daemon.json
// 在文件中增加参数
"data-root": "/data/sdb1/docker"

在这里插入图片描述

····当你进入这个文件夹下,如果/etc/docker/daemon.json文件不存在(如下图所示),Docker可能使用默认配置。可以根据需要创建该文件,并在其中定义自定义配置。

····vim命令虽然是编辑文件的命令,但当文件不存在时,他会先创建文件,再让你编辑。

····注意:若是新建的文件,所有参数应放在 {} 下,如上图所示。

····编辑完成后保存退出

在这里插入图片描述

5、重启 Docker 服务

# 重新加载systemd的配置文件,以便systemd可以读取最新的配置。
systemctl daemon-reload
# 重启 Docker 服务
systemctl restart docker
# 查看 Docker 服务状态
systemctl status docker

在这里插入图片描述

6、启动容器

····由于我只有一个 MySQL 容器,并且在启动时设置了跟随 Docker 自启,所以就不需要重复启动了。大家若有其他容器,可以使用docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)命令重启所有容器

# 重启单个容器
docker restart <容器ID>
# 重启所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

在这里插入图片描述

7、检查原镜像是否存在

# 查看所有镜像
docker images

在这里插入图片描述

8、检查容器是否运行正常

# 查看全部已启动容器
docker ps

我只有一个 MySQL 容器,所以正常

在这里插入图片描述

9、检查docker默认路径是否切换成功

# 显示文件系统的磁盘使用情况
df -h

根据下方的图片可以发现,运行目录已从原来的 /var/lib/docker 转换到了 /data/sdb1/docker

在这里插入图片描述

10、检查 MySQL 容器中的数据是否丢失

# 进入 Docker 容器
docker exec -it <容器ID> bash
# 使用 MySQL 命令行客户端连接到 MySQL 数据库。
mysql -u root -p

····当出现Enter password:提示后,输入在运行时设置的参数-e MYSQL_ROOT_PASSWORD后 MySQL 数据库的 root 用户密码。输入完成后回车即可。

····注意:输入密码时不会有任何字符显示在控制台。

-- 显示所有数据库
SHOW DATABASES;
-- 选择 test 数据库
USE test;
-- 显示当前数据库下的所有数据表
SHOW TABLES;
-- 查询 test 数据表中的全部数据
SELECT * FROM test;
-- 退出 MySQL 命令行客户端及 MySQL 镜像容器
exit

将查询结果与前期准备时插入的数据对比,结果一致,即说明数据没有丢失

在这里插入图片描述

在这里插入图片描述

至此,overlay2扩容完美结束。

我讲的比较啰嗦,其实步骤上还是很简单的。

文章中若有什么错误或者大家有什么疑问欢迎评论区提出。


声明:本文倾向于实战,可直接应用于个人、小型初创型公司或小型客户。如具有一定规模建议聘用专业运维人员!本文不对任何后果负责,请知悉!

今天的文章docker overlay2 空间满了_docker修改容器端口分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81469.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注