【Docker】Docker容器数据卷(Data Volume)
docker容器数据卷简介
docker在运行的时候我们可能会修改一些数据,比如在docker某个容器里修改了文件信息,或者新增了一些文件,如果不去docker commit去生成一个新的镜像,随着容器的关闭这些文件及修改的信息会消失。所以当我们希望在关闭容器的时候可以保留这些信息,以及容器之间可以共享数据 。为了数据能够保存,我们使用容器数据卷。
数据卷特点
1.数据卷持久化数据,数据卷可以在容器之间共享或者重用数据,容器和宿主机之间可以互相拷贝数据。
2.数据卷中的内容更改后直接生效。宿主机和容器内数据修改依然会同步。
3.数据卷中的更改不会包含在镜像的更新中,也就是不回影响镜像的本身。
4.数据卷的生命周期一直会持续到没有容器使用它为止。
数据卷的操作
一.添加数据卷
1.直接命令添加方式
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
执行下面命令
docker run -it -v /myDataVolume:/dockerDataVolume centos
如果发现有下面错误,是因为mac系统内所指定的路径不对。
根据docker官网提示,https://docs.docker.com/docker-for-mac/osxfs/#namespaces
修改路径后,执行成功,新生成的docker容器中多了一个dockerDataVolume目录,而我mac系统桌面上也多了一个myDataVolume目录,因为我讲路径映射到mac桌面上。
通过命令验证
docker inspect 19bc98eca20d <--这个是刚刚生成容器的ID
根据返回的json数据中看到上面信息,说明已经关联成功。
上个命令后面添加ro参数表示是添加只读目录,只能同步,不能编辑,就是只允许主机单向传递数据,但是容器只能查看。
docker run -it -v ~/Desktop/myDataVolume:/opt/dockerDataVolume:ro centos
2.通过Dockerfile添加
通过Dockerfile创建的带有volumes的镜像创建的容器会自动将volumes的目录挂载到宿主机的指定目录,可通过docker inspect查看volumes属性查看。
在Dockerfile文件中使用VOLUME命令可以给镜像添加一个或者多个数据卷。
命令:
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用 -v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现,是因为由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
songguojundeMBP:Desktop songguojun$ mkdir mydocker songguojundeMBP:Desktop songguojun$ cd my myDataVolume/ mydocker/ songguojundeMBP:Desktop songguojun$ cd mydocker/ songguojundeMBP:mydocker songguojun$ pwd /Users/songguojun/Desktop/mydocker songguojundeMBP:mydocker songguojun$ vi Dockerfile songguojundeMBP:mydocker songguojun$ docker build -f /Users/songguojun/Desktop/mydocker/Dockerfile -t song/centos . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 470671670cac Step 2/4 : VOLUME ["/opt/dataVolumeContainer1","/opt/dataVolumeContainer2"] ---> Running in 92429e5c0597 Removing intermediate container 92429e5c0597 ---> 8597e1c67270 Step 3/4 : CMD echo "finished,--------success1" ---> Running in 210cd21ebd1b Removing intermediate container 210cd21ebd1b ---> c4fbf443e419 Step 4/4 : CMD /bin/bash ---> Running in 1dc2c05e4437 Removing intermediate container 1dc2c05e4437 ---> 45bb13cd1ef1 Successfully built 45bb13cd1ef1 Successfully tagged song/centos:latest
songguojundeMBP:mydocker songguojun$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE song/centos latest 45bb13cd1ef1 About a minute ago 237MB centos latest 470671670cac 8 weeks ago 237MB
运行刚刚生成的新的容器
songguojundeMBP:mydocker songguojun$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE song/centos latest 45bb13cd1ef1 About a minute ago 237MB centos latest 470671670cac 8 weeks ago 237MB songguojundeMBP:mydocker songguojun$ docker run -it song/centos [root@6b38aa0e0b7e /]# ls /opt/ dataVolumeContainer1 dataVolumeContainer2
数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,用于容器之间数据的传递。挂载数据卷的容器,称之为数据卷容器。
下面一个案例
操作流程
1.先启动一个父容器dc1。