Docker基础
Docker容器数据卷
Why?
Docker的理念:
- 将应用与运行环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望共享数据
Docker容器产生的数据如果不通过docker commit 生成新的镜像,是的数据作为镜像的一部分存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据,在docker中使用卷。
What?
卷就是目录或文件存在于一个或多个容器中,有docker挂载到容器,但不属于UnionF,因此能够绕过UnionFS提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此DOcker不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷的添加
直接使用命令添加数据卷(-v)
docker run -it -v /宿主机目录绝对路径[:ro/rw]:/容器内目录[:ro/rw] ContainerID
通过此条命令,会分别在宿主机和容器内建立目录,这就称为数据卷挂在成功。之后这两个目录的数据就可以达到共享的目的。即两个文件夹其中一处的改动、更新,在另一处都会同步。
根据ro/rw的不同,可以达到不同的共享级别。
eg:docker run -it -v /宿主机目录绝对路径:/容器内目录:ro ContainerID
运行上述命令,则可以在宿主机对目录内进行文件的新增、查看、修改,而容器内则只能查看。
使用DockerFile添加数据卷
DockerFile是一种描述镜像的文件,可以根据DockerFile文件来创建(build)自己的镜像。dockerfile类似于linux中的shell文件。
例子:
- 编写DockerFile文件
cd ~
mkdir mydocker
cd mydocker
vim Dockerfile
#将下面代码粘贴进刚刚打开的Dockerfile
#volume test
FROM myubuntu:1.0 #导入基础镜像
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] #创建数据卷
CMD echo "finished,-------success!"
CMD /bin/bash
#保存退出vim。
- Build镜像
使用如下命令
//docker build -f Dockerfile文件目录 -t 自定义镜像名 .
docker build -f ~/mydocker/Dockerfile -t yao/ubuntu .
这样就自定义新建了一个镜像。通过这个镜像创建的容器示例,都会有两个数据卷。
这两个数据卷对应的宿主机的位置在哪?——有个默认位置,可以通过docker inspect containerID来查看,一般在/var/lib/docker/volumes/…/_data/下面
数据卷容器
命名的容器挂在数据卷,其他容器通过挂在这个(父容器)实现数据共享,挂在数据卷的容器,称之为数据卷容器。
例如:
- 我们上一步使用build命令创建了一个自定义的ubuntu镜像(yao/ubuntu),这个镜像自带两个数据卷。
- 使用镜像yao/ubuntu创建一个容器(dc01)
#下面的”--“ 不是注释的意思
docekr run -it --name dc01 yao/ubuntu
可以把dc01作为一个父容器。dc01容器自带两个数据卷,对应宿主机上默认目录下随机生成的文件夹。
3. 创建一个容器继承自dc01容器
docker run -it --name dc02 --volume-from dc01 yao/ubuntu
通过–volume-from 命令创建的dc02容器,他继承自dc01,他和dc01共享数据卷,具体地说就是,在dc01和dc02中进行文件的更改都会在彼此互相同步。
上述dc02容器其实也是由yao/ubuntu这个镜像创建的,只不过是加了一个–volume-from,那他和不加–volume-from dc01有什么区别呢?比如通过如下命令创建了dc03容器:
docker run -it --name dc03 yao/ubuntu。dc03和dc02有什么区别?为什么它们都是由同一个带数据卷的镜像创建的,但dc02和dc01可以共享数据,而dc03却不可以和dc01共享?
dc01容器被创建出来,其数据卷的映射是如下:
dc01 | host |
/dataVolume1 | /var/lib/docker/volumes/random1/_data/ |
/dataVolume2 | /var/lib/docker/volumes/random2/_data/ |
dc02创建时使用了–volume-from dc01,他的映射和dc01是一样的。亦即这两个容器的持久化的地方在宿主机的相同的地方,所以他们可以共享数据。
而dc03是普通创建的,起在宿主机的映射目录和dc01并不一样,所以并不会共享。
dc03 | host |
/dataVolume1 | /var/lib/docker/volumes/random3/_data/ |
/dataVolume2 | /var/lib/docker/volumes/random4/_data/ |
此外:
- 集成还可以是链式集成,即dc02继承自dc01,dc03继承自dc02…这样就做到了容器之间的数据共享
- 容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止