Docker - 常用操作合集

2025年03月22日 09:03:38    [原创]


1. 修改Docker默认存储位置

通过 Snap 安装的 Docker(snap install docker)受 Snap 沙盒限制,无法直接通过 daemon.json 或 --data-root 修改存储路径

Snap 版 Docker 的路径限制原因:

限制类型
具体表现
沙盒隔离
Snap 应用只能访问 /home、/media 等白名单目录,其他路径需手动授权。
权限固化
Snap 的 docker 包在构建时锁定了数据目录,未开放 data-root 配置接口。
系统服务冲突
Snap 版 Docker 的服务文件(snap.docker.dockerd.service)无法直接修改挂载参数。

1:停止所有容器和docker

  
docker stop xxx         // 停止所有容器
systemctl stop docker   // 停止docker

如果执行完提示:
Warning: Stopping docker.service, but it can still be activated by:docker.socket

则执行 
systemctl stop docker.socket 完全停止docker

docker ps 再次确认容器都已经停止
  

2:拷贝原docker根目录数据到新目录

  
cp -va /var/lib/docker/*   /newdir/          // /newdir/ 是新的docker存储目录
  

3:修改docker service文件

Docker19.xx 新增data-root代替了graph参数

  
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph=/newdir/   // 在ExecStart=末尾添加:--graph=/newdir
  

4:重载配置并重启docker和容器

  
systemctl daemon-reload
systemctl restart docker
  

5:查看修改是否生效

  
执行 docker info | grep 'Docker Root Dir',查看对应目录是否为修改后的目录
  

6:启动容器

  
确认修改成功后执行 docker start  xxx,启动所有容器
  

7:其他方式

方式2:软连接(不推荐)

缺点:影响后续docker版本升级、增加后期维护成本、性能损失、创建错误(源目的目录容易弄反)

  
mv /var/lib/docker /disk/docker
ln -s /disk/docker /var/lib/docker
  

方式3:修改docker配置文件,需要docker是1.12或以上的版本

缺点:不同docker版本配置文件路径可能不同,导致路径分散不利于统一化管理和维护

Docker19.xx 新增data-root代替graph参数,但同时也兼容graph,如果graph参数报错则改用data-root

注:修改前同样需要停止容器和docker,同时完成目录数据的迁移工作

修改(不存在则新建)/etc/docker/daemon.json文件

  
vim /etc/docker/daemon.json
{"原有配置", "graph": "/disk/docker"} // 在原有配置文件末尾添加 "graph": "/disk/docker"

修改完执行 systemctl restart docker 重启docker
  

2. 限制容器占用磁盘大小

2.1 devicemapper

设置容器磁盘大小在docker run时候加载参数 --storage-opt dm.basesize=20G 用来调整默认容器的rootfs大小;


docker run -it -d --restart=always --net=host --storage-opt dm.basesize=20G  --name nginx  nginx:latest
          

也可以修改docker配置文件:

注:需要在docker run之前配置,对已存在的容器不生效

vim /etc/docker/daemon.json
"storage-opt": [ "dm.basesize=20G" ]
          

2.2 overlay2

注:overlay2 + XFS + pquota 组合才能启用 storage-opt size 功能,ext3/4文件系统在overlay2驱动下不支持storage-opt size参数。

确认是否开启ftype功能


xfs_info /dev/vdb | grep ftype  // 输出ftype=1则代表已开启ftype功能
mkfs.xfs -n ftype=1 /dev/vdb    // 如果未开启则重新初始化文件系统
          

重新以pquota方式挂载磁盘


umount /test
mount -o pquota /dev/vdb /test
          

在创建容器的时候使用参数--storage-opt size=30G来设置改容器的 rootfs 大小。


docker run -it -d --restart=always --net=host --storage-opt size=30G  --name nginx  nginx:latest
          

也可以修改docker配置文件:

注:需要在docker run之前配置,对已存在的容器不生效

vim /etc/docker/daemon.json
"storage-opts": ["overlay2.size=30G"]
          

3. 修改容器空间限制大小


一、devicemapper驱动

devicemapper驱动下,容器空间默认有10G的大小限制,下面是修改其限制大小的详细步骤。

1. 查看容器设备名称


docker inspect -f '{{.GraphDriver}}' 容器名 
  

2. 查看设备对应的卷信息


dmsetup table docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7
  

3. 计算扩容后的大小

20是扩容后的大小,单位是G,根据实际需求自行设置其大小。


echo $((20*1024*1024*1024/512))
41943040
  

4. 更新容器设备大小限制值

41943040是更新后预期的容器限制大小,thin 252:5 6是步骤2输出的信息

docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7是步骤1查看的设备名称


echo 0 41943040 thin 252:5 6 | dmsetup load docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7   // 装载一个新表

dmsetup resume docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7   // 激活新表
  

5. 扩容文件系统大小


# 查看设备所属文件系统类型
findmnt | grep /dev/mapper/docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7

# 扩容文件系统大小
resize2fs /dev/mapper/docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7  // ext4文件系统扩容命令
xfs_growfs /dev/mapper/docker-253:1-1836355-a65fff83547c955b2152461ef731e8b3ea73338bbf2968322d3fab485506d0d7  // xfs文件系统扩容命令
  

6. 查看容器空间限制


docker  restart 容器名   // 重启容器
df -h                    // 查看更新后的容器空间限制
  

二、 overlay驱动 - 创建时设置了限额

overlay驱动下,容器空间如果创建的时候设置了--storage-opt size,可以通过修改 xfs 限额来调整容器的限制大小。

1. 查看容器限额信息

docker 容器默认会添加2条限额信息,根据限制大小查找对应是哪2条。


xfs_quota -x -c 'report'  /var/lib/docker    // docker根目录如果手动指定则替换为对应替换后的目录
  

2. 更新容器对应的限额信息

29g是要预期扩容的大小,12和13是步骤1显示的限额条目对应的Project ID

2个Project ID都要修改才能生效


xfs_quota -x -c "limit -p bhard=29g 12" /var/lib/docker      
xfs_quota -x -c "limit -p bsoft=29g 12" /var/lib/docker

xfs_quota -x -c "limit -p bhard=29g 13" /var/lib/docker      
xfs_quota -x -c "limit -p bsoft=29g 13" /var/lib/docker
  

3. 重启容器


docker  restart 容器名  
  

4. 查看限额修改是否生效


df -h   // 查看大小是否更新

docker exec -it  容器名  bash
df -h /  // 查看大小是否更新
  

三、 overlay驱动 - 创建时未设置限额

overlay驱动下,容器空间如果创建的时候未设置--storage-opt size,默认是不限制容器占用磁盘大小的,可通过创建xfs限额来设置容器限额。

1. 获取容器存储路径


# 获取容器ID
CONTAINER_NAME="your-container"
CONTAINER_ID=$(docker inspect -f '{{.Id}}' $CONTAINER_NAME)

# 获取读写层和工作层路径
UPPER_DIR=$(docker inspect -f '{{.GraphDriver.Data.UpperDir}}' $CONTAINER_ID)
WORK_DIR=$(docker inspect -f '{{.GraphDriver.Data.WorkDir}}' $CONTAINER_ID)
  

2. 停止容器


docker stop 容器名称
  

3. 设置项目配额


# 获取项目ID(使用目录inode)
UPPER_PROJ_ID=$(stat -c %i "$UPPER_DIR")
WORK_PROJ_ID=$(stat -c %i "$WORK_DIR")

# 设置配额(例如30GB)
QUOTA_SIZE="30G"

# 应用配额到读写层
sudo xfs_quota -x -c "project -s -p $UPPER_DIR $UPPER_PROJ_ID" /var/lib/docker
sudo xfs_quota -x -c "limit -p bhard=$QUOTA_SIZE $UPPER_PROJ_ID" /var/lib/docker

# 应用配额到工作层
sudo xfs_quota -x -c "project -s -p $WORK_DIR $WORK_PROJ_ID" /var/lib/docker
sudo xfs_quota -x -c "limit -p bhard=$QUOTA_SIZE $WORK_PROJ_ID" /var/lib/docker
  

4. 验证配额设置


sudo xfs_quota -x -c 'report -p' /var/lib/docker
  

5. 启动容器


docker start 容器名
  

6. 验证容器内空间


docker exec 容器名 df -h /
  

4. 容器空间不足导致启动失败

一、 devicemapper驱动

devicemapper驱动下,容器空间默认有10G的大小限制,如果空间占用超过这个限制就会导致容器启动失败,这个限制不包含数据卷(Volume)占用的空间。这时候就需要手动挂载设备删除部分文件,释放空间后再启动容器。

1. 查看容器id


docker ps -a
  

2. 查看容器的设备id


cd /var/lib/docker
cat image/devicemapper/layerdb/mounts/容器id/mount-id

输出信息中:device_id就是设备ID
{"device_id":34709,"size":10737418240,"transaction_id":844170,"initialized":false,"deleted":false}
  

3.查看已经创建的dm设备列表和table


dmsetup ls
dmsetup table

docker1-thinpool	(252:5)
docker1-thinpool_tdata	(252:3)
docker1-thinpool_tmeta	(252:1)

我们这里要找的设备是docker1-thinpool	(252:5), 其他设备都是这个分出去的,记住它的设备号:252:5。
  

4. 创建dm设备

252:5替换为步骤3中找到的设备号,252:5 34709,这里252:5是步骤3中找到的设备号,34709是步骤2确定的设备id,0 20971520写该固定值即可,表示0-10G。

3693860-dad0ce9e1adcfe76df319443f429698eafa52dd6c6cb4fb8192f0846656f8824可随意设置,只要和当前设备名称不冲突即可。


ls /dev/dm-*  // 创建前先查看当前已有设备列表
dmsetup create docker-252:5-3693860-dad0ce9e1adcfe76df319443f429698eafa52dd6c6cb4fb8192f0846656f8824 --table "0 20971520 thin 252:5 34709"
  

5. 查看创建的dm设备


dmsetup ls
ls /dev/dm-*  // 如果可以看到新增的设备代表创建成功
  

6. 挂载dm设备


mount /dev/dm-5 /test  // /test目录可替换其他任意目录,用于临时挂载设备
df -h                  // 查看挂载的设备是否挂载成功
ls -l /test/rootfs/    // 查看文件目录和内容是否和启动失败的容器一致
  

7. 删除文件释放空间


cd /test/rootfs/
查找并删除可以删除的文件,以便释放容器占用空间
  

8. 卸载移除设备


umount /test
dmsetup remove docker-252:5-3693860-dad0ce9e1adcfe76df319443f429698eafa52dd6c6cb4fb8192f0846656f8824
  

9. 重新启动容器


docker  start  容器名,如果启动成功则问题解决。
  

二、overlay2驱动

overlay2驱动下,可以通过--storage-opt size参数限制容器占用空间,如果空间占用超过这个限制就会导致容器启动失败,这个限制不包含数据卷(Volume)占用的空间。这时候就需要手动挂载设备删除部分文件,释放空间后再启动容器。

1. 停止容器(避免数据不一致)


docker stop 容器名
  

2. 创建临时挂载点目录


mkdir -p /mnt/container
  

3.获取容器存储信息


# 获取容器 ID
CONTAINER_ID=$(docker inspect -f '' 容器名)

# 查看容器存储驱动信息
docker inspect -f '{{json .GraphDriver}}' $CONTAINER_ID 
  

4. 手动挂载 OverlayFS



mount -t overlay overlay \
-o lowerdir=$(docker inspect -f '{{.GraphDriver.Data.LowerDir}}' $CONTAINER_ID),\
upperdir=$(docker inspect -f '{{.GraphDriver.Data.UpperDir}}' $CONTAINER_ID),\
workdir=$(docker inspect -f '{{.GraphDriver.Data.WorkDir}}' $CONTAINER_ID) \
/mnt/container

  
参数
作用
lowerdir
只读的基础镜像层(多个目录用 : 分隔)
upperdir
可写的容器层(存储所有修改)
workdir
OverlayFS 内部工作目录

5. 验证挂载


# 查看挂载结果
mount | grep overlay  // 应显示:overlay on /mnt/container type overlay (...)

# 浏览容器文件系统
ls /mnt/container    // 应看到容器内的文件结构
  

6. 删除文件释放空间


删除 /mnt/container 目录中的不需要的文件和目录,以释放空间。
  

7. 取消挂载


umount  /mnt/container
  

8. 启动容器


docker  start  容器名,如果启动成功则问题解决。
  

5. 修改容器的挂载路径

1:停止容器运行

  
docker stop 容器名
  

2:先备份要修改的文件

  
cd /var/lib/docker/containers/容器ID
cp -a config.v2.json config.v2.json.bak
cp -a hostconfig.json hostconfig.json.bak
  

3:修改hostconfig.json配置文件

  
vim hostconfig.json
"binds":["/xx/xx:/xxx"] // 示例:"Binds":["/skylar:/tmp"],前面是宿主机路径,后面是容器内路径
  

4:修改config.v2.json配置文件

Source: 宿主机目录,Destination/Target:容器内目录

修改对应要修改的目录即可

  
"/tmp": {
	"Source": "/test",
	"Destination": "/tmp",
	"RW": true,
	"Name": "",
	"Driver": "",
	"Type": "bind",
	"Propagation": "rprivate",
	"Spec": {
		"Type": "bind",
		"Source": "/test",
		"Target": "/tmp"
	},
	"SkipMountpointCreation": false
}
  

5:重启docker服务

注意:必须重启,如果不重启就启动容器,上面修改的配置文件会恢复原样

  
systemctl restart docker
  

6:启动容器

  
docker start 容器名
  

6. 修改容器的映射端口

1:停止容器运行

  
docker stop 容器名
  

2:先备份要修改的文件

  
cd /var/lib/docker/containers/容器ID
cp -a hostconfig.json hostconfig.json.bak
  

3:修改hostconfig.json配置文件

443/tcp 是容器内的端口和协议,HostPort是对应宿主机映射的端口号

  
vim hostconfig.json
"PortBindings":{
"443/tcp":[{"HostIp":"","HostPort":"9000"}],
"80/tcp":[{"HostIp":"","HostPort":"9001"}]
} 
  

4:修改config.v2.json配置文件

999/tcp 是容器内的端口和协议

  
vim config.v2.json
"ExposedPorts":{"80/tcp":{},"999/tcp":{}},
  

5:重启docker服务

注意:必须重启,如果不重启就启动容器,上面修改的配置文件会恢复原样

  
systemctl restart docker
  

6:启动容器

  
docker start 容器名
  

7. 清理无用的资源

1:清理多余的容器和镜像


docker system prune -af

参数介绍:
-a(或 --all) 删除所有未使用的镜像(包括未被容器引用的镜像,而不仅仅是无标签的悬挂镜像)
-f(或 --force) 跳过确认提示,强制删除
          

该命令清理的资源列表:

清理资源
详细介绍
停止的容器
运行过但已停止的测试容器
未使用的网络
自定义创建但未被任何容器使用的网络。
所有未使用的镜像
未被任何容器或镜像依赖的旧版本镜像、临时拉取的镜像。
悬空镜像
构建过程中生成的中间层镜像(无标签)
构建缓存
Dockerfile 构建过程中产生的缓存层

2:清理多余的大文件


# 查找docker 根目录下大于1G的文件
find /var/lib/docker -type f -size +1G -print0 | xargs -0r du -h | sort -h

# 或者查找docker 根目录下指定文件名后缀且大于1G的文件
find /skylar/  -type f -name "*.log" -size +1G -print0 | xargs -0r du -h | sort -h

# 删除找到的文件并打印删除信息
find /var/lib/docker -type f -size +1G -printf "Deleting: %p (Size: %s bytes)\n" -delete
          

8. Docker容器的重启策略

Docker容器的重启策略如下:

策略名称
详细介绍
no
默认策略,在容器退出时不重启容器
on-failure
在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3
在容器非正常退出时重启容器,最多重启3次
always
在容器退出时总是重启容器
unless-stopped
在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

动态修改:docker container update --restart=always 容器名字


9. 创建容器示例

1: 参数详解

参数名称
详细介绍
-d
指定容器以后台运行模式,默认为前台运行
-i
交互式输入模式,打开STDIN,用于控制台交互
-t
分配tty设备,该可以支持终端登录,默认为false
-u
指定容器的用户
-w
指定容器的工作目录
-c
设置容器CPU权重,在CPU共享场景使用
-e
指定环境变量,容器中可以使用该环境变量
-m
指定容器的内存上限
-P
随机端口映射,容器内部端口随机映射到主机的端口(49153起始 49153到65535)
-p
将容器的端口映射到主机上的一个端口,格式:主机(宿主)端口:容器端口
-h
指定容器的主机名
-v
给容器挂载存储卷,挂载到容器的某个目录,格式:host目录:容器目录
--name=""
指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge"
容器网络设置
  bridge 使用docker daemon指定的网桥
  host //容器使用主机的网络
  container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
  none 容器使用自己的网络(类似--net=bridge),但是不进行配置容器网络设置
--privileged
指定容器是否为特权容器,特权容器拥有所有的capabilities,默认false
示例:docker run --privileged image_name
--restart="no"
指定容器停止后的重启策略
  no:容器退出时不重启
  on-failure:容器故障退出(返回值非零)时重启
  always:容器退出时总是重启
--cpuset=""
设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--cpu-quota
设置容器的 CPU 配额,以微秒为单位。
示例:docker run --cpu-quota=50000 image_name
--cpu-period
设置容器的 CPU 周期,以微秒为单位。
示例:docker run --cpu-period=100000 image_name
--cpu-shares
设置容器的 CPU 份额,用于控制 CPU 资源的分配。
示例:docker run --cpu-shares 512 image_name
--tmpfs
在容器内创建临时文件系统,用于存储临时数据
示例:docker run --tmpfs /tmp image_name
--ulimit
设置容器的资源限制,如最大打开文件数、最大进程数等。
示例:docker run --ulimit nofile=1024:1024 image_name
--security-opt
设置容器的安全选项,如 AppArmor 配置、Seccomp 配置等。
示例:docker run --security-opt seccomp:unconfined image_name
--volume-driver
指定容器使用的卷驱动程序。
示例:docker run --volume-driver my_driver image_name
--shm-size
设置容器的共享内存大小。
示例:docker run --shm-size 2g image_name
--add-host
向容器的 /etc/hosts 文件添加自定义主机名和 IP 映射。
示例:docker run --add-host myhost:192.168.0.100 image_name
--read-only
将容器的文件系统设置为只读模式。
示例:docker run --read-only image_name
--dns-option
为容器的 DNS 配置添加自定义选项。
示例:docker run --dns-option=timeout:5 image_name
--sysctl
设置容器的内核参数。
示例:docker run --sysctl net.ipv4.ip_forward=1 image_name
--label
为容器添加标签,用于识别和组织容器。
示例:docker run --label env=production image_name
--volumes-from=[]
给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[]
添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
示例:docker run --cap-add=SYS_ADMIN image_name
--cap-drop=[]
删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile=""
运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--device=[]
添加主机设备给容器,相当于设备直通
--dns=[]
指定容器的dns服务器
--dns-search=[]
指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint=""
覆盖image的入口点
--env-file=[]
指定环境变量文件,文件格式为每行一个环境变量
--expose=[]
指定容器暴露的端口,即修改镜像的暴露端口
--link=[]
指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[]
指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--rm=false
指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true
设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

2: 创建容器示例


docker run -it -d --restart=always  -v /test:/tmp --net=host  --name nginx nginx:latest
          

10. 华为云docker镜像地址


镜像地址:Swr.cn-north-4.myhuaweicloud.com
拉取示例:docker pull Swr.cn-north-4.myhuaweicloud.com/library/redis
          

11. 不停止容器重启docker守护进程

默认情况下,当 Docker 守护程序终止时,它会关闭正在运行的容器。

从 Docker-ce 1.12 开始,可以在配置文件中添加 live-restore 参数,以便在守护程序变得不可用时容器保持运行。


# 修改配置文件
sudo vim /etc/docker/daemon.json
{
  "其他配置", "live-restore": true
}

# 使用reload重载,相当于发送SIGHUP信号量给dockerd守护进程
sudo systemctl reload docker

# 确认配置生效
docker info | grep Live

# 如果修改了网络设置,则需要执行restart
sudo systemctl restart docker
          

12. Docker 容器中文异常


# 查看容器支持的字符集
root@b18f56aa1e15:# locale -a
C
C.UTF-8
POSIX

# 临时解决
docker exec -it some-mysql env LANG=C.UTF-8 /bin/bash

# 永久解决
docker run --name xxx --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

13. Crontab 添加docker命令

Crontab定时任务 执行docker命令的时候,并不是交互式的,所以需要把-i参数去掉才可以


0 */6 * * * docker exec -t container_name sh -c '...'
          

14. CI工具 添加docker命令

而 CI 在执行 job 的时候并不是在 TTY 终端中执行,所以 -t 这个参数会报错,需要删除这个参数


steps:
  - name: 启动依赖容器
    run: |
      docker exec my-container sh -c "echo 'Hello from CI!' > /app/output.txt"
          

15.查看镜像依赖关系

镜像之间如果有依赖关系,无法直接删除,这时候就需要查找其依赖的镜像


docker image inspect --format='  ' $(docker image ls -q --filter since=镜像ID)
          

16.docker启动超时设置

有时候会出现启动时间很长的场景,需要增大超时时间,避免导致启动失败。


sudo vim /etc/profile
export COMPOSE_HTTP_TIMEOUT=500
export DOCKER_CLIENT_TIMEOUT=500
source  /etc/profile
          

17.查看镜像依赖关系

镜像之间如果有依赖关系,无法直接删除,这时候就需要查找其依赖的镜像


docker image inspect --format='  ' $(docker image ls -q --filter since=镜像ID)
          

18.docker 共享内存设置

docker 给容器默认分配的 shm 大小为 64M,如果不够用会导致容器启动失败


docker run -it --rm --shm-size=200m nginx:latest
          

19.docker 各目录详解

目录名称
详细介绍
containers
存储 容器运行时数据。每个容器对应一个子目录(目录名为容器 ID)
image
存储 镜像元数据 和 层信息。
overlay2 子目录:记录镜像层与存储驱动的关联元数据。
imagedb:镜像数据库(如镜像 ID、标签、构建历史等)
network
管理 Docker 网络 的配置和状态。
files:网络配置文件(如 local-kv.db 存储网络信息)。
plugins:网络驱动插件(如 bridge、macvlan 等)的元数据。
overlay2
Overlay2 存储驱动 的核心目录,用于管理镜像层和容器文件系统。
每个子目录对应一个镜像层或容器读写层,随机ID-init是始化层。
l 目录:符号链接到镜像层的短标识符。
diff:每个层的内容变更(实际文件差异)。
merged:容器挂载点的联合文件系统视图。
work:OverlayFS 内部工作目录。
plugins
存储 Docker 插件 的持久化数据。 包括卷插件(如 local、nfs)、网络插件(如 weave)的配置和状态。
runtimes
存放 容器运行时 的临时数据(如 runc 或 containerd 的运行状态)。
tmp
Docker 临时文件的暂存目录。用于存储临时生成的密钥、证书或进程文件
trust
管理 Docker 内容信任(DCT) 的密钥和元数据。存储镜像签名密钥(如 private_key 和 root_keys)
volumes
存储 Docker 卷 的实际数据。每个卷对应一个子目录

20.direct-lvm模式配置

1. 停止docker


systemctl stop docker
  

2. 安装下面软件包


yum install device-mapper-persistent-data lvm2 -y
  

3. 创建pv


sudo pvcreate /dev/sdb
  

4. 创建vg


vgcreate docker /dev/sdb
  

5. 创建lv


sudo lvcreate --wipesignatures y -n thinpool docker -l 95%VG
sudo lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
  

6. 将lv转换为thinpool


sudo lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
  

7. 配置thinpool池的自动扩展


sudo vi /etc/lvm/profile/docker-thinpool.profile

activation {
  thin_pool_autoextend_threshold=80 //当thinpool的数据或元数据使用率达到80%时,触发自动扩展
  thin_pool_autoextend_percent=20   //每次自动扩展时,thinpool的容量将增加当前大小的20%
}
  

8. 应用配置变更


sudo lvchange --metadataprofile docker-thinpool docker/thinpool
  

9. 状态监控检查


sudo lvs -o+seg_monitor
  

10. 编辑/etc/docker/daemon.json

下面是另外2种创建direct-lvm的方法:

dm.directlvm_device=/dev/sdb1: 该方式直接自动初始化DirectLVM环境(自动完成3-9步骤),这里/dev/sdb1是磁盘分区。 --生产环境不推荐该方法

dm.datadev=/dev/sdb1,dm.metadatadev=/dev/sdb2: 该方式直接定义数据设备和元数据设备 (无需3-9步骤),这里定义的设备是磁盘分区。 --生产环境不推荐该方法


{
    "storage-driver": "devicemapper",
    "storage-opts": [
    "dm.thinpooldev=/dev/mapper/docker-thinpool",
    "dm.use_deferred_removal=true",
    "dm.use_deferred_deletion=true"
    ]
}
  

参数解释:

选项
描述
dm.thinpooldev
配置的thinpool路径。
dm.directlvm_device
direct-lvm模式配置的块设备的路径
dm.thinp_percent
传入块设备中用于存储的空间百分比
dm.thinp_metapercent
传入块设备中用于元数据存储的空间百分比
dm.thinp_autoextend_threshold
触发thinpool的数据自动扩展的阈值
dm.thinp_autoextend_percent
每次自动扩展时,thinpool的容量将增加当前大小的百分比
dm.directlvm_device_force
是否格式化块设备,即使其上已存在文件系统。如果设置为false并且存在文件系统,则会记录错误并保持文件系统不变。

11. 启动docker


sudo systemctl  start docker
  

12. docker info验证更改


查看docker info输出的Storage Driver一项是否变更为:devicemapper