Docker---初识数据卷

数据卷的介绍

一、docker的理念

将应用和环境打包成一个镜像

二、为什么学习数据卷

1. 如果数据都在容器中,那么我们删除容器的时候,数据就会丢失。需求:数据可以持久化,数据可以存储在本地!

2. 容器之间可以有一个数据共享的技术,docker容器中产生的数据,同步到本地。这就是卷技术,说白了就是目录的挂载,将我们容器内的目录,挂载到linux上面。

3. 总结:容器的持久化和同步操作。容器之间也是可以数据共享的。

数据卷的使用

方式一:直接使用命令来挂载:-v

[root@localhost ~]# docker run -it -v 主机目录:容器内目录          # 同步的过程,双向绑定。修改任何一个地方,另一个都会受到影响。
[root@localhost ~]# docker run -it -v /home/test:/home centos /bin/bash

[root@localhost ~]# docker inspect 690a419bf263                    # 查看容器的详细信息。这里只看打印出来的Mounts参数信息即可。

[root@localhost ~]# docker stop 690a419bf263                       # 停止容器
[root@localhost ~]# docker start 690a419bf263                      # 启动容器
[root@localhost ~]# docker attach 690a419bf263                     # 进入容器

停止容器之后,在宿主机上修改文件,然后启动容器,发现容器内的数据依旧是同步的。以后修改只需要在本地修改即可,容器内会自动同步。

方式二:数据卷之Dockerfile

Dockerfile就是用来构建docker镜像的构建文件,由一条条命令组成的脚本,通过这个脚本可以生成镜像。镜像是一层一层的,脚本一个个的命令,每个命令都是一层。

1. 创建一个dockerfile文件,文件名字可以随意,建议使用Dockerfile作为文件名。我这里使用的是MyDockerfile,文件内容如下:

FROM centos                      # 指令(大写)

VOLUME ["volume01","volume02"]   # 这里的volume01与volume02指的是容器内路径,宿主机路径没有指定。

CMD echo '------end------'
CMD /bin/bash

2. 运行这个dockerfile文件,生成镜像

[root@localhost ~]# docker build -f dockerfile文件名 -t imagename Dockerfilepath
[root@localhost ~]# docker build -f /home/MyDockerfile -t my_images .
[root@localhost ~]# docker build -f /home/MyDockerfile -t my_images /home

3. 查看镜像是否生成,如果镜像生成则运行镜像,生成容器。并查看数据卷挂载情况。

[root@localhost ~]# docker images                           # 查看所有镜像,查看上面的命令是否生成了镜像

[root@localhost ~]# docker run -it my_images /bin/bash      # 启动镜像,生成容器。通过镜像id也可以启动,这里使用的是镜像名称

[root@localhost ~]# docker inspect 容器id
[root@localhost ~]# docker inspect 3a0f07d50891             # 查看容器信息,信息中包含了数据卷挂载的路径。查看结果显示的是匿名挂载。

具名挂载和匿名挂载

一、示例如下

[root@localhost ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx                # 匿名挂载
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx   # 具名挂载

[root@localhost ~]# docker volume --help  
[root@localhost ~]# docker volume ls                       # 查看所有的卷的情况
[root@localhost ~]# docker volume inspect juming-nginx     # 查看某一个卷的情况

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的就是具名挂载。

二、如何确定是具名挂载还是匿名挂载,还是指定路径挂载

  • -v 容器内路径                          # 匿名挂载
  • -v 卷名:容器内路径                  # 具名挂载
  • -v /宿主机路径:容器内路径      # 指定路径挂载

三、拓展

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx     # ro:readonly,只读
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx     # rw:readwrite,可读可写,默认的

一旦设置了容器权限,容器对我们挂载出来的内容就有限定了。设置了ro,就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。

实战:Mysql同步数据(宿主机与容器之间)

一、下载mysql镜像

[root@localhost ~]#  docker search mysql
[root@localhost ~]#  docker pull mysql:5.7

二、运行mysql镜像,生成mysql容器,指定路径挂载

[root@localhost ~]#  docker run -d -p 3120:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

数据卷容器

一、解决了什么问题?

两个或者多个容器之间实现数据共享。

二、示例1:使用上面自己构建的镜像(容器与容器之间)

[root@localhost ~]# docker run -it --name docker01 my_images                              # docker01就是数据卷容器,有两个数据卷:volume01和volume02
[root@localhost ~]# docker run -it --name docker02 --volumes-from docker01 my_images      # 继承docker01,也有volume01和volume02
[root@localhost ~]# docker run -it --name docker03 --volumes-from docker01 my_images      # 同理

[root@localhost ~]# docker attach 容器id
[root@localhost ~]# docker attach 1e476e287b2b       # 进入docker01容器

进入docker01容器,在docker01的数据卷目录下修改数据,则docker02的数据卷目录内容也会发生改变。反过来也一样,在docker02的数据卷目录下修改数据,则docker01的数据卷目录内容也会发生改变。即数据同步是双向的。

只要通过 --volumes-from,我们就可以实现容器间的数据共享了。

三、示例2:多个 Mysql 实现数据共享(容器与容器之间)

[root@localhost ~]# docker run -d -p 3120:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@localhost ~]# docker run -d -p 3120:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

原文地址:https://www.cnblogs.com/liuhaidon/p/13619125.html