栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

docker 容器数据卷

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

docker 容器数据卷

目录

1.1什么是docker容器数据卷

1.2 容器数据卷能做什么

2.1卷的简单使用

3.数据卷的常用命令

4.MYSQL容器建立数据卷同步数据

5 具名挂载和匿名挂载

        5.1 匿名挂载

 5.2 具名挂载

6.Dockerfile中设置数据卷

7. 容器数据卷


1.1什么是docker容器数据卷

docker将应用与其运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 卷的目的是为了保存docker容器内的数据。

卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性。

1.2 容器数据卷能做什么

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

数据卷的特点:

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

2.1卷的简单使用

运行容器,指定挂载数据卷命令:

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

将主机目录/home/mysqltest和容器/home建立数据卷,首先在容器目录下创建1.txt和2.txt文件,再去主机目录下查看是否有该文件。

在容器内删除1.tx他,主机目录下的1.txt同样被删除。

但是在主机目录下不能删除2.txt和新建3.txt文件。原因:使用docker启动的容器默认是用的root权限,但是docker中的root只是相当于普通用户,所以需要给挂载的目录或者文件开启权限

#开启目录权限
chmod a+rwx “需要挂载的目录”

#开启docker挂载权限
chmod a+rw “需要挂载的文件”

即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失 

    查看容器对应元数据docker inspect 容器id,可以在Mounts节点查看建立的数据卷信息。 

3.数据卷的常用命令
docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

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

4.MYSQL容器建立数据卷同步数据

        在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失,下面建立数据卷保存MySQL的数据和文件。

docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

 

         如果使用配置的密码连接mysql服务失败,原因很大可能是本机挂载的配置文件中已有文件,将容器中的配置给覆盖了,我们将相应的本机文件中的文件配置删除即可。 

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

5 具名挂载和匿名挂载

        5.1 匿名挂载

        匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。

        如下运行并匿名挂载Nginx容器:

docker run -d -P --name nginx01 -v /etc/nginx nginx

        查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。

 5.2 具名挂载

        具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls命令可以查看当前数据卷的目录情况。

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

 查看指定的数据卷信息的命令:

docker volume inspect数据卷名称
docker volume inspect juming-nginx

 可以看到主机数据卷挂载在/var/lib/docker/volumes/juming-nginx/_data上

Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下。

匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 #匿名挂载

-v 卷名:容器内路径 #具名挂载

-v /宿主机路径:容器内路径 #指定路径挂载

指定数据卷映射的相关参数:

ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。

rw ----- readwrite 可读可写。

docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

6.Dockerfile中设置数据卷

我们可以在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。

下面使用Dockerfile构建一个新的镜像,Dockerfile文件的内容,匿名挂载了volume01和volume02两个目录:

FROM ubuntu

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

执行构建镜像

docker build -f /home/cita/test/Dockfile -t diyubuntu:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu
 ---> 825d55fb6340
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 87937768a81c
Removing intermediate container 87937768a81c
 ---> ed7c1d2b650a
Step 3/4 : CMD echo "----end----"
 ---> Running in 3f7c3638db02
Removing intermediate container 3f7c3638db02
 ---> 6aca3f5ab70e
Step 4/4 : CMD /bin/bash
 ---> Running in a8d6677d83f4
Removing intermediate container a8d6677d83f4
 ---> 0d662cd5e623
Successfully built 0d662cd5e623
Successfully tagged diyubuntu:1.0

 完成镜像的生成后,启动自己生成的容器

 可以看到自动挂载的数据卷目录。下面查看对应宿主机的数据卷目录:

docker ps -a
CONTAINER ID  IMAGE           COMMAND         CREATED              STATUS                                                              
9f20ff9eae68  diyubuntu:1.0   "/bin/bash"     About a minute ago   Up About a minute                                                          

docker inspect 9f20ff9eae68
"Mounts": [
            {
                "Type": "volume",
                "Name": "747a277c42e064835ac34660a6edb1cf29873a04954d7e2a952184c45ad39215",
                "Source": "/var/lib/docker/volumes/747a277c42e064835ac34660a6edb1cf29873a04954d7e2a952184c45ad39215/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "fd5fc4e0cecef09848b61cd37dca3799c24fcc0937469d31eb2e98f4ddb690f8",
                "Source": "/var/lib/docker/volumes/fd5fc4e0cecef09848b61cd37dca3799c24fcc0937469d31eb2e98f4ddb690f8/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

        可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。

7. 容器数据卷

        容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。 

首先启动容器1,volume01、volume02为挂载目录。

docker run -it --name ubuntu01 diyubuntu:1.0

然后启动容器2,通过参数--volumes-from,设置容器2和容器1建立数据卷挂载关系。

docker run -it --name ubuntu02 --volumes-from diyubuntu01 ubuntu:1.0

 首先在容器2中的volume01中添加文件

cd volume01
touch 1.py && ls
1.py

然后就可以看到容器1的文件也会添加上了。需要重启容器1才能更新数据。

        下面同步两个MySQL的数据库和配置文件,与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载,示例: 

 docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
 docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/825829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号