docker中如何管理容器数据

58次阅读
没有评论

共计 3658 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章给大家分享的是有关 docker 中如何管理容器数据的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

主要有两种方法来管理 docker 数据。

Data volumes, and

Data volume containers.

数据卷的作用:

Data volumes

A data volume is a specially-designated directory within one or more containers that bypasses the Union File System to provide several useful features for persistent or shared data(在一个或多个容器中一个特别指定的目录,通过绕过联合文件系统提供多个有用的特性用于储存或共享数据):

Data volumes can be shared and reused between containers(可分享,可重用)

Changes to a data volume are made directly(直接的更改)

Changes to a data volume will not be included when you update an image(当你更新镜像时,对 volume 的更改不会被包含其中)

Volumes persist until no containers use them(保存至容器不再使用它)

实质:不就是一个目录嘛

实践:

使用 - v 在容器内增加一个数据卷(即 /webapp 目录):

docker run -d -P --name web -v /webapp training/webapp python app.py

进入容器查看(需要先安装 nsenter,这里我用了脚本):

root@docker:~# accessdock
Please input the specific container s name:web
root@831a05306ec7:/# ls
bin dev home lib64 mnt proc run selinux sys usr webapp
boot etc lib media opt root sbin srv tmp var
root@831a05306ec7:/#

可以看到在容器根目录下多了一个 webapp 文件夹。

关于在 dockerfile 中的用法(使用 VOLUME)标识:

You can also use the VOLUME instruction in a Dockerfile to add one or more new volumes to any container created from that image.

使用 - v 挂载本地目录到容器内作为数据卷(如果该目录不在,docker 会自动创建):

PS: 在我的试验中,官方手册中这个命令会导致容器自己退出,把 /opt 更改为其他目录就不会出问题了:

docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

看看效果:

root@docker:~# docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py # : 前的是本地目录,: 后的是容器内目录
a1c6d9d20eb47a77e526d8b6f8af2926a253afd9112ec32480b5c060fceceff7
root@docker:~# cd /src/webapp/
root@docker:/src/webapp# ls
root@docker:/src/webapp#

我的宿主机本来没有 /src/webapp 目录,但是 docker 自动创建了它。

先进入容器看看:

root@docker:~# accessdock 
Please input the specific container s name:web
root@7d201fd35578:/# ls
bin dev home lib64 mnt proc run selinux sys usr webapp
boot etc lib media opt root sbin srv tmp var
root@7d201fd35578:/# cd webapp/
root@7d201fd35578:/webapp# touch hellp
root@7d201fd35578:/webapp# ls
hellp
root@7d201fd35578:/webapp# exit
logout
root@docker:~# cd /src/webapp/
root@docker:/src/webapp# ls
hellp

通过这样的试验,可以了解到数据卷的共享特性。在容器内的数据卷创建文件,宿主机上也会看到。

默认情况下,容器对这个目录是可读可写的。如果你想让容器对 /src/webapp 只有读属性,使用以下命令:

docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py

在容器目录后加上一个 :ro 即可。

当我想从容器删除 hellp 文件时,提示只能读:

root@08fae41a534b:/webapp# rm hellp
rm: cannot remove `hellp : Read-only file system

在容器之间共享数据卷:

在某些情况下,需要为多个容器提供共享数据,你可以启动一个数据卷容器并把数据挂载到此。这样一来,其他连接到此数据卷容器的容器都可以访问那些被挂载的数据。在这里,我先启动一个数据卷容器并把主机的 /var/data 挂载上去。再启动其他容器,使他们能访问数据卷容器的共享数据卷。

启动数据卷容器:

docker run -d -p 1000:5000 -v /var/data:/data --name data1 training/webapp python app.py

启动一个附加容器:

docker run -d -p 2000:5000 --volumes-from data1 --name data2 training/webapp python app.py

这里我们使用了 –volumes-from 标识(指定数据卷容器),把它和 data1 连接起来,因此,在 data2 中也会有相同的 /data 目录。

进行验证:

root@docker:/var/data# mkdir test
root@docker:/var/data# touch test/hello
root@docker:/var/data# ls # 在数据卷中创建点东西
abc test
root@docker:/var/data# ls test/
hello
root@docker:/var/data# accessdock
Please input the specific container s name:data1
root@9795da386459:/# cd /data
root@9795da386459:/data# ls
abc test
root@9795da386459:/data# cd test/
root@9795da386459:/data/test# ls # 在 data1 上也能访问
hello
root@9795da386459:/data/test# 
root@9795da386459:/data/test# exit
logout
root@docker:/var/data# accessdock
Please input the specific container s name:data2
root@2b383ccacd05:/# cd data/
root@2b383ccacd05:/data# ls
abc test
root@2b383ccacd05:/data# cd test/
root@2b383ccacd05:/data/test# ls # 在 data2 上也能访问
hello

当你删除挂载卷的 data1 容器,包括初始化数据化容器,或者随后的容器,该卷将不会被删除, 直到没有容器使用该卷。这允许你升级,或者把有效的数据卷在容器之间迁移。

思考:我尝试把可执行文件放到共享数据卷中,设置了 read-only。但是依然能在容器中执行该文件。恐怕这在生产环境中是个问题可能出现的地方,必须采取限制访问等方式,即使容器的操作对主机构成威胁,也可以保护主机不受影响。这个问题必须得到重视。

感谢各位的阅读!关于“docker 中如何管理容器数据”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计3658字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)