目录
一.docker与宿主机之间数据共享
数据卷概念(data volume)
docker数据持久化
数据卷的特点
数据卷的实现方式
二.docker容器之间数据共享
数据卷容器的概念
数据卷容器的实现
一.docker与宿主机之间数据共享
数据卷概念(data volume)
- 使用docker容器时,会产生一系列的数据文件。但是当我们关闭容器时,这些数据文件就会消失。
- 如果我们想要这些数据文件保持持久化,而且宿主机与容器之间能够数据共享,这就需要使用到数据卷。
- docker容器的数据卷可以看成U盘,它存在与一个或者多个容器中,且由docker挂载到容器,但是不属于联合文件系统。
- docker不会在容器删除时删除其挂载的数据卷。
- 数据卷可以来存储docker应用中的数据,而数据卷呈现给docker容器的形式就是一个目录,支持多个容器间共享。
- 使用docker的数据卷,类似于在系统中使用mount挂载一个文件系统
docker数据持久化
- 容器在运行期间产生的数据不会写入镜像里,重新用这个镜像启动新的容器就会初始化镜像,会加入一个全新的读写入层来保存数据
- 想要做到数据持久化,docker就要提供数据卷或者数据容器卷来解决问题
- 此外,也可以通过commit提交一个新的镜像来保存生产的数据
数据卷的特点
- 数据卷可以在容器之间共享或重用数据
- 在数据卷中更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷的实现方式
- 通过命令挂载数据卷
1.命令格式为:
docker run -it -v /宿主机的绝对路径目录:/容器内目录 镜像名 /bin/bash
#参数说明
#-v是指定挂载目录, /bin/bash进入docker环境
2.此条命令会在宿主机和容器内创建指定的目录,目录里的数据可以共享。此外可以使用
docker inspect 容器ID //查看数据卷的挂载结果
3.我们也可以给数据添加限制权限,比如宿主机只能读去数据卷的内容,可以使用以下命令:
docker run -it -v /宿主机绝对路劲目录:/容器内目录:ro 镜像名
另外,同样能够使用 docker inspect 容器ID 查看权限信息
实例如下:
[root@cloud mnt]# docker run -it -v /mnt/demo01:/demo02 httpd /bin/bash
root@6b4349ecc8d4:/usr/local/apache2# cd /
root@6b4349ecc8d4:/# ls
bin boot demo02 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@6b4349ecc8d4:/# cd demo02/
root@6b4349ecc8d4:/demo02# ls
root@6b4349ecc8d4:/demo02# echo "123456" > 1.txt
root@6b4349ecc8d4:/demo02# ls
1.txt
root@6b4349ecc8d4:/demo02# exit
exit
[root@cloud mnt]# ls
demo01
[root@cloud mnt]# ls demo01/
1.txt
[root@cloud mnt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b4349ecc8d4 httpd "/bin/bash" About a minute ago Exited (0) 54 seconds ago nervous_buck
[root@cloud mnt]# docker inspect 6b4349ecc8d4
"Mounts": [
{
"Type": "bind",
"Source": "/mnt/demo01",
"Destination": "/demo02",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
- 通过dockerfile添加数据卷
1.Dockerfile对于docker镜像而言就如同java中的某个类的.class文件对应上该类的.java文件
2.创建Dockerfile文件的方式:
首先在linux服务器根目录上新建docker文件夹并且建立Dockerfile文件
如docker run -it -v /宿主机绝对路径目录:/docker内目录 镜像名,相当于
vim /docker/Dockerfile
FROM 镜像名
VOLUME ["/生成的目录路径"] --privileged=true
CMD echo "successful building"
CMD /bin/bash
3.然后我们执行dockerfile文件(docker build和docker commit两个命令都可以建立docker镜像,但是docker commit需要在容器内进行,docker build不需要)
docker build -f /docker/Dockerfile -t 命名空间/镜像名 . (注意此处有一个.)
实例如下:
[root@cloud docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 13 days ago 127MB
httpd latest c5a012f9cf45 3 weeks ago 165MB
[root@cloud docker]#
[root@cloud docker]# cat Dockerfile
# volume test
FROM nginx
VOLUME ["/demo03"] --privileged=true
CMD echo "successful building"
CMD /bin/bash
[root@cloud docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 13 days ago 127MB
httpd latest c5a012f9cf45 3 weeks ago 165MB
[root@cloud docker]# docker build -f /docker/Dockerfile -t demo/nginx .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM nginx
---> 6678c7c2e56c
Step 2/4 : VOLUME ["/demo03"] --privileged=true
---> Running in 50d079f73f8e
Removing intermediate container 50d079f73f8e
---> 5fc8cf76cfb7
Step 3/4 : CMD echo "successful building"
---> Running in 5df40d4f6f6d
Removing intermediate container 5df40d4f6f6d
---> 62982b04da33
Step 4/4 : CMD /bin/bash
---> Running in d229329a482c
Removing intermediate container d229329a482c
---> 8257b617bbc8
Successfully built 8257b617bbc8
Successfully tagged demo/nginx:latest
[root@cloud docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo/nginx latest 8257b617bbc8 3 seconds ago 127MB
nginx latest 6678c7c2e56c 13 days ago 127MB
httpd latest c5a012f9cf45 3 weeks ago 165MB
[root@cloud docker]# docker run -it -name demo demo/nginx /bin/bash
unknown shorthand flag: 'n' in -name
See 'docker run --help'.
[root@cloud docker]# docker run -it demo/nginx /bin/bash
root@06a79d51ebe0:/# ls
bin boot demo03 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@06a79d51ebe0:/#
二.docker容器之间数据共享
数据卷容器的概念
- 数据卷相当于一块移动硬盘,而数据卷容器则相当于把多个移动硬盘挂载动一个移动硬盘之上,来实现数据之间的传递依赖
- docker官方给出的解释是:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,称之为数据卷容器
数据卷容器的实现
- 建立父容器
1.命令格式为:
docker run -it --name 父容器名字 -v /容器内目录 镜像名 /bin/bash
- 建立子容器继承父容器
1.命令格式:
docker run -it --name 子容器 --volumes-from 父容器 镜像名 /bin/bash
注:容器之间配置信息的传递,数据卷的生命周期会一直持续到没有容器使用这个数据卷为止。即只要有一个容器仍然在使用该数据卷,那么该数据卷都可以一直进行数据共享。如果说我们把父容器关闭,子容器之间照样可以进行数据共享,而且通过继承子容器生产的新的容器,一样可以与子容器进行数据共享