Docker - 数据管理
在容器中管理数据主要有两种方式:数据卷( Data volumes)和数据卷容器( Data volume containers)。
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录。数据卷的使用,类似于 Linux 下对目录或文件进行 mount。
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
数据卷用于持久化数据,生命周期独立于容器,在容器被删除后,数据卷不会被自动删除。
但可以在删除最后一个挂载它的容器时,使用docker rm -v
命令在删除容器的同时移除数据卷。
创建数据卷到容器
使用docker run
命令的-v参数可以创建数据卷(挂载本地主机的目录或文件)到容器。多次使用-v参数可以挂载多个数据卷。
本地目录和文件的路径必须是绝对路径,如果路径不存在 Docker将自动创建。
挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。
特别注意:虽然可以挂载主机文件到容器,但建议直接挂载主机文件的父目录到容器,防止容器内的编辑造成主机文件inode的改变。
删除数据卷
数据卷用于持久化数据,生命周期独立于容器,在容器被删除后,数据卷不会被自动删除。
但可以在删除最后一个挂载它的容器时,使用docker rm -v
命令在删除容器的同时移除数据卷。
示例
[root@CentOS7 ~]# docker run -itd --name test-data-volume -v /home:/home docker.io/ubuntu /bin/bash
715cdbfe8b905a28301532cfbe91df39e28f7c1fa76575422618cfb39d6a3e46
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
715cdbfe8b90 docker.io/ubuntu "/bin/bash" 13 seconds ago Up 11 seconds test-data-volume
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker inspect test-data-volume
[
{
"Id": "715cdbfe8b905a28301532cfbe91df39e28f7c1fa76575422618cfb39d6a3e46",
"Created": "2017-04-28T15:37:33.785636016Z",
"Path": "/bin/bash",
......
......
......
"Mounts": [
{
"Source": "/home",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
......
......
......
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker inspect --format "{{ .HostConfig.Binds }}" test-data-volume
[/home:/home]
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker attach test-data-volume
root@715cdbfe8b90:/#
root@715cdbfe8b90:/# cd /home
root@715cdbfe8b90:/home# echo "This is a test!" >> test.log
root@715cdbfe8b90:/home# ls -l test.log
-rw-r--r--. 1 root root 16 Apr 28 15:39 test.log
root@715cdbfe8b90:/home# cat test.log
This is a test!
root@715cdbfe8b90:/home#
[root@CentOS7 ~]#
[root@CentOS7 ~]# ls -l /home/test.log
-rw-r--r--. 1 root root 16 4月 28 23:39 /home/test.log
[root@CentOS7 ~]#
[root@CentOS7 ~]# cat /home/test.log
This is a test!
[root@CentOS7 ~]#
数据卷容器
数据卷容器适合容器之间持续更新的数据共享。
数据卷容器,实际上就是一个正常的容器,专门用来提供数据卷供其它容器挂载。
使用方法比较直观,首先创建一个数据卷容器,然后在创建其他容器时,利用docker run
命令的--volumes-from
参数挂载数据卷容器的数据卷。
--volumes-from
参数支持从多个容器挂载不同的数据卷,也可以多级串联挂载包含数据卷的容器。
示例:创建数据卷容器
[root@CentOS7 ~]# docker run -d --name dbdata -v /dbdata docker.io/ubuntu
8fe93640074a296f8185cc14a891ce35b59234168e151737e52ebfd505cf1413
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8fe93640074a docker.io/ubuntu "/bin/bash" 4 seconds ago Exited (0) 3 seconds ago dbdata
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker inspect dbdata
[
{
"Id": "8fe93640074a296f8185cc14a891ce35b59234168e151737e52ebfd505cf1413",
"Created": "2017-04-28T15:56:44.569538208Z",
"Path": "/bin/bash",
......
......
......
"Mounts": [
{
"Name": "1ae23fd89dc88674d1a9574703ebbd021fcd2e8bc354205127f23ca45ac18b04",
"Source": "/var/lib/docker/volumes/1ae23fd89dc88674d1a9574703ebbd021fcd2e8bc354205127f23ca45ac18b04/_data",
"Destination": "/dbdata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
......
......
[root@CentOS-7 ~]#
示例:挂载数据卷容器的数据卷
[root@CentOS7 ~]# docker run -itd --volumes-from dbdata --name test-data-container-1 docker.io/ubuntu /bin/bash
d2f50439edfd80424ac7a26b0d2bd9628877078f80d7d65f910c4c54172d881c
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker run -itd --volumes-from dbdata --name test-data-container-2 docker.io/ubuntu /bin/bash
7a6ff0476aa2cb3ddc523290994e764648beb448bea8f7687c9d4db641d0a571
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a6ff0476aa2 docker.io/ubuntu "/bin/bash" 17 seconds ago Up 16 seconds test-data-container-2
d2f50439edfd docker.io/ubuntu "/bin/bash" About a minute ago Up About a minute test-data-container-1
8fe93640074a docker.io/ubuntu "/bin/bash" 17 minutes ago Exited (0) 17 minutes ago dbdata
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker inspect test-data-container-1
[
{
"Id": "d2f50439edfd80424ac7a26b0d2bd9628877078f80d7d65f910c4c54172d881c",
"Created": "2017-04-28T16:12:35.871642587Z",
"Path": "/bin/bash",
......
......
"Mounts": [
{
"Name": "1ae23fd89dc88674d1a9574703ebbd021fcd2e8bc354205127f23ca45ac18b04",
"Source": "/var/lib/docker/volumes/1ae23fd89dc88674d1a9574703ebbd021fcd2e8bc354205127f23ca45ac18b04/_data",
"Destination": "/dbdata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
......
[root@CentOS-7 ~]#
[root@CentOS7 ~]# docker inspect test-data-container-2
[
{
"Id": "7a6ff0476aa2cb3ddc523290994e764648beb448bea8f7687c9d4db641d0a571",
"Created": "2017-04-28T16:13:48.489300382Z",
"Path": "/bin/bash",
......
......
"Mounts": [
{
"Name": "1ae23fd89dc88674d1a9574703ebbd021fcd2e8bc354205127f23ca45ac18b04",
"Source": "/var/lib/docker/volumes/1ae23fd89dc88674d1a9574703ebbd021fcd2e8bc354205127f23ca45ac18b04/_data",
"Destination": "/dbdata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
......
[root@CentOS-7 ~]#
示例:数据共享
[root@CentOS7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a6ff0476aa2 docker.io/ubuntu "/bin/bash" 3 minutes ago Up 3 minutes test-data-container-2
d2f50439edfd docker.io/ubuntu "/bin/bash" 4 minutes ago Up 4 minutes test-data-container-1
8fe93640074a docker.io/ubuntu "/bin/bash" 20 minutes ago Exited (0) 20 minutes ago dbdata
[root@CentOS7 ~]#
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker attach test-data-container-1
root@d2f50439edfd:/#
root@d2f50439edfd:/# cd /dbdata/
root@d2f50439edfd:/dbdata# echo "test data container" > sample.log
root@d2f50439edfd:/dbdata# ls -l sample.log
-rw-r--r--. 1 root root 20 Apr 28 16:18 sample.log
root@d2f50439edfd:/dbdata# cat sample.log
test data container
root@d2f50439edfd:/dbdata# md5sum sample.log
36e654d6c7720c5d99e5ee3792174c8c sample.log
root@d2f50439edfd:/dbdata# [root@CentOS7 ~]#
[root@CentOS7 ~]#
[root@CentOS7 ~]#
[root@CentOS7 ~]# docker attach test-data-container-2
root@7a6ff0476aa2:/#
root@7a6ff0476aa2:/# cd /dbdata/
root@7a6ff0476aa2:/dbdata#
root@7a6ff0476aa2:/dbdata# ls -l sample.log
-rw-r--r--. 1 root root 20 Apr 28 16:18 sample.log
root@7a6ff0476aa2:/dbdata# cat sample.log
test data container
root@7a6ff0476aa2:/dbdata# md5sum sample.log
36e654d6c7720c5d99e5ee3792174c8c sample.log
root@7a6ff0476aa2:/dbdata# [root@CentOS7 ~]#
[root@CentOS7 ~]#
行动是绝望的解药!
欢迎转载和引用,但请在明显处保留原文链接和原作者信息!
本博客内容多为个人工作与学习的记录,少数内容来自于网络并略有修改,已尽力标明原文链接和转载说明。如有冒犯,即刻删除!
以所舍,求所得,有所获,方所成。