GVKun编程网logo

(九)Docker 数据管理(docker的数据管理)

4

在本文中,我们将详细介绍的各个方面,并为您提供关于九Docker数据管理的相关解答,同时,我们也将为您带来关于4、Docker数据管理、5、Docker数据管理、docker(三)数据管理、docke

在本文中,我们将详细介绍的各个方面,并为您提供关于九Docker 数据管理的相关解答,同时,我们也将为您带来关于4、Docker数据管理、5、Docker 数据管理、docker (三) 数据管理、docker - 数据管理的有用知识。

本文目录一览:

(九)Docker 数据管理(docker的数据管理)

(九)Docker 数据管理(docker的数据管理)

Docker 数据管理,即 Docker 内部以及容器之间管理数据,主要有两种方式:数据卷和挂载。

1. 数据卷(Volume)

volume,可供一个或多个容器使用的特殊目录。

  • 数据卷可在容器之间共享和重用;
  • 对数据卷的修改会立马生效;
  • 对数据卷的更新,不会影响镜像;
  • 数据卷默认会一直存在,即使容器被删除;(可通过 docker volume prune 命令删除无效的 volume)

数据卷的使用,类似于 Linux 下对目录或文件进行 mount 操作,镜像中被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

docker volume 命令

-bash-4.2# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Options:
      --help   Print usage

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused volumes
  rm          Remove one or more volumes

Run ''docker volume COMMAND --help'' for more information on a command.

2. 挂载主机目录(Bind mounts)

错误的挂载

-bash-4.2# docker run -it --rm -p 1992:80 --name mynginx -v ./:/usr/local/nginx/html mynginx:v1.0.0
docker: Error response from daemon: create ./: "./" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intented to pass a host directory, use absolute path.
See ''docker run --help''.

正确的挂载

-bash-4.2# pwd
/home/yvhqbat/docker/nginx_docker
-bash-4.2# docker run -it --rm -p 1992:80 --name mynginx -v /home/yvhqbat/docker/nginx_docker:/usr/local/nginx/html mynginx:v1.0.0  

一个容器的启动脚本,可以写出如下 start.sh:

#!/bin/bash

docker stop mynginx

#docker image rm mynginx:v1.0.0
#docker image load -i mynginx.tar

WORKDIR=`pwd`
docker run -dit --rm -p 1992:80 --name mynginx -v $WORKDIR:/usr/local/nginx/html mynginx:v1.0.0

4、Docker数据管理

4、Docker数据管理

一、挂载类型

1、volumes

Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。

使用场景:将容器中的数据持久化到宿主机,比如容器是mysql,容器重启后就没数据了,此时需要保存到宿主机上。

 

2、bind mounts

将宿主机上的任意位置的文件或者目录挂载到容器中。

使用场景:容器使用一些宿主机上的文件或目录。比如zabbix agent 他需要采集宿主机上的proc目录对其进行监控。

3、tmpfs

挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久化到任何位置,可以使用tmpfs,同时避免写入容器可写层,以提高性能。

使用较少。

 

 

 二、volumes

1、创建和查看volume

 

2、使用vloume

 注意:也可以使用-v的方式,是老的方式。

docker run -d --name lnmp_web03 -p8889:80 -v nginx_root:/usr/share/nginx/html nginx

3、验证

修改主页

 查看主页

直接修改/var/lib/docker/volumes/nginx_root/_data数据,就是修改的容器的数据,当容器挂掉后,我们重新再启动一个新的容器即可。这就是volume的好处啦。

 

三、bind mounts

bind方式和volume不同之处是:bind方式是直接将宿主机上的某个目录作为源。此目录必须存在,不然会报错。

1、bind方式创建容器

 

 注意:

1、如果源文件/目录没有存在,不会自动创建,会抛出错误。

2、如果挂载目标在容器中非空目录,则改目录现有内容将被隐藏。

3、使用另外一种方式使用bind

 docker run -d --name lnmp_ggg -p8889:80 -v /mnt:/usr/share/nginx/html nginx

2、查看容器

容器里面本来是有内容的,挂载源文件后,会被覆盖,现有内容隐藏起来。

 

3、编写主页

 

4、验证

5、查看源目录 

 

四、总结

1、volume特点

  • 多个运行容器之间共享数据。
  • 当容器停止或被移除时,该卷依然存在。
  • 多个容器可以同时挂载相同的卷。
  • 当明确删除卷时,卷才会被删除。
  • 将容器的数据存储在远程主机或其他存储上。
  • 将数据从一台dokcer迁移到另外一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes)
  • volume最大的特点:容器初始化时,容器的某个目录映射到宿主机,也就是把容器的数据持久化到volume上。container =>docker host
  • 使用命令创建一个volume后,系统会在/var/lib/docker/volume/下面生成一个volume,然后容器的数据会映射到宿主机的volume下。主要用于容器数据的持久化。

2、Bind Mounts特点

  • 从主机共享配置文件到容器,默认情况下,挂载主机resolv.conf到每个容器,提供DNS解析。
  • 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker上构建Maven项目时,容器都可以访问构建最新的项目包。
  • 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时。
  • Bind的最大特点是:容器初始化时,宿主机上的某个目录映射到容器的dst目录,并且dst目录原本有内容也会被覆盖掉,本质是宿主机的volume映射到容器。docker host=>container
  • 将宿主机的某个文件目录映射到docker容器,如果容器对应目录不为空,则会被宿主机目录下的内容覆盖掉!

总结:

volume适应于多个容器共享数据,方便容器数据持久化!比如Mysql数据库进行数据持久化。

Bind Mounts适应于宿主机和容器共享文件!比如一个网站要经常更新,可以使用Bind方式,每次提交最新的代码,用户访问的也是最新的。

5、Docker 数据管理

5、Docker 数据管理

为了能够存储持久化数据以及共享容器间的数据,Docker 提出了 Volume 的概念。让我们通过类似 mount 的方式将宿主机的文件或者目录挂载到容器中。

在容器中管理数据主要有两种方式:

  • 数据卷(Data volumes)

  • 数据卷容器(Data volume containers)

数据卷

创建一个数据卷

在使用 docker run 命令的时候,使用 - v 选项创建一个数据卷并挂载到容器里。

下面创建一个测试容器 nginx,并加载一个数据卷到容器的 /data 目录。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test1 -v /data nginx

容器启动后,登录到容器会发现 /data 目录是空的。

[root@linux-node1 ~]# ./docker_in.sh nginx-volume-test1
root@00741a2a44ad:/# ls -l /data
total 0

上面的命令会挂载一个 data 目录到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录。任何在该镜像 /data 路径的文件会将被复制到 Volume。那么在我们宿主机上,这个目录到底在哪里呢。

我们可以使用 docker inspect 命令找到 Volume 在主机上的存储位置:

[root@linux-node1 ~]# docker inspect -f {{.Mounts}} nginx-volume-test1

[{861cbee5b650461490633fc60bd94a0df0f8b01e4a4dcc4adff4825dff509159
/var/lib/docker/volumes/861cbee5b650461490633fc60bd94a0df0f8b01e4a4dcc4adff4825dff509159/_data
/data local true }]

你会发现,容器中的 /data 目录实际上挂载到了 /var/lib/docker/volumes/ 容器 ID/_data 的目录下。

我们现在在宿主机该目录下创建一个文件。

[root@linux-node1 _data]# touch mount-test

我们再次在容器中查看,发现已经有了。

[root@linux-node1 ~]# ./docker_in.sh nginx-volume-test1
root@00741a2a44ad:/# ls -l /data
total 0
-rw-r--r-- 1 root root 0 Sep 2 18:58 mount-test

指定一个宿主机目录作为数据卷

有的时候,我们需要将宿主机的某个目录挂载到容器中来进行访问,可以通过 - v 源路径:目标目录的方式进行。

[root@linux-node1 ~]# mkdir -p /data/docker-volume-nginx
[root@linux-node1 ~]# docker run -d --name nginx-volume-test2 \
-v /data/docker-volume-nginx:/data nginx

你会发现,目前容器中的 /data 目录和宿主机中的 /data/ docker-volume-nginx 目录是相同的。

文件挂载

数据卷也可以挂载一个宿主机的文件作到容器中作为数据卷。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test3 \
-v /$HOME/.bash_history:/root/.bash_history nginx

上面案例将宿主机的.bash_history 挂载到了容器中,这样就可以记录容器中的命令历史记录。

只读挂载

Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test \
-v /data/docker-volume-nginx:/data:ro nginx

数据卷生产实践

那么这种将本地的目录挂载到容器中的方法,在生产中有哪些应用场景呢?

在开发环境中

在基于 Docker 的开发环境中,例如我们将本地的 /home/code 目录挂载到容器中的 /data/webroot,然后容器的应用的 webroot 同样设置为 /data/webroot,那么容器启动后,我们就可以自由的本地进行代码的编写和调试,对于解释性的语言,就比较方便了。如果你的 Docker 运行在虚拟机中,可以先将本地例如 D:code 目录通过虚拟机软件共享到虚拟机里,目前 VirtualBox 和 Vmware workstation 都支持目录映射。在 Vmware 中需要在虚拟机中安装 Vmware Tools。

在生产环境中

如果我们的容器里面运行的程序需要写一些持久化的数据到硬盘,或者共享宿主机的一些文件或者目录,显然这种数据卷的挂载非常的方便。

不过数据卷最大的缺陷应该是不灵活了,因为 Docker 的理念是 Build、Ship、Run。因为有这个挂载目录的依赖,那么这个 Docker 镜像在新的宿主机上运行就需要考虑挂载的目录是否存在等问题。

数据卷容器

Docker 还支持让一个容器访问另一个容器的 Volume,我们可以使用 -volumes-from 参数挂载其它容器的卷。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test4 \
--volumes-from nginx-volume-test1 nginx
7d650d332e3d9bf4086be35ae5a04b618f9d8e1df03fa2fef5f5766318a4ca12
[root@linux-node1 ~]# ./docker_in.sh nginx-volume-test4
root@7d650d332e3d:~# ls /data
mount-test

注意:不管数据卷容器 nginx-volume-test1 是否运行,nginx-volume-test4 都可以访问到 nginx-volume-test1 里面挂载的数据卷。所以说数据卷容器,其实就是一个普通的容器,只不过是专门用来提供数据卷供其它容器挂载使用的。

数据卷容器生产实践

在生产中使用数据卷容器的方案有很多,一个非常典型的就是在进行日志收集的时候。我们可以在一台服务器上启动一个 logstash 或者 filebeat 的容器 log-volume,然后其它所有应用容器启动都使用 --volumes-from log-volume,将日志写入对应路径,然后使用统一收集,这样就避免在所有需要进行日志收集的容器中去部署 logstash。相对于直接挂载本地目录也更加的方便。

docker (三) 数据管理

docker (三) 数据管理

数据卷

启动 nginx 容器,挂在到 /data 目录下

[root@test1 ~]# docker run -it --name volume-test1 -h nginx -v /data centos
[root@nginx /]# ls /data/

查看对应的系统目录

[root@test1 ~]# docker inspect volume-test1 | grep Source
"Source": "/var/lib/docker/volumes/4d1fece4eec5c31c9a10ac62542da22a85a026121f5d8a3f73c8e5ca62ba133c/_data",
[root@test1 ~]# cd /var/lib/docker/volumes/4d1fece4eec5c31c9a10ac62542da22a85a026121f5d8a3f73c8e5ca62ba133c/_data
[root@test1 _data]# touch hehe

容器内查看,生成 hehe 文件

[root@nginx /]# ls /data/

hehe

指定系统的目录位置 opt/(系统路径):/opt(容器路径):ro (只读)

[root@test1 ~]# docker run -it --name volume-test2 -h nginx -v /opt:/opt centos
[root@nginx /]# ls /opt
hello rh

数据卷容器

把其他数据卷挂载过来

root@test1 ~]# docker run -it --name volume-test3 --volumes-from volume-test1 centos
[root@377fc168e866 /]# ls
anaconda-post.log bin data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@377fc168e866 /]# ls /data
hehe test
[root@377fc168e866 /]#

 

docker - 数据管理

docker - 数据管理

一、建立、挂载数据卷
 
1. 建立宿主机本地 datat 目录下的 docker_test 作为容器存放数据目录的路径,进行目录映射
语法:docker run -itd -v /【宿主机目录】/:/【容器目录】/ 【镜像名称】 bash
说明:-v 用来指定挂载目录,: 前面的 /data/ 为宿主机本地目录,: 后面的 /data/ 为容器里的目录,会在容器中自动创建
[root@host1 ~]# docker run -tid -v /data/docker_data/:/data/ centos bash
904948dca04f3b4bbebc0fe1fc1160d17c9cef11e5f6bc4b23617b322d73f8d3
 
ps 查看创建的容器,名称 amazing_visvesvaraya
[root@host1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
904948dca04f centos "/bin/bash" 7 seconds ago Up 6 seconds amazing_visvesvaraya
 
进入创建的容器查询是否成功
[root@host1 ~]# docker exec -it 904948dca04f bash
[root@904948dca04f /]# ls data/
1.txt 3.txt test.txt
 
2: 映射目录后,创建新的容器挂载数据卷
语法:docker run -itd --volumes-from 【映射了的容器名称】 【镜像名称】bash
说明:挂载目录的时候,可以指定容器 name,如果不指定就随机定义了。上面没有指定,随机生成了一个名字为 amazing_visvesvaraya,docker ps 查看看最右侧一列这样,使用镜像 centos_test2 创建了新的容器,并且使用了 amazing_visvesvaraya 容器的数据卷
[root@host1 ~]# docker run -itd --volumes-from amazing_visvesvaraya centos_test2 bash
810ff9bebe6dc767308aac49b9b61d0e113b441ee88002373899afbe468113bb
 
进入创建的容器查询是否成功
[root@host1 ~]# docker exec -it 810ff9beb bash
[root@810ff9bebe6d /]# ls data/
1.txt 3.txt test test.txt
 
 
3:建立容器中的 NFS 数据卷,共享其它容器使用
语法:docker run -itd -v /【容器的路径】/-name 【定义容器名称】【镜像名称】 bash
说明:在众多容器中,我们需要多个容器之间相互共享数据,类似于 linux 里面的 NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。注意 - V 后面的路径是容器的路径,并非宿主机的路径。 
[root@host1 ~]# docker run -itd -v /data/ --name testvol centos bash
46f89904218d8c1a6f56ac167cef6c3b713c251b6c118532425f72da1f1c2c47
[root@host1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46f89904218d centos "bash" 6 seconds ago Up 5 seconds testvol
810ff9bebe6d centos_test2 "bash" About an hour ago Up About an hour youthful_noyce
904948dca04f centos "/bin/bash" 5 hours ago Up 5 hours amazing_visvesvaraya
 
说明:以上操作完成后,然后让其他容器挂载该数据卷共享使用
[root@host1 ~]# docker run -itd --volumes-from testvol centos bash

我们今天的关于九Docker 数据管理的分享就到这里,谢谢您的阅读,如果想了解更多关于4、Docker数据管理、5、Docker 数据管理、docker (三) 数据管理、docker - 数据管理的相关信息,可以在本站进行搜索。

本文标签: