docker存储卷
docker有两种类型的存储卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同
- 绑定挂在卷
容器内和宿主机都需要指定一个已知的路径,二者建立关联关系
- docker管理卷
在容器内指定挂载点,而被绑定到宿主机的目录是不需要已知的,由容器引擎执行创建管理,和容器建立关联关系。一般情况通常为目录下的id号
在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
我们简单使用联盟容器和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端口即可。