场景一:现在用Docker创建了N个容器,但是这些容器之间需要数据共享,这个时候我们应该怎么办?[参考第四步]
场景二:docker创建了一个容器并进入容器,添加了一些定制功能,此时除了用docker commit去生成一个新的镜像,使数据作为镜像的一部分进行保存以外,我们还能通过什么方式去保持数据?[参考第三步]
一、数据卷
数据卷听起来很陌生,但是我们换种方式大家可能就觉得简单理解了。数据卷可以理解为容器中的一个目录。
容器数据卷:命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。简单点来说,就是活动硬盘对接活动硬盘。
所以为了保存数据,我们在docker中使用卷,即数据卷。
二、容器卷的作用
数据卷的作用:
a.容器的持久化
b.容器间继承+共享数据
目前我们也可以通过命令去做这个动作,从容器内拷贝文件到主机,命令如下:
docker cp 容器id:容器内路径 目录主机路径
//比如目录主机路径为根目录/,容器内路径为/volumecontainer
//命令可以写为:docker cp 容器id:/volumecontainner /
三、创建数据卷[数据卷容器的添加方式]
数据卷容器有2中添加方式,一种是直接命令添加,一种是dockerfile文件添加。
1、直接命令添加:
- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名id
- 查看数据卷是否挂载成功
- 容器和宿主机之间数据共享
- docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
//直接运行命令 docker run -it -v /:/volumeContainer [imageid]
//在本机的根目录下,volumeContainer 指的是在容器内的目录
Ps:ro是只读,在容器内不能对容器卷进行编辑
在命令添加时可能会涉及到的一些命令:
docker ps:显示当前运行中的容器
docker ps -l:显示上一次运行的容器
docker start 容器id:启用容器
docker inspect 容器id:查看数据卷是否挂载成功
cat 文件名称:显示文件中的内容
2、Dockerfile添加
dockerfile文件的使用,具体可以参考另外一篇博文:https://www.cnblogs.com/wendyw/p/9728381.html
dockerfile文件添加数据卷容器大致步骤如下:
2.1 根目录下新建mydocker文件夹并进入
2.2 可在dockerfile中使用Volume指令来给镜像添加一个或多个数据卷
//比如:VOLUME[“/dataVolumeContainer1”,”/dataVolumeContainer2”,xxx]
//在dockerfie文件中添加如上命令就可以一次生成多个数据卷
2.3 File构建
2.4 Build后生成镜像-获得一个新镜像 xxx/centos
2.5 run容器
在完成Dockefile文件的运行后,查看是否添加成功,可以执行如下命令:
Docker inspect 容器id:查看本机默认路径下的容器卷
四、实战-不同容器之间共享容器卷
比如用centos镜像生成容器test1、test2、test3,已经是生成容器卷,/VolumeContainer是容器内数据卷
1、 打开虚拟机centos7终端,执行docker images出现错误:【Failed to restart dock.service: Unit not found.】,执行如下代码:
systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service