Docker 容器数据卷

什么是容器数据卷

docker的理念回顾:

将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!

就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这也太扯了吧!

所以我们希望容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!

为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

作用:

卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此 能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性: 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
  5. 总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!

使用数据卷

方式一:容器中直接使用命令来添加

测试使用挂载命令

挂载命令:

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

测试:

[root@xiaoyequ ~]# cd /home
[root@xiaoyequ home]# ll                                                        # 原来没有  test 目录
total 0
-rw-r--r-- 1 root root 0 Jun  6 22:20 xiaoyequ.java
[root@xiaoyequ home]# docker run -it -v /home/test:/home centos /bin/bash       # 测试挂载命令
[root@d8b60d9d5904 /]# 


[root@xiaoyequ ~]# cd /home
[root@xiaoyequ home]# ls                                                        # 发现有了 test 目录
test  xiaoyequ.java

查看数据卷是否挂载成功 docker inspect 容器id

  • Source:主机内的地址
  • Desrination:docker 容器的地址

Docker 容器数据卷_第1张图片

测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

Docker 容器数据卷_第2张图片

思考?测试容器停止退出后,主机修改数据是否会同步!

  1. 停止容器
  2. 在宿主机上修改文件,增加些内容
  3. 启动刚才停止的容器
  4. 然后查看对应的文件,发现数据依旧同步!ok

Docker 容器数据卷_第3张图片

删除一个数据卷
docker volume rm

使用 docker 安装 mysql

思考:mysql 数据持久化的问题!

搜索镜像:

docker search mysql

拉取镜像:

docker pull mysql:5.7

启动容器:

-e 环境变量

注意: mysql的数据应该不丢失!先体验下 -v 挂载卷! 参考官方文档

docker run -d -p 3344: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

使用本地的 Navicat 连接测试一下 3344

Docker 容器数据卷_第4张图片

查看本地的 /home/mysql 目录:

删除mysql容器:

docker rm -f mysql01

删除容器,然后发现远程连接失败 

Docker 容器数据卷_第5张图片

Docker 容器数据卷_第6张图片

发现:我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能

方式二:通过Docker File 来添加(了解)

DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。 我们在这里先体验下,后面会详细讲解 DockerFile

测试:

我们在宿主机 /home 目录下新建一个 docker-test-volume文件夹

[root@xiaoyequ home]# mkdir docker-test-volume

# 说明:在编写DockerFile文件中使用 VOLUME 指令来给镜像添加一个或多个数据卷 VOLUME["/dataVolumeContainer1","/dataVolumeContainer2","/dataVolumeContainer 3"]

# 出于可移植和分享的考虑,我们之前使用的 -v 主机目录:容器目录 这种方式不能够直接在 DockerFile中实现。

# 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有宿主机上都存在这样的特定目录.

编写DockerFile文件

[root@xiaoyequ docker-test-volume]# pwd
/home/docker-test-volume
[root@xiaoyequ docker-test-volume]# vim dockerfile1
[root@xiaoyequ docker-test-volume]# cat dockerfile1
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "-------end------"
CMD /bin/bash

 build 后生成镜像,获得一个新镜像 xiaoyequ/centos

docker build -f /home/docker-test-volume/dockerfile1 -t xiaoyequ/centos . # 注意最后有个.

Docker 容器数据卷_第7张图片

启动容器

docker run -it 905fe8ff663c /bin/bash

Docker 容器数据卷_第8张图片

问题:通过上述步骤,容器内的卷目录地址就已经知道了,但是对应的主机目录地址在哪里呢?

我们在数据卷 dataVolumeContainer1 中新建一个文件

[root@978d5d3483eb dataVolumeContainer1]# pwd
/dataVolumeContainer1
[root@978d5d3483eb dataVolumeContainer1]# touch container.txt 
[root@978d5d3483eb dataVolumeContainer1]# ls -l
total 0
-rw-r--r-- 1 root root 0 Jun 14 13:08 container.txt

查看下这个容器的信息

docker inspect 978d5d3483eb

Docker 容器数据卷_第9张图片

这个卷在主机对应的默认位置

注意:如果访问出现了 cannot open directory: Permission denied

解决办法:在挂载目录后多加一个 --privileged=true参数即可

你可能感兴趣的:(Docker,linux,docker,运维,服务器,centos)