yuanye0 2019-10-31
要知道容器是有生命周期的。
docker默认的存储方式:存储类型:(strage driver:overlay2.xfs)
1)bind mount(用户管理):将宿主机上的某个目录或文件(不可以是没有格式化的磁盘文件),挂载到容器中,默认在容器内对此目录是有读写权限的,如果只需要向容器内添加文件,不希望覆盖目录,需要注意源文件必须存在,否则会被当做一个目录bind mount给容器。
2)docker manager volume(docker自动管理):不需要指定源文件,只需要指定mount point(挂载点)。把容器里面的目录映射到了本地。
这种方式相比bind mount 缺点是无法限制对容器里边目录或文件的权限。
使用第二种挂载方式,-v 挂载时,不指定源文件位置,则默认挂载的路径是:
[ _data]# pwd /var/lib/docker/volumes/dd173640edd5b0205bb02f3c4139647be12528b38289b9f93f18123a6b1266a8/_data #当有目录挂载时,默认在/var/lib/docker/volumes/下会生成一串hash值,hash值下有一个_data的目录,容器内映射的文件就在此路径下。
首先创建一个volume container:
volume contianer的优点:
与bind mount相比,不必为每一容器指定源文件路径,所有路径都在volume container中定义好,容器只需与volume container关联,从而实现容器与host的解耦。
(1)创建volume container: 首先我在本地创建容器需要挂载的web网页目录: [ ~]# mkdir html [ ~]# echo "hello volume_data" > html/index.html
#我直接使用了两种挂载方式(基于busybox镜像来创建): [ ~]# docker create --name vc_data01 -v /root/html/:/usr/share/nginx/html -v /other/useful/tools/ busybox
注意:该vcdata01也为一个容器,但它的状态是create。
(3)基于volume container运行nginx容器: [ ~]# docker run -d --name test1 -p 80:80 --volumes-from vc_data01 nginx:latest
(4)访问nginx的默认网页:
查看映射到本地默认路径,会生成两个hash值,代表挂载了两个host path。
环境:两台dockerhost(centos7)
docker01:172.16.1.30
docker02:172.16.1.31
nfs服务器:172.16.1.40
nfs server:
[ ~]# yum -y install nfs-utils #安装nfs服务 [ ~]# yum -y install rpcbind #远程传输控制协议
[ ~]# vim /etc/exports
参数解释:
*:表示所有地址,也可以自定义ip地址,或者网段
rw:可读可写
sync:同步数据到磁盘
no_root_squash:加上这个选项后,root用户就会对共享的目录拥有至高的权限控制,就像是对本机的目录操作一样。
[ ~]# mkdir /nfs #创建共享目录 [ ~]# systemctl start rpcbind #先启动该服务 [ ~]# systemctl start nfs
docker01和dcoker02测试是否能够挂载:
docker01:
将本地目录挂载到nfs服务器上:
创建网页目录: [ ~]# mkdir html
[ ~]# vim /etc/fstab ##进入配置文件进行挂载
[ ~]# mount -a #重新加载使其生效 [ ~]# df -hT #查看磁盘信息
编写网页内容: [ ~]# echo "hello docker02" > html/index.html [ ~]# cat html/index.html hello docker02
运行nginx容器: [ ~]# docker run -d --name nginx01 -p 80:80 -v /root/html/:/usr/share/nginx/html nginx:latest
docker02:
挂载nfs:
[ ~]# mkdir html #创建挂载目录 [ ~]# vim /etc/fstab
[ ~]# mount -a #重新加载使其生效
//查看目录文件是否同步: [ ~]# cat html/index.html hello docker02
//运行nginx容器: [ ~]# docker run -d --name nginx02 -p 80:80 -v /root/html/:/usr/share/nginx/html nginx
访问nginx页面:
我们在docker01上修改nginx页面,测试docker02nginx页面是否同步:
[ ~]# echo "123456" > html/index.html nginx02再次访问: [ ~]# curl 127.0.0.1 123456
环境:两台dockerhost主机(centos7)
docker01:172.16.1.30
docker02:172.16.1.31
(1)docker01上创建目录文件: [ ~]# mkdir html [ ~]# echo "hello docker02" > html/index.html
(2)编写Dockerfile: [ ~]# vim Dockerfile
//构建dockerfile: [ ~]# docker build -t data:latest . #镜像名称自定义
(3)创建volume container并基于运行nginx容器: [ ~]# docker create --name vc_data02 data:latest [ ~]# docker run -d --name box1 -P --volumes-from vc_data02 nginx
访问nginx网页:
[ ~]# curl 127.0.0.1:32768
hello docker02
(4)将volume container镜像打包,并拷贝给docker02: [ ~]# docker save --output data.tar data:latest [ ~]# scp data.tar :/root/
docker02:
//导入镜像 [ ~]# docker load --input data.tar
//创建volume container: [ ~]# docker create --name vc_data03 data:latest
//基于container运行nginx: [ ~]# docker run -d --name box2 -P --volumes-from vc_data03 nginx:latest
最后访问nginx默认界面(确保与docker01上的nginx页面相同)
[ ~]# curl 127.0.0.1:32768 hello docker02
以上就是跨主机实现数据共享的多种方法,当然还有其他的方法,可能会在后续的博客中会写到。
———————— 本文至此结束,感谢阅读 ————————