Docker容器数据管理详解
概述
在Docker环境中管理容器数据主要通过两种机制实现:数据卷(Volumes)和数据卷容器(Volume Containers)。这两种方式都能解决容器数据持久化的问题,但在使用场景和操作方式上有所不同。
数据卷
数据卷是Docker提供的特殊目录机制,其作用类似于Linux系统中的挂载点。数据卷独立于容器生命周期之外,即使容器被删除,数据卷仍然保留。
数据卷的核心特性
- 共享性:一个数据卷可同时供多个容器访问和使用
- 即时生效:对数据卷内容的修改会立即反映到所有访问该卷的容器
- 独立性:数据卷的更新不会影响容器镜像本身
- 持久性:默认情况下,即使容器被删除,数据卷仍会保留在系统中
挂载本地目录到容器
使用docker run命令的-v参数可以将本地主机目录或文件挂载到容器内部。通过多次使用-v参数,可实现多个数据卷的挂载。
注意事项:
- 本地路径必须使用绝对路径形式
- 如果指定路径不存在,Docker会自动创建
- 默认挂载权限为读写模式
- 可通过
:ro参数将挂载设置为只读 - 建议挂载父目录而非单个文件,避免因容器内编辑导致主机文件inode变化
清理数据卷
数据卷不会随容器自动删除,需要显式操作。执行docker rm -v命令可在删除容器的同时移除关联的数据卷。
操作示例
[root@CentOS7 ~]# docker run -itd --name app-container -v /opt:/opt docker.io/ubuntu /bin/bash
a1b2c3d4e5f6789012345678abcdef0123456789abcdef01234567890abcd
[root@CentOS7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 docker.io/ubuntu "/bin/bash" 10 seconds ago Up 8 seconds app-container
[root@CentOS7 ~]# docker inspect app-container
[
{
"Id": "a1b2c3d4e5f6789012345678abcdef0123456789abcdef01234567890abcd",
"Created": "2024-03-15T10:25:30.123456789Z",
"Path": "/bin/bash",
"Mounts": [
{
"Source": "/opt",
"Destination": "/opt",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
}
]
[root@CentOS7 ~]# docker attach app-container
root@a1b2c3d4e5f6:/# cd /opt
root@a1b2c3d4e5f6:/opt# echo "Sample application data" >> app.log
root@a1b2c3d4e5f6:/opt# ls -la app.log
-rw-r--r--. 1 root root 23 Mar 15 10:26 app.log
root@a1b2c3d4e5f6:/opt# cat app.log
Sample application data
root@a1b2c3d4e5f6:/opt# exit
[root@CentOS7 ~]# ls -la /opt/app.log
-rw-r--r--. 1 root root 23 Mar 15 10:26 /opt/app.log
[root@CentOS7 ~]# cat /opt/app.log
Sample application data
数据卷容器
数据卷容器是一种专门用于提供数据卷的容器类型,适用于需要在多个容器之间共享数据的场景。其工作原理是创建一个包含数据卷的基础容器,其他容器通过挂载该容器的数据卷来实现数据共享。
创建数据卷容器
[root@CentOS7 ~]# docker run -d --name dbstore -v /database docker.io/ubuntu
b2c3d4e5f6a7890123456789abcdef0123456789abcdef01234567890abc
[root@CentOS7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2c3d4e5f6a7 docker.io/ubuntu "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago dbstore
[root@CentOS7 ~]# docker inspect dbstore
[
{
"Id": "b2c3d4e5f6a7890123456789abcdef0123456789abcdef01234567890abc",
"Created": "2024-03-15T11:40:22.567890123Z",
"Path": "/bin/bash",
"Mounts": [
{
"Name": "abc123def45678901234567890abcdef0123456789abcdef01234567890abcd",
"Source": "/var/lib/docker/volumes/abc123def45678901234567890abcdef0123456789abcdef01234567890abcd/_data",
"Destination": "/database",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
}
]
挂载数据卷容器的数据卷
使用--volumes-from参数可以从指定容器挂载所有数据卷。此参数支持同时从多个容器挂载不同数据卷,也支持多级级联挂载。
[root@CentOS7 ~]# docker run -itd --volumes-from dbstore --name service-1 docker.io/ubuntu /bin/bash
c3d4e5f6a7b890123456789abcdef0123456789abcdef01234567890abcd
[root@CentOS7 ~]# docker run -itd --volumes-from dbstore --name service-2 docker.io/ubuntu /bin/bash
d4e5f6a7b8c90123456789abcdef0123456789abcdef01234567890abcde
[root@CentOS7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4e5f6a7b8c9 docker.io/ubuntu "/bin/bash" 15 seconds ago Up 13 seconds service-2
c3d4e5f6a7b8 docker.io/ubuntu "/bin/bash" About a minute ago Up About a minute service-1
b2c3d4e5f6a7 docker.io/ubuntu "/bin/bash" 18 minutes ago Exited (0) 18 minutes ago dbstore
验证容器间数据共享
在service-1容器中创建文件后,service-2容器立即可以访问相同的数据,证明了数据卷容器机制实现了容器间的实时数据共享。
[root@CentOS7 ~]# docker attach service-1
root@c3d4e5f6a7b8:/# cd /database/
root@c3d4e5f6a7b8:/database# echo "Shared persistent data" >> records.log
root@c3d4e5f6a7b8:/database# ls -la records.log
-rw-r--r--. 1 root root 24 Mar 15 11:45 records.log
root@c3d4e5f6a7b8:/database# cat records.log
Shared persistent data
root@c3d4e5f6a7b8:/database# md5sum records.log
abc123def45678901234567890abcdef0 records.log
[root@CentOS7 ~]# docker attach service-2
root@d4e5f6a7b8c9:/# cd /database/
root@d4e5f6a7b8c9:/database# ls -la records.log
-rw-r--r--. 1 root root 24 Mar 15 11:45 records.log
root@d4e5f6a7b8c9:/database# cat records.log
Shared persistent data
root@d4e5f6a7b8c9:/database# md5sum records.log
abc123def45678901234567890abcdef0 records.log
总结
数据卷适合单一容器或需要直接访问主机文件的场景,而数据卷容器更适合多容器间的数据共享需求。在实际应用中,应根据具体场景选择合适的数据管理方式。
