在本文中,我们将详细介绍的各个方面,并为您提供关于九Docker数据管理的相关解答,同时,我们也将为您带来关于4、Docker数据管理、5、Docker数据管理、docker(三)数据管理、docke
在本文中,我们将详细介绍的各个方面,并为您提供关于九Docker 数据管理的相关解答,同时,我们也将为您带来关于4、Docker数据管理、5、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数据管理
一、挂载类型
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 数据管理
为了能够存储持久化数据以及共享容器间的数据,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 (三) 数据管理
数据卷
启动 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 数据管理的分享就到这里,谢谢您的阅读,如果想了解更多关于4、Docker数据管理、5、Docker 数据管理、docker (三) 数据管理、docker - 数据管理的相关信息,可以在本站进行搜索。
本文标签: