欢迎您, 来到 宁时修博客.^_^

Docker系列8--数据管理

2018/11/18 林木立 Docker 717
Docker容器技术

一、Docker数据管理

    如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:

        数据卷(Volumes)

        挂载主机目录 (Bind mounts)



二、数据卷

    数据卷  是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

        数据卷  可以在容器之间共享和重用

        对  数据卷  的修改会立马生效

        对  数据卷  的更新,不会影响镜像

        数据卷  默认会一直存在,即使容器被删除

    数据卷  的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的  数据卷  。


    创建一个数据卷

$ docker volume create vol-data
vol-data

    查看所有数据卷

$ docker volume ls
DRIVER              VOLUME NAME
local               5d69ce2780c28376623b751ea831a3b445e8c06194095574684dc4596d17c0ab
local               e8f239f6a013c1125378806fd30bce6720f9e104bdafd74ab9ad10ede9571bc7
local               vol-data

    查看指定  数据卷  的信息

$ docker volume inspect vol-data
[
    {
        "CreatedAt": "2018-11-18T23:20:07+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/vol-data/_data",
        "Name": "vol-data",
        "Options": {},
        "Scope": "local"
    }
]


    启动一个挂载数据卷的容器

    在用  docker run  命令的时候,使用  --mount  标记来将  数据卷  挂载到容器里。在一次  docker run  中可以挂载多个  数据卷  。

    创建一个名为  web  的容器,并加载一个  数据卷  到容器的  /webapp  目录。

$ docker run -d -P --name web --mount source=vol-data,target=/webapp training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
10bbbc0fc0ff: Pull complete 
fca59b508e9f: Pull complete 
e7ae2541b15b: Pull complete 
9dd97ef58ce9: Pull complete 
a4c1b0cb7af7: Pull complete 
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
6eff4a8dd4b44a2a812d840fb1d236216b6dbb13d6e84524760e959df599f473


    查看数据卷信息

$ docker inspect web

    数据卷  信息在 "Mounts" Key 下面

        "Mounts": [
            {
                "Type": "volume",
                "Name": "vol-data",
                "Source": "/var/lib/docker/volumes/vol-data/_data",
                "Destination": "/webapp",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],


    删除数据卷

docker volume rm vol-data

    如果有正在运行的容器在使用该数据卷,这样是删不了的,必须终止容器,然后删除容器,最后才能删除数据卷。


    数据卷  是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除  数据卷  ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的  数据卷  。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用  docker rm -v  这个命令。

    

    无主的数据卷可能会占据很多空间,要清理请使用以下命令:

docker volume prune




三、挂载主机目录

    挂载一个主机目录作为数据卷

    使用  --mount  标记可以指定挂载一个本地主机的目录到容器中去。

$ docker run -d -P --name web --mount type=bind,source=/data/webdata,target=/webapp training/webapp python app.py
0db98594c492a2c9b69cc842c15e3018c0bbde8ffbb18d7b29e42fbad6f024b4

    上面的命令加载主机的  /data/webdata  目录到容器的  /webapp  目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用  -v  参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用  --mount  参数时如果本地目录不存在,Docker 会报错。


    Docker 挂载主机目录的默认权限是  读写  ,用户也可以通过增加  readonly  指定为  只读  。

docker run -d -P --name web --mount type=bind,source=/data/webdata,target=/webapp,readonly training/webapp python app.py


    加了  readonly  之后,就挂载为  只读  了。如果你在容器内  /webapp  目录新建文件,会报“xxxx: Read-only file system”错误。


    查看挂载具体信息

$ docker inspect web
...................
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/data/webdata",
                "Destination": "/webapp",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
....................


    

    挂载一个本地主机文件作为数据卷

    --mount  标记也可以从主机挂载单个文件到容器中。

$ docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:17.10 bash

root@41eefd6dfe7a:/# history 
    1  yum install wget lrzsz vim -y
    2  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    这样就记录容器输入过的命令了。



四、附录 --mount

--mount=[[type=TYPE[,TYPE-SPECIFIC-OPTIONS]]]
   Attach a filesystem mount to the container

   Current supported mount TYPES are bind, volume, and tmpfs.

   e.g.

   type=bind,source=/path/on/host,destination=/path/in/container

   type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round"

   type=tmpfs,tmpfs-size=512M,destination=/path/in/container
   
   Common Options:
    · src, source: mount source spec for bind and volume. Mandatory for bind.
    · dst, destination, target: mount destination spec.
    · ro, read-only: true or false (default).

   Options specific to bind:
    · bind-propagation: shared, slave, private, rshared, rslave, or rprivate(default). See also mount(2).
    · consistency: consistent(default), cached, or delegated. Currently, only effective for Docker for Mac.

   Options specific to volume:
    · volume-driver: Name of the volume-driver plugin.
    · volume-label: Custom metadata.
    · volume-nocopy: true(default) or false. If set to false, the Engine copies existing files and directories under the mount-path into the volume, allowing the host to access them.
    · volume-opt: specific to a given volume driver.

   Options specific to tmpfs:
    · tmpfs-size: Size of the tmpfs mount in bytes. Unlimited by default in Linux.
    · tmpfs-mode: File mode of the tmpfs in octal. (e.g. 700 or 0700.) Defaults to 1777 in Linux.


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群