Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)

前言

本讲是从Docker系列讲解课程,单独抽离出来的一个小节,主要介绍宿主、容器间数据共享,它的好处自然不言而喻,Tomcat集群就是这么玩儿的(多个tomcat服务,对应一套web应用)。 

Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第1张图片

核心原理,在宿主机上开辟一片空间,各容器通过-v挂载方式,都指向该宿主机的同一目录,一处修改,其他各处数据自动同步更新。

一、本地实现容器数据共享的两种方法

1.普通方式:通过docker run -v实现

格式:docker run --name 容器名 -v宿主机路径:容器内挂载路径 镜像名

#示例
docker run --name tomcat1  -v /usr/webapps:/usr/local/tomcat/webapps tomcat:latest 

注:这里的-v 是volumes 数据卷的意思,等价于--volumes。

有没有发现什么问题?

挂载点是固定的,宿主机的一个数据卷,往往要被多个容器挂载,如果能给-v后面的挂载目录起个别名,是不是很Nice?

当然可以!!

2.高端方式:创建共享容器

1)docker create -v 创建共享容器,并起别名

#仅仅是创建共享容器,该命令并不会直接run容器,尾部的 /bin/true没有实际意义,占位符而已
#-v 后面的宿主机路径和容器路径中间,用:隔开,路径都需要是绝对路径
docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true

2)docker run --volumes-from 指定共享容器 

docker run  -d --volumes-from webpage --name tomcat1  tomcat:latest
docker run  -d --volumes-from webpage --name tomcat2  tomcat:latest

这种方式,是不是 很beautiful?爽心悦目,感觉在使用java编程一样,抽取共用常量为final static。 

二、远程共享数据卷的使用

1.安装远程共享插件

docker plugin install --grant-all-permissions vieux/sshfs   #安装插件(会比较慢,需耐心等待一下)

注:不安装此插件,稍后会报error looking up volume plugin vieux/sshfs: plugin "vieux/sshfs" not found ,这个错误。

2.创建远程共享容器 sshvolume

docker volume create --driver vieux/sshfs\  #给容器指定远程驱动
 -o [email protected]:/root/myweb\ #远程主机的用户名、IP、共享目录
 -o allow_other\  #放开权限支持
 -o password='root'\ #远程主机密码
 remoteweb    #容器名称

docker volume ls #查看数据卷是否创建成功

3.使用远程共享容器 

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

4. docker exec -it 进入容器内部,查看是否挂载成功


至此,容器间数据共享,通过-v挂载实现,理论部分已经介绍完毕。由于知识点比较简单,脑子昏沉,思量一番,还是再坚持一下,分享给大家吧,如果是初次接触,建议实操一遍


三、实战环节

1.准备工作

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的界面!

2.普通方式通过-v直接挂载宿主机目录(示例)

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 

Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第2张图片

发现,可以在容器内部的挂载位置,看到宿主机的测试文件。

打开宿主机浏览器,访问容器。192.168.130:8080/test/index.html

Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第3张图片

3.本地共享容器挂载(示例)

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学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第4张图片

docker exec -it tomcat2 /bin/bash  #进入tomcat2容器内部
cat webapps/test/index.html    #验证测试文件的变化

打开宿主机浏览器,访问容器。192.168.130:8080/test/index.html 

 Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第5张图片

4.远程共享容器挂载(示例)

思路:宿主机CentOS7.9,IP 192.168.31.100,把数据卷共享目录挂载到另外一台主机CentOS8.4 IP为 192.168.31.130 (把CentOS8.4当做远程主机使用

1)用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学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第6张图片

2)在宿主机CentOS7.9上,创建远程挂载共享容器

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学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第7张图片

3)在宿主机启动新tomcat容器时,使用远程挂载点

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

4)浏览器访问使用了远程挂载点的容器tomcat3

注:tomcat3容器内部的端口是8080,run运行时通过-p,指定了对外暴露的端口是7000,所以访问时,应该访问宿主机CentOs7.9的IP+7000端口,即:http://192.168.31.100:7000/test/index.html

Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第8张图片

5)扩展,反向把CentOS8.4当做宿主机,CentOS7.9当做远程主机也是可以的

具体实验不再复述,步骤和上面一模一样,仅仅是把创建共享数据时,把远程主机的IP换一下。感兴趣的小伙伴,可以自己实验一下。

注:tomcat5容器内部的端口是8080,run运行时通过-p,指定了对外暴露的端口是5000,所以访问时,应该访问宿主机CentOs8.4的IP+5000端口,即:http://192.168.31.130:5000/test/index.html

Docker学习:容器间数据挂载与共享 | 远程共享&挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)_第9张图片

 6)扩展,在容器内部通过sshfs访问远程目录

#安装依赖包(速度有点儿慢,需等待几分钟),安装文件准备完毕,需要手动输入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 /自定义网络实现互认容器别名

你可能感兴趣的:(#,Docker,docker,容器,运维)