Docker---数据共享与数据持久化

目录

 

一.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

注:容器之间配置信息的传递,数据卷的生命周期会一直持续到没有容器使用这个数据卷为止。即只要有一个容器仍然在使用该数据卷,那么该数据卷都可以一直进行数据共享。如果说我们把父容器关闭,子容器之间照样可以进行数据共享,而且通过继承子容器生产的新的容器,一样可以与子容器进行数据共享

发布了139 篇原创文章 · 获赞 168 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42761527/article/details/104935559
今日推荐