容器 root权限运行_Docker动手教程4.1:容器存储1

本文详细介绍了如何在Docker容器中挂载主机目录和文件,以实现数据持久化和权限控制。通过实例展示了挂载目录时权限的设置,以及文件覆盖的情况,强调了主机和容器间数据同步的原理。最后,提出了文件挂载的适用场景和一些常见命令。
摘要由CSDN通过智能技术生成

内容摘要

  1. 容器挂载主机目录
  2. 容器挂载主机文件

应用程序往往会使用数据库或者文件系统保存数据.比如web应用,需要保存静态网页和用户数据。对容器而言,里面运行的应用程序同样有持久化数据的需要,容器启动时需要加载数据,销毁时需要保留数据。本节带大家深入探讨容器如何使用存储。


容器挂载主机目录

容器可以直接挂载主机上的目录

准备容器环境,在根目录下创建test文件夹,在其下面创建index.html文件,内容如下:

  

this is docker volume!

f98af95eca33e71b2a322a0d290fb19d.png

使用 httpd:2.4 容器,将主机test目录挂载到容器目录,运行容器,命令如下:

docker run -d -p 80:80 -v /root/test:/usr/local/apache2/htdocs http:2.4
4948db1724cffb894a7d17e26d5b4f9c.png

参数 -p 80:80 :建立容器80端口和主机80端口映射,网络部分会在后面深入分析,这里只简单提一下。

-v:表示卷映射,用法是:-v 主机目录:容器目录。


容器起来后,使用如下命令访问httpd:

3d4c562ac0b3b9c8ddd6f62668f80812.png

可以看到 index.html 文件中的内容。


进入容器中的挂载目录看看该文件是否在容器可以访问:

ce74232be406d04fd0e08213711d6974.png

可以看到在容器中可以访问index.html文件。


如果我们在test文件夹再增加文件 welcome.html ,这样test下就有两个文件了,welcome.html文件内容如下:

  

welcome to docker volume!

0e88aafcbad9958a08aeebf5a1554019.png

运行容器,并使用curl访问html文件,命令如下:

docker run -d -p 80:80 -v /root/test:/usr/local/apache2/htdocs http:2.4curl 127.0.0.1:80curl 127.0.0.1:80/welcome.html
d8db0a8b09aa7defde7a3cdfa1daced4.png

访问成功,如果不指定具体 html 文件,curl默认访问 index.html 文件。

进入容器中,也可以看到 html 文件存在挂载目录下;


如果在主机修改 index.html 文件,那么容器中的文件会相应修改吗?

修改index.html文件内容如下:

  

this is docker volume! hello docker volume!

使用curl访问,并进入容器查看文件,如下图:

9f237a0b61fc058b25c961fea3a63e4b.png

可以看到,容器中的index.html文件内容也更改了。


现在反过来,我们在容器中修改index.html文件,然后在主机中观察:

我们将index.html内容改为:

updated index.
26780e8a2bcf45ac77210568ad04283c.png

第1步:进入容器

第2步:修改index.html文件

第3步:使用exit离开容器

第4步:在主机上查看index.html文件发现内容已经变更。


在上面的操作中,我们可以在容器中修改index.html文件是因为我们有读写该文件的权限。

容器在挂载存储的时候可以指定读写权限,默认可读可写,也可以指定为只读。权限控制能提高数据的安全性。

注意:该权限只是约束在容器中对文件的操作,没有约束主机的操作。

下面我们重新运行上面的容器,并设置存储读写权限为只读,命令为:

docker run -d -p 80:80 -v /root/test:/usr/local/apache2/htdocs:ro http:2.4
4ce679645458bf1f37df17c19af4ea39.png

在 -v 参数目录后面新加了 :ro,表示只读。

进入容器中,修改index.html文件:

e00ca74c024554102d5131e43ef6ccfa.png

可以看到修改失败,提示:Read-only file system。


在主机中修改:

c9bf3ca3ece9e501e884b4f5b8bb16e9.png

先离开容器,之后修改文件,查看,文件已经修改了。

结论:只能控制容器修改文件的权限,不能控制主机修改文件的权限。


使用 docker inspect 观察容器:

5a4caf0f817d6a6a67432ea4c830726d.png

上图截取了Mounts部分,可以看到这里记录了存储映射信息。


dockers也提供了一个命令查询容器存储卷,命令为:docker volume ls

1166163a984aaf07733d0687e6c34bbc.png

查询数据为空,该命令没有查到数据。

可见该命令有缺陷,说明这种挂载方式,无法使用该命令查询。


我们测试下删除操作,分别在主机上删除和在容器中删除index.html。

e7b3d59e7c3f33790c66adda717c17ab.png

在主机上删除index.html文件后,使用curl访问,出现404 Not Found错误。

进入容器查看文件是否存在:

29c3b196d413131f6318703c30a141bf.png

可以看到index.html不存在;

在容器中删除文件的情景是一样的,大家可以自行测试下。


问题:如果主机目录和容器挂载目录下有同名的文件,那么会不会覆盖呢?

其实,在httpd容器中,/usr/local/apache2/htdocs目录下存在一个index.html文件,我们主机test目录下也有index.html文件,使用curl访问返回信息却是我们主机的文件内容,可见这里出现了文件覆盖,即主机的文件覆盖了容器的同名文件。

我们先不挂载主机目录,运行httpd容器,使用命令:

docker run -d -p 80:80 httpd:2.4
302c5625c2093409d34d13fa2d5ef3e3.png

可以看到在容器中存在index.html文件,输出的内容是 It works!


下面我们重新运行容器,并挂载存储,命令参考上面

a439224d3d7896eba0e27c805634e229.png

可以看到,index.html文件的内容发生了变化,可见原先的文件已经被覆盖了。


容器挂载主机文件

如果我们不想原先的index.html文件被覆盖,该如何做呢?

前面我们在挂载的时候,使用了目录挂载,实际上可以文件挂载,这样就能避免文件被覆盖。

运行容器,命令如下:

docker run -d -p 80:80 -v /root/test/index.html:/usr/local/apache2/htdocs/myindex.html httpd:2.4
3d0be596de0eda931ced229fcd1619ba.png

运行容器时指定了主机的文件为index.html,也指定了容器的文件路径以及文件名myindex.html,该文件在容器中不存在。使用curl访问,结果都能访问得到。

进入该容器中:

6bf0431982234f570b1f31800f310fcd.png

容器中相关目录下出现了两个文件,其中myindex.html和主机上的index.html文件内容一样。

通过上面实验,可以知道:如果我们不需要覆盖容器中的文件,只需要增加新的文件,可以使用文件挂载。


问题:前面挂载的时候都是主机目录对容器目录,主机文件对容器文件,那么是否可以主机文件对容器目录呢?

测试如下:

运行容器,命令如下:

docker run -d -p 80:80 -v /root/test/index.html:/usr/local/apache2/htdocs httpd:2.4 
c2dcde50129225126663243ac6f82fb4.png

容器运行失败,从错误信息可以看出主机的文件不满足要求。

至于主机目录对容器文件是否能否挂载等情景,大家可以自行测试。


总结

容器挂载主机目录

优点:

使用比较直观;可以用于测试,直接将源代码放在主机上,在主机上修改代码既能看到实际效果。

缺点:

由于数据需要保存在主机特定的目录或者文件中,不便于容器迁移到其他主机。

至此,容器挂载主机就讲解完了,大家按照上面的顺序依次实验以加深理解。


实验

运行容器,挂载主机目录

运行容器,挂载主机文件


常用命令

sudo docker rm -f $(sudo docker ps -a | awk 'NR == 1 {next} {print $1}')

sudo docker rmi -f $(sudo docker images | awk 'NR == 1 {next} {print $3}')

docker rmi httpd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值