白话容器之docker存储卷使用的几种方式(17)

2023年 7月 16日 45.9k 0

docker存储卷

docker有两种类型的存储卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同

  • 绑定挂在卷

容器内和宿主机都需要指定一个已知的路径,二者建立关联关系

  • docker管理卷

在容器内指定挂载点,而被绑定到宿主机的目录是不需要已知的,由容器引擎执行创建管理,和容器建立关联关系。一般情况通常为目录下的id号docker-42.png

在docker中使用存储卷,使用-v指定目录即可

docker管理卷

使用-v指定目录即可-v /data/wwwroot,这段路径在容器内,而宿主机是有docker管理的卷

[root@linuxEA10_10_240_145 ~]$ docker run --name linuxea -it --network linuxea0 --rm -v /data/wwwroot busybox 
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # ls data/wwwroot/
/ #

而后可以通过docker inspect linuxea来查看被挂载到宿主机的目录

[root@linuxEA10_10_240_145 ~]$ docker inspect -f {{.Mounts}} linuxea
[{volume cc94787f8024ffbc381d14098a8b23dca4a4a819287dc996fe320d86c7358c2a /var/lib/docker/volumes/cc94787f8024ffbc381d14098a8b23dca4a4a819287dc996fe320d86c7358c2a/_data /data/wwwroot local  true }]

也可以看所有的信息

[root@linuxEA10_10_240_145 ~]$ docker inspect linuxea
...
        "Mounts": [
            {
                "Type": "volume",
                "Name": "a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4",
                "Source": "/var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data",
                "Destination": "/data/wwwroot",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
...            

现在被挂载到/var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data

我们在容器内写入文件

/ # echo `date` >> /data/wwwroot/index.html
/ # cat /data/wwwroot/index.html 
Tue Dec 4 07:17:17 UTC 2018
/ # 

而后在查看宿主机/var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data目录

回到宿主机

[root@linuxEA10_10_240_145 ~]$ ll /var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data
总用量 4
-rw-r--r-- 1 root root 28 12月  4 15:17 index.html
[root@linuxEA10_10_240_145 ~]$ cat /var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data/index.html 
Tue Dec 4 07:17:17 UTC 2018

在宿主机追加到文件中,而后在返回容器查看是否在容器中也有

[root@linuxEA10_10_240_145 ~]$  echo `date` >> /var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data/index.html
[root@linuxEA10_10_240_145 ~]$ cat /var/lib/docker/volumes/a4bfafafc7dcbad92c4fc313850cfbbf056c3c9054cade231ef47a03eccb3dc4/_data/index.html
Tue Dec 4 07:17:17 UTC 2018
2018年 12月 04日 星期二 15:34:58 CST

容器中

/ # cat /data/wwwroot/index.html 
Tue Dec 4 07:17:17 UTC 2018
2018年 12月 04日 星期二 15:34:58 CST

绑定挂载卷

如:-v /data/wwwrootdir:/data/wwwroot 。这里的/data/wwwrootdir:/data/wwwroot,前面的/data/wwwrootdir是宿主机的目录,后面的/data/wwwroot是容器内的目录

如果目录不存在则创建,如果存在则覆盖

[root@linuxEA10_10_240_145 ~]$ docker run --name linuxea -it --network linuxea0 --rm -v /data/wwwrootdir:/data/wwwroot busybox 
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # 

此时在宿主机上验证一下。在echo `date +%D-%T` >> /data/wwwrootdir/index.html写入时间

[root@linuxEA10_10_240_145 ~]$ echo `date +%D-%T` >> /data/wwwrootdir/index.html
[root@linuxEA10_10_240_145 ~]$ cat /data/wwwrootdir/index.html
12/04/18-15:41:24

回到容器内,index.html文件中已经注入的信息和宿主机一样。

/ # cat /data/wwwroot/index.html 
12/04/18-15:41:24

而后删除容器,那这个文件仍然存在。

[root@linuxEA10_10_240_145 ~]$ ll /data/wwwrootdir/index.html 
-rw-r--r-- 1 root root 18 12月  4 15:41 /data/wwwrootdir/index.html
[root@linuxEA10_10_240_145 ~]$ cat /data/wwwrootdir/index.html
12/04/18-15:41:24

在重新run容器,挂载相同的目录

[root@linuxEA10_10_240_145 ~]$ docker run --name linuxea -it --network linuxea0 --rm -v /data/wwwrootdir:/data/wwwroot busybox 
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # cat /data/wwwroot/index.html 
12/04/18-15:41:24
[root@linuxEA10_10_240_145 ~]$ docker inspect -f {{.Mounts}} linuxea
[{bind  /data/wwwrootdir /data/wwwroot   true rprivate}]

可以看见文件仍然存在。由此,绑定挂载可完成一定意义的持久存储。

共享存储卷

两个容器分别是linuxea和linuxea1挂载宿主机同一个目录,并且在容器内写入数据共享

linuxea

[root@linuxEA10_10_240_145 ~]$ docker run --name linuxea -it --network linuxea0 --rm -v /data/wwwrootdir:/data/wwwroot busybox 
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # echo "linuxea" >> /data/wwwroot/index.html 

linuxea1

[root@linuxEA10_10_240_145 ~]$  docker run --name linuxea1 -it --network linuxea0 --rm -v /data/wwwrootdir:/data/wwwroot busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # cat /data/wwwroot/index.html 
12/04/18-15:41:24
linuxea
/ # echo "linuxea1" >> /data/wwwroot/index.html 
/ # cat .
cat: read error: Is a directory
/ # cat /data/wwwroot/index.html 
12/04/18-15:41:24
linuxea
linuxea1

回到linuxea

/ # cat /data/wwwroot/index.html 
12/04/18-15:41:24
linuxea
linuxea1

复制存储卷

现在我们知道docker可以共享多个容器存储卷,但是如果共享太多操作起来会较为麻烦,我们可以使用复制来做

和上面一样,在初始化run的时候,指明要复制那个卷,使用--volumes-from选项。如下

[root@linuxEA10_10_240_145 ~]$ docker run --name linuxea2 -it --network linuxea0 --rm --volumes-from linuxea  busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # cat /data/wwwroot/index.html 
12/04/18-15:41:24
linuxea
linuxea1

这样一来就有了三个容器使用同一个存储卷。

联盟容器之存储卷

那这样的话就可以延续之前网络中的的“联盟式容器”

我们创建一个容器,只要存在就可以,并且指定存储卷路径,而后这个容器作为后面启动其他几个有关联容器的基础架构容器。

nginx容器复制存储卷设置,tomcat也复制存储卷设置。“联盟式容器”则会共享网络名称空间,就可以建立密集的联盟关系。这样nginx和tomcat使用底层容器创建的网络名称空间,都通过底层容器的一个对外的网络ip和lo接口,lo用作内部通讯tomcat可监听,nginx监听对外的网络地址。用户先到nginx外部ip,而后到内部lo tomcat

docker-44.png我们简单使用联盟容器和volumes-from创建一个容器,作为基础容器.--network linuxea0是我自己创建的linuxea0,可以不指定

[root@linuxEA10_10_240_145 ~]$ docker run --name init -it --network linuxea0 -v /data/init/volume:/data/wwwroot busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # 

而后创建一个nginx加入到init网络中,并且复制init的存储卷--volumes-from

[root@linuxEA10_10_240_145 ~]$ docker run --name httpd --network container:init --volumes-from init -it busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # 

我们来查看下存储卷文件路径

[root@linuxEA10_10_240_145 ~]$ docker inspect -f {{.Mounts}} httpd
[{bind  /data/init/volume /data/wwwroot   true rprivate
[root@linuxEA10_10_240_145 ~]$ docker inspect -f {{.Mounts}} init
[{bind  /data/init/volume /data/wwwroot   true rprivate}]

和ip

[root@linuxEA10_10_240_145 ~]$ docker inspect -f {{.NetworkSettings.Networks.linuxea0.IPAddress}} init
172.25.100.2

而httpd的ip地址是加入到init的,inspect看不到,我们通过进入容器ip a查看

[root@linuxEA10_10_240_145 ~]$ docker run --name httpd --network container:init --volumes-from init -it busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
135: eth0@if136: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:19:64:02 brd ff:ff:ff:ff:ff:ff
    inet 172.25.100.2/24 brd 172.25.100.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 

这样配置tomcat绑定127.0.0.1端口,而后使用httpd或者nginx代理本地127.0.0.1的tomcat端口即可。

相关文章

LeaferJS 1.0 重磅发布:强悍的前端 Canvas 渲染引擎
10分钟搞定支持通配符的永久有效免费HTTPS证书
300 多个 Microsoft Excel 快捷方式
一步步配置基于kubeadmin的kubevip高可用
istio全链路传递cookie和header灰度
REST Web 服务版本控制

发布评论