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 ~]# 
posted @ 2017-04-29 00:25  Anliven  阅读(330)  评论(0编辑  收藏  举报