4、Docker容器数据卷
4.1 是什么
Docker
容器产生的数据,如果不通过docker commit
生成新的镜像,使得数据成为镜像的一部分保存下来,那么当容器删除之后,数据自然也就都没有了。
为了能够保存数据在 docker
中我们使用卷
。
4.2 能干什么
卷 就是目录或者文件,存在于一个或多个容器中,由 docker 挂在到容器,但不属于联合文件系统,因此能够绕过 Union File System
提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。
特点:
数据卷
可在容器之间共享或重用数据;卷
中的更改可直接生效;- 数据卷中的更改不会包含在镜像的更新中;
数据卷的生命周期
一直持续到没有容器使用它为止。
4.3 通过命令添加容器卷
命令:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
例如:docker run -it -v /root/dataVolume:/root/dataVolumeContainer centos
上面的例子中我们把宿主机root路径下的一个文件夹和容器中的一个文件夹捆绑在一起,在创建该镜像时就会在容器中创建对应的文件夹。如下图:
当然,我们也可以通过 docker inspect 容器ID
查看是否挂载成功。
容器和宿主机之间共享数据
我们先在 宿主机
中的 dataVolume
文件夹中创建 test.txt
,然后进入容器
并打开dataVolumeContainer
文件夹,则可以发现该文件夹中也存在着 test.txt
,这样就实现了共享数据。
我们还可以在容器中通过 vi test.txt
命令修改 test.txt
文件,同时在宿主机
中就可以看到更改后的test.txt
。如下图:
容器停止退出后,主机修改了文件内容,重新启动容器时,容器中的文件能否同步?
我们可以先停止该容器
,然后修改dataVolume
中的 test.txt
文件。再启动该centos容器
,并进入容器,可以发现dataVolumeContainer
中的内容也同步更改了。
命令(带只读权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
与普通的命令多了
:ro
——>read only
4.4 DockerFile 添加容器卷
-
根目录下新建
mydocker
文件夹并进入; -
可在
Dockerfile
中使用VOLUME
指令来给镜像添加一个或多个数据卷; -
File构建
#volume test FROM centos VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"] CMD echo "finished,--------------success1" CMD /bin/bash
-
build后生成镜像,生成一个新的镜像
yan/contos
;docker build -f /mydocker/Dockerfile -t yan/centos .
注意最后的那个点
-
run 创建容器,同时在容器中也可以找到卷目录。
docker run -it yan/centos
-
上面已经看到了创建的2个卷目录,那么对应的主机目录地址在哪里呢?
我们重新打开一个终端,使用命令
docker inspect 容器ID
,可以查看到:
验证:在容器的
dataVolumeContainer1
目录中创建test.txt
文件,然后打开对应的主机目录可以看到test.txt
文件。