docker 存储扩容和存放路径修改

本文详细介绍了如何在不重启服务的情况下动态扩展Docker容器的磁盘空间,包括检查文件系统、调整DeviceMapper表、更新文件系统大小等关键步骤,并解决了扩容后可能出现的启动问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1.1 Docker 磁盘扩容

 

默认情况下,物理机下创建的docker容器的空间是10G(虚拟机下创建的docker容器空间就是虚拟机的空间)。

Docker容器动态扩展的优点:
1)不需要修改docker配置,不需要重启docker服务;
2)可以直接对运行中的容器进行动态扩展(只能增,无法缩);

Docker容器动态扩展的条件:
1)docker所在宿主机分区的格式必须是ext2、ext3、ext4、xfs;
2)docker存储引擎必须是devicemapper

 

[root@localhost ~]# docker exec -it test1 /bin/bash

root@4f69d970a7b2:/usr/local/tomcat# cd

 

root@4f69d970a7b2:~# df -HT

Filesystem                                                                                          Type   Size  Used Avail Use% Mounted on

/dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20 xfs     22G  537M   21G   3% /

tmpfs                                                                                               tmpfs   68M     0   68M   0% /dev

tmpfs                                                                                               tmpfs  513M     0  513M   0% /sys/fs/cgroup

/dev/mapper/centos-root                                                                             xfs     41G  2.1G   39G   6% /etc/hosts

shm                                                                                                 tmpfs   68M     0   68M   0% /dev/shm

tmpfs                                                                                               tmpfs  513M     0  513M   0% /proc/scsi

tmpfs                                                                                               tmpfs  513M     0  513M   0% /sys/firmware

使用dmsetup查看该文件扇区信息.下面命令结果中的第二个数字(即20971520)是设备的大小,表示有多少个 512-bytes 的扇区. 这个值略高于 10GB 的大小。

 

[root@localhost ~]# dmsetup table /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

0 20971520 thin 253:2 21

[root@localhost ~]# echo $((20*1024*1024*1024/512))

41943040

精简快照目标的一个神奇的特点是它不会限制卷的大小。当创建它的时候,一个精简的卷使用0个块,当开始往块里面写入的时候,它们会从共用的块池中进行分配。

可以写0个块,或者是10亿个块,这个和精简快照目标没关系。文件系统的大小只和Device Mapper表有关系。

只需要装载一个新的表,这个完全和之前的是一样的,但是有更多的扇区。仅此而已。

 

[root@localhost ~]# echo 0 41943040 thin 253:2 21|dmsetup load /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

[root@localhost ~]# dmsetup resume /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

[root@localhost ~]# dmsetup table /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

0 41943040 thin 253:2 21

更改文件系统大小,使变更生效

centos6 ext4 文件系统使用resize2fs centos7 xfs使用 xfs_growfs

[root@localhost ~]# xfs_growfs /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

meta-data=/dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20 isize=256    agcount=16, agsize=163824 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0        finobt=0

data     =                       bsize=4096   blocks=2621184, imaxpct=25

         =                       sunit=16     swidth=16 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal               bsize=4096   blocks=2560, version=2

         =                       sectsz=512   sunit=16 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

data blocks changed from 2621184 to 5242880

扩容后可能出现的问题:停止该容器后,无法重新启动-

当容器扩容之后,由于dm认为设备块大小仍然为之前设置的初始大小,所以会发生无法起启动的情况,这时只要重新操作即可。

必须要先启动一下,让其生成dm文件才能修改

[root@localhost ~]# docker stop test1

test1

[root@localhost ~]# docker start test1

Error response from daemon: devmapper: Error mounting '/dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20' on '/var/lib/docker/devicemapper/mnt/8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20': input/output error

<5>[ 1466.086161] XFS (dm-4): Unmounting Filesystem

<6>[ 1471.776965] attempt to access beyond end of device

<6>[ 1471.776967] dm-4: rw=32, want=41943040, limit=20971520

<4>[ 1471.776969] XFS (dm-4): last sector read failed

Error: failed to start containers: test1

[root@localhost ~]# echo 0 41943040 thin 253:2 21|dmsetup load /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

[root@localhost ~]# dmsetup resume /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

[root@localhost ~]# docker start test1

test1

1.2 Docker镜像和容器存放目录修改方法

[root@localhost ~]# mv /var/lib/docker /var/lib/docker_bak

[root@localhost ~]# mkdir -p /home/var/docker

[root@localhost ~]# vim /usr/lib/systemd/system/docker.service

[root@localhost ~]# cat /usr/lib/systemd/system/docker.service |grep ExecStart

ExecStart=/usr/bin/dockerd --graph /home/var/docker

[root@localhost ~]# systemctl start docker

[root@localhost ~]# ls /home/var/docker/

builder  containerd  containers  devicemapper  image  network  plugins  runtimes  swarm  tmp  trust  volumes

[root@localhost ~]# rm -rf /home/var/docker/*

[root@localhost ~]# mv /var/lib/docker_bak/* /home/var/docker/

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

ubuntu              16.04               a51debf7e1eb        6 days ago          116MB

tomcat              latest              78b258e36eed        9 days ago          463MB

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES

4f69d970a7b2        tomcat:latest       "/bin/bash"         42 minutes ago      Exited (0) 7 minutes ago                       test1

c6c2eed26cf5        ubuntu:16.04        "/bin/bash"         About an hour ago   Exited (0) 7 minutes ago                       test

[root@localhost ~]# docker start test1

Error response from daemon: devmapper: Error mounting '/dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20' on '/home/var/docker/devicemapper/mnt/8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20': input/output error

<6>[ 3136.484691] attempt to access beyond end of device

<6>[ 3136.484694] dm-3: rw=32, want=41943040, limit=20971520

<4>[ 3136.484696] XFS (dm-3): last sector read failed

Error: failed to start containers: test1

[root@localhost ~]# echo 0 41943040 thin 253:2 21|dmsetup load /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

[root@localhost ~]# dmsetup resume /dev/mapper/docker-253:0-201995560-8b92c0e22cb3747dd4d5b97d8dde120757964a1dc0bcf4340831654f68532b20

[root@localhost ~]# docker start test1

test1

参考:https://www.cnblogs.com/kevingrace/category/839227.html                                                                                        

转载于:https://www.cnblogs.com/Honeycomb/p/10022200.html

### Docker 中单例模式与多例模式的区别及应用场景 #### 单例模式的概念及其特点 在软件设计中,单例模式是一种常见的设计模式,它确保某一个类仅有一个实例,并提供全局访问点。对于 Docker 而言,虽然其本身并未直接定义“单例”这一概念,但在实际应用中可以通过某些方式实现类似的行为。例如,在容器编排工具(如 Kubernetes 或 Docker Compose)中,通过配置文件指定某个服务运行单一副本的方式可以视为一种单例模式的应用[^1]。 这种模式的主要特点是: - **唯一性**:在整个系统生命周期内,该服务始终只有一个活跃的实例。 - **资源共享**:多个客户端请求均指向同一个服务实例,从而减少资源消耗并提升效率。 - **性能优化**:由于减少了重复创建销毁操作,能够有效降低开销,特别是在高并发环境下表现尤为明显。 #### 多例模式的概念及其特点 相对应于单例模式,“多例”则允许同一类型的服务存在多个独立实例。在 Docker 的上下文中表现为启动多个相同的容器镜像实例来分担负载或者增强冗余度以保障业务连续性。比如在一个分布式架构里部署 Web 应用程序时通常会采用这种方式——即水平扩展技术。 此类方法具备如下特性: - **弹性伸缩能力**:依据实时流量动态调整工作节点数量;既可以在高峰期增加处理单元又能在低谷期缩减规模节省成本。 - **容错机制加强**:即使部分服务器出现问题也不会影响整体服务质量因为还有其他备用选项可用。 #### 两者之间的区别对比表 | 特征/维度 | 单例模式 | 多例模式 | |------------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | 实例数目 | 整个应用程序范围内保持唯一的实例 | 可拥有任意数量的不同实例 | | 并发支持情况 | 对所有线程共享数据结构的操作必须同步保护以免引发竞争条件 | 各自维护自己的状态空间所以不存在上述顾虑 | | 初始化时机 | 提前加载至内存以便随时调用 | 按需触发 | | 使用场景举例说明 | 数据库连接池管理器、日志记录设施等 | 微服务体系下的各个微服务模块 | #### 场景分析 ##### 单例模式适用场合 当希望保证特定功能逻辑在整个系统中有且仅有一次执行路径的时候适合选用此方案。例如: - 配置中心:集中存储各类参数设置供下游消费方读取更新而无需担心版本冲突等问题; - 缓存代理层:统一对外暴露接口屏蔽底层复杂细节同时兼顾高效检索需求; - 日志收集端口监听者角色承担起汇聚来自不同源头的消息职责进而持久化保存起来便于后续审计追踪之用等等情形皆可考虑引入单例设计理念加以解决[^3]。 ##### 多例模式典型运用领域 而对于那些强调横向扩容潜力以及高度可靠性的任务来说,则更倾向于采纳多例策略来进行规划布局。具体而言包括但不限于以下几个方面: - API网关集群建设旨在分流外部来访压力并通过健康检测剔除异常成员维持正常运转秩序; - 计算密集型作业分配给分布在多地数据中心里的计算引擎共同协作完成大规模科学运算挑战; - 存储阵列组建过程中为了满足海量非结构化资料存放诉求往往也会采取类似的思路构建庞大的物理设备集合体作为支撑底座[^2]。 ```python import docker client = docker.from_env() # 创建单例模式示例 singleton_container = client.containers.run('nginx', detach=True, name='my-singleton-container') # 创建多例模式示例 replicated_containers = [] for i in range(3): # 假设我们需要三个副本 container_name = f'my-replica-{i}' replicated_containers.append(client.containers.run('nginx', detach=True, name=container_name)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值