本讲是从Docker系列讲解课程,单独抽离出来的一个小节,主要介绍宿主、容器间数据共享,它的好处自然不言而喻,Tomcat集群就是这么玩儿的(多个tomcat服务,对应一套web应用)。
核心原理,在宿主机上开辟一片空间,各容器通过-v挂载方式,都指向该宿主机的同一目录,一处修改,其他各处数据自动同步更新。
格式:docker run --name 容器名 -v宿主机路径:容器内挂载路径 镜像名
#示例
docker run --name tomcat1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat:latest
注:这里的-v 是volumes 数据卷的意思,等价于--volumes。
有没有发现什么问题?
挂载点是固定的,宿主机的一个数据卷,往往要被多个容器挂载,如果能给-v后面的挂载目录起个别名,是不是很Nice?
当然可以!!
#仅仅是创建共享容器,该命令并不会直接run容器,尾部的 /bin/true没有实际意义,占位符而已
#-v 后面的宿主机路径和容器路径中间,用:隔开,路径都需要是绝对路径
docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true
docker run -d --volumes-from webpage --name tomcat1 tomcat:latest
docker run -d --volumes-from webpage --name tomcat2 tomcat:latest
这种方式,是不是 很beautiful?爽心悦目,感觉在使用java编程一样,抽取共用常量为final static。
docker plugin install --grant-all-permissions vieux/sshfs #安装插件(会比较慢,需耐心等待一下)
注:不安装此插件,稍后会报error looking up volume plugin vieux/sshfs: plugin "vieux/sshfs" not found ,这个错误。
docker volume create --driver vieux/sshfs\ #给容器指定远程驱动
-o [email protected]:/root/myweb\ #远程主机的用户名、IP、共享目录
-o allow_other\ #放开权限支持
-o password='root'\ #远程主机密码
remoteweb #容器名称
docker volume ls #查看数据卷是否创建成功
docker run -d -it --name tomcat3 \
--mount src=remoteweb,target=/app,type=volume,volume-driver=vieux/sshfs \
-p 7000:8080 \
tomcat:8.5.46-jdk8-openjdk
至此,容器间数据共享,通过-v挂载实现,理论部分已经介绍完毕。由于知识点比较简单,脑子昏沉,思量一番,还是再坚持一下,分享给大家吧,如果是初次接触,建议实操一遍!
docker rm -f $(docker ps -aq) #实验前先清场(清理无关容器)
注:是否清场,你自己决定,不影响下面的试验就好。
cd /
mkdir -p webapps/test #在宿主机上创建挂载目录
cd webapps/test && echo "hello I'm succ" >>index.html #创建测试文件
cat index.html
在宿主机下,准备测试目录及其数据 。
注意:不要把index.html创建在webapps根目录下,把它创建在一个文件夹内,比如当前的test内,否则稍后访问时可能访问不到index.html,而是得到一个404的界面!
tomcat本次对外暴露端口8080
docker run -d --name tomcat0 -v /root/webapps:/usr/local/tomcat/webapps -p 8080:8080 tomcat:8.5.46-jdk8-openjdk #通过-v把宿主目录挂载到指定位置
docker exec -it tomcat0 /bin/bash #进入容器内部
ls webapps/test/ #查看挂载目录数据
cat webapps/test/index.html
发现,可以在容器内部的挂载位置,看到宿主机的测试文件。
打开宿主机浏览器,访问容器。192.168.130:8080/test/index.html
tomcat本次对外暴露端口8000
ls
echo "good study,day day up!" >> test/index.html #向网页中,写入新数据
docker create --name webpage -v /root/webapps:/usr/local/tomcat/webapps tomcat:8.5.46-jdk8-openjdk /bin/true #创建挂载容器
docker run -d --name tomcat2 --volumes-from webpage -p 8000:8080 tomcat:8.5.46-jdk8-openjdk #挂载共享容器,并以8000端口启动
docker exec -it tomcat2 /bin/bash #进入tomcat2容器内部
cat webapps/test/index.html #验证测试文件的变化
打开宿主机浏览器,访问容器。192.168.130:8080/test/index.html
思路:宿主机CentOS7.9,IP 192.168.31.100,把数据卷共享目录挂载到另外一台主机CentOS8.4 IP为 192.168.31.130 (把CentOS8.4当做远程主机使用)
cd /root
mkdir -p myweb/test #创建并进入测试目录
cd myweb/test/
echo "this is a remote meachine /br Test successful" >> index.html #创建网页,并写入数据
cat index.html
this is a remote meachine /br Test successful
docker plugin install --grant-all-permissions vieux/sshfs #安装远程插件(有点儿慢,需要稍微等待一下)
docker rm -f $(docker ps -qa) #清空闲杂容器
docker ps -a
docker volume ls #创建数据卷前,先查看列表
docker volume create --driver vieux/sshfs -o [email protected]:/root/myweb -o allow_other -o password='root' remoteweb #创建远程共享数据卷
docker volume ls #查看数据卷是否创建成功
温馨提示:本步骤,在你写远程主机的IP时,一定要写对,否则在下个步骤运行Tomcat容器时,会报错误: docker: Error response from daemon: error while mounting volume '': VolumeDriver.Mount: sshfs command execute failed: exit status 1 (read: Connection reset by peer).,什么意思呢?就是说,你挂载远程共享数据挂了个寂寞,error while mounting volume '',数据是空的“”,IP地址写错了,肯定是挂了个寂寞!
docker ps -a
#在别名为tomcat3的容器启动时,指定远程数据卷名称,并指定容器的挂载目录
docker run -d --name tomcat3 -p 7000:8080 --mount src=remoteweb,target=/usr/local/tomcat/webapps,type=volume,volume-driver=vieux/sshfs tomcat:8.5.46-jdk8-openjdk
#查容器的挂载目录数据
docker exec -it tomcat3 /bin/bash
ls webapps/test
cat webapps/test/index.html
注:tomcat3容器内部的端口是8080,run运行时通过-p,指定了对外暴露的端口是7000,所以访问时,应该访问宿主机CentOs7.9的IP+7000端口,即:http://192.168.31.100:7000/test/index.html
具体实验不再复述,步骤和上面一模一样,仅仅是把创建共享数据时,把远程主机的IP换一下。感兴趣的小伙伴,可以自己实验一下。
注:tomcat5容器内部的端口是8080,run运行时通过-p,指定了对外暴露的端口是5000,所以访问时,应该访问宿主机CentOs8.4的IP+5000端口,即:http://192.168.31.130:5000/test/index.html
#安装依赖包(速度有点儿慢,需等待几分钟),安装文件准备完毕,需要手动输入Y,来确定一下
apt-get update && apt-get install sshfs
#语法: sshfs remoteUserName@remoteHostIP:/remotePath /containerPath
sshfs [email protected]:/root/myweb /root/test #输入该命令后,需要重复输入密码
cd /root/test #进入容器的挂载目录,即查看到远程的目录&文件
本讲知识点相对比较简单,就是通过-v通过挂载,实现各容器的数据共享。本文主要是站在宿主机的角度,提供两种解决思路:
1、直接-v挂载;
2、先docker create -v 创建共享容器,然后通过docker run --volumes-from 挂载共享容器。
当然,在实际工作环境中,往往挂载的不是宿主机,而是其他主机或者远程服务器。此方法依然适用,仅仅是是在创建共享容器时,稍微做些改动即可。
docker volume create --driver vieux/sshfs -o [email protected]:/root/myweb -o allow_other -o password='root' remoteweb
本讲内容是从 Docker入门到进阶里面抽离出来的内容,尽管知识点比较简单,也是docker学习路上不可或缺的一部分。希望对大家有所帮助,同时也感谢大家的支持和点赞。
不当之处,望批评指正,前进的路上,我们一起砥砺前行!
最后,附注上你可能感兴趣的内容,送给爱学习的你,为你鼓掌、加油
1、Docker容器 | Dockerfile优化
2、Docker容器的生命周期 | kill和stop | pause 和 unpause
3、 Docker容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解
4、容器之间单/双向通信 |--link /自定义网络实现互认容器别名