赞
踩
docker的镜像是由多个只读的文件系统叠加在一起形成的。当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层。这时如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。该文件的只读版本还在,只是被上面读写层的该文件的副本隐藏。当删除docker,或者重新启动时,之前的更改将会消失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 数据卷默认会一直存在,即使容器被删除 Docker中提供了两种挂载方式,-v和-mount
Docker的镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。
- 容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便的对容器中的文件进行访问
- 多个容器之间的数据无法共享
- 当删除容器时,容器产生的数据将丢失
为了解决这些问题,Docker引入了数据卷(volume)机制。volume是存在一个或多个容器中的特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下便利。
- volume在容器创建时就初始化,在容器运行时就可以使用其中的文件
- volume能在不同的容器之间共享和重用
- 对volume中的数据的操作会马上生效
- 对volume中数据操作不会影响到镜像本身
- volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除
docker volume create mydata
docker volume ls
docker volume inspect mydata
MountPoint为数据在本机存放的位置
这里可以参考我的另一篇博客
Docker安装nginx并使用数据卷配置同步映射.
这里可以参考我的另一篇博客
Docker 安装MySQL并使用数据卷实现数据持久化.
-v 容器内路径
docker run -d -P --name nginx02 -v /ect/nginx nginx
这种就是匿名挂载,-v 只写了容器内的路径,没有写容器外的路径
通过 -v 卷名:容器内路径
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
所有的docker容器内的卷,没有指定目录的情况下 都在 /var/lib/docker/volumes/xxx/_data
通过具名挂载可以方便找到我们的一个卷,因此大多数情况下使用具名挂载
-v 容器内路径
-v 卷名:容器内路径
-v /宿主机路径:容器内路径
只读:ro readonly
可读可写 : rw readwite
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作!
输入 i 进入编辑模式
文件中的内容 指令(大写)
按Esc返回,输入 :wq 退出并保存
vim dockerfile1
文件中的每个命令,就是镜像的一层!
docker build -f dockerfile1 -t lyp/centos .
这个卷和外部一定有一个同步的目录
这种方式使用十分多,因为通常要自己构建镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
docker run -it --name docker01 [镜像ID]
docker run -it --name docker02 --volumes-from docker01 lyp/centos
显然这三个容器通过 --volume-from 实现了数据同步
exit
docker ps
docker ps -a
docker rm -f [容器ID]
测试依旧可以访问
结论:
- 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
- 如果持久化到了本地,这个时候,本地的数据是不会删除的!
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:8.0
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql02 --volumes-from mysql01 mysql:8.0
这个时候,可以实现两个MySQL容器数据同步!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。