【Docker】Docker 容器数据卷 (五)

摘要:在前面学习Docker的过程中,你已经会使用Dockerfile定制镜像文件,但是如何实现宿主机与容器之间数据的共享和同步,容器与容器之间又如何进行数据的共享?为了解决这个问题,Docker官方提出了数据卷这个概念。本篇文章主要介绍了数据卷的定义、特点和作用,并介绍如何挂载数据卷到容器、挂载宿主目录到容器以及容器间如何传递共享数据。

数据卷的定义

先来看看Docker的理念:

  • 将应用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据也就消失了。

如何保存Docker容器中的数据呢?

为了保存Docker容器中的数据,这里需要引入卷这个概念。

卷通俗来讲,就是我们所谓的目录或文件。卷存在于一个或多个容器中,由Docker挂载到容器,但不属于联合文件系统,因此能绕过Union File System提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据持久化,完全独立于容器的生存周期,因此Docker不会在容器删除其挂载的数据卷。

数据卷的特点

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据券的生命周期一直持续到没有容器使用它为止

数据卷的作用

主要解决的问题:
* 容器的持久化
* 容器间继承+共享数据

数据管理

容器和宿主之间不仅实现数据共享,当容器停止退出后,宿主机修改数据后依然可以实现数据同步。

挂载数据卷到容器

创建并查看第一个数据卷:

[root@wx website]# docker volume create wangxiong-vol
wangxiong-vol
[root@wx website]# docker volume ls
DRIVER VOLUME NAME
local wangxiong-vol

在宿主机里使用以下命令可以查看指定数据卷的信息:

[root@wx website]# docker volume inspect wangxiong-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/wangxiong-vol/_data",
        "Name": "wangxiong-vol",
        "Options": {},
        "Scope": "local"
    }
]

启动一个新的容器lnmp,并挂载刚才创建的数据卷:

docker run -d -it -P \
--name lnmp \
--mount source=wangxiong-vol,target=/usr/local/nginx/html \
wangxiong/centos7-lnmp-laravel5.5:v1.0 \
bash

查看此时lnmp容器的数据卷信息:

[root@wx website]# docker inspect lnmp
"Mounts": [
            {
                "Type": "volume",
                "Name": "wangxiong-vol",
                "Source": "/var/lib/docker/volumes/wangxiong-vol/_data",
                "Destination": "/usr/local/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。

如果需要在删除容器的同时移除数据卷,可以在删除容器的时候使用 docker rm -v这个命令。

[root@wx website]# docker volume rm wangxiong-vol
wangxiong-vol

使用以下命令清理无主的容器卷:

[root@wx website]# docker volume prune

挂载宿主目录到容器

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

拉取镜像:

[root@wx ~]# docker pull wangxiong/centos7-lnmp-laravel5.5:v1.0

查看镜像名称:

[root@wx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wangxiong/centos7-lnmp-laravel5.5 v1.0 c6b04a388927 About an hour ago 899MB

使用命令运行容器并添加容器卷:

docker run -d -it -P \
 --name lnmp \
 --mount type=bind,source=/wdata/www/website,target=/usr/local/nginx/html,readonly \
 wangxiong/centos7-lnmp-laravel5.5:v1.0 \
 bash
参数 说明
docker run 运行容器的命令
-d(daemonized) 守护态运行,在后台运行
-i (interactive) 交互式操作
-t (terminal) 终端
-p 指定端口映射
-P 随机映射一个 49000~49900 的端口
--name 容器名称
--mount 挂载
type 类型
source 宿主机目录
target 目标目录,容器中目录
readonly 只读权限
wangxiong/centos7-lnmp-laravel5.5:v1.0 镜像名:标签

查看数据卷是否挂载成功:

[root@wx ~]# docker inspect lnmp
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/wdata/www/website",
                "Destination": "/usr/local/nginx/html",
                "Mode": "",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],

带权限设置数据卷,宿主机单线读写权限,容器中只可读权限,以下为使用命令挂载的两种写法:

--mount type=bind,source=/wdata/www/website,target=/usr/local/nginx/html,readonly
-v /wdata/www/website:/usr/local/nginx/html:ro

注:--mount也可以换成-v,区别在于使用-v 参数时,如果本地目录不存在Docker 会自动为你创建一个文件夹,现在使用 --mount参数时如果本地目录不存在,Docker 会报错。

容器间传递共享

使用--volumes-from参数,重新运行一个新的容器lnmp02,将之前的容器lnmp的数据同步共享过来:

docker run -d -it -P \
--name lnmp02 \
--volumes-from lnmp \
wangxiong/centos7-lnmp-laravel5.5:v1.0 \
bash

查看数据卷是否挂载成功:

[root@wx ~]# docker inspect lnmp02
 "Mounts": [
            {
                "Type": "volume",
                "Name": "wangxiong-vol",
                "Source": "/var/lib/docker/volumes/wangxiong-vol/_data",
                "Destination": "/usr/local/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

即使删除容器lnmp,容器lnmp02也不会影响其正常使用。

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

相关推荐

微信扫一扫,分享到朋友圈

【Docker】Docker 容器数据卷 (五)
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close