Docker学习:容器间数据挂载与共享 | 远程共享挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)
前言
本讲是从Docker系列讲解课程,单独抽离出来的一个小节,主要介绍宿主、容器间数据共享,它的好处自然不言而喻,Tomcat集群就是这么玩儿的(多个tomcat服务,对应一套web应用)。
核心原理,在宿主机上开辟一片空间,各容器通过-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 sshcmd=root@192.168.31.110:/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
发现,可以在容器内部的挂载位置,看到宿主机的测试文件。
打开宿主机浏览器,访问容器。192.168.130:8080/test/index.html
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 exec -it tomcat2 /bin/bash #进入tomcat2容器内部
cat webapps/test/index.html #验证测试文件的变化
打开宿主机浏览器,访问容器。192.168.130:8080/test/index.html
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
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 sshcmd=root@192.168.31.130:/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地址写错了,肯定是挂了个寂寞!
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
5)扩展,反向把CentOS8.4当做宿主机,CentOS7.9当做远程主机也是可以的
具体实验不再复述,步骤和上面一模一样,仅仅是把创建共享数据时,把远程主机的IP换一下。感兴趣的小伙伴,可以自己实验一下。
注:tomcat5容器内部的端口是8080,run运行时通过-p,指定了对外暴露的端口是5000,所以访问时,应该访问宿主机CentOs8.4的IP+5000端口,即:http://192.168.31.130:5000/test/index.html
6)扩展,在容器内部通过sshfs访问远程目录
#安装依赖包(速度有点儿慢,需等待几分钟),安装文件准备完毕,需要手动输入Y,来确定一下
apt-get update && apt-get install sshfs #语法: sshfs remoteUserName@remoteHostIP:/remotePath /containerPath
sshfs root@192.168.31.130:/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 sshcmd=root@192.168.31.110:/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学习:容器间数据挂载与共享 | 远程共享挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)相关推荐
- Docker 学习之 Docker 容器数据卷
容器数据卷 什么是容器数据卷 docker 理念回顾 将应用和环境打包成一个镜像! 问题:数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化! 容器之前可以有一个数据共享技 ...
- Docker容器间网络通信
自从Docker容器出现以来,容器网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器网络通信又分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.Docker单主机容器通信 基 ...
- 能从入门到精通的 Docker 学习指南
原文链接:https://blog.opskumu.com/docker.html 作者:Kumu 这是一份我一直参考的 Docker 学习指南,最近感觉访问慢了很多,发在公众号里留作备份也分享给大家 ...
- 狂神docker学习笔记
狂神docker(基础+进阶)-学习笔记 狂神说docker 三体:弱小和无知不是生存的障碍,傲慢才是. 从基础到进阶,每个视频都有认真看,做笔记和练习,以此篇分享整个学习过程 画图网页 docker ...
- docker学习笔记(初阶)
笔记整理自狂神:Docker最新超详细版教程通俗易懂 Docker学习整体框架: Docker概述 Docker安装 Docker命令 镜像命令 容器命令 操作命令 Docker镜像! 容器数据卷! ...
- Docker学习笔记(狂神说)
目录 Docker 安装 Docker的基本组成 安装Docker 阿里云镜像加速 回顾HelloWorld流程 底层原理 Docker的常用命令 帮助命令 镜像命令 容器命令 常用其他命令 小结 作 ...
- 转,docker学习笔记
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- 非常详细的 Docker 学习笔记
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- 非常详细的Docker学习教程
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
最新文章
- MySQL开启远程连接权限
- v3 微信api 请求微信_企业微信API使用基本教程
- Joomla 2.5 中文语言包安装模板报错
- python 字节和字符串区别,Python中字节串和字符串,不是一个概念没有区别之分...
- Oracle数据库的命令工具sql*plus/sqlplus介绍
- ROS(Robot Operating System)笔记 : 2.创建并配置package
- 一级市场,退出有多难?
- 计算机绘图说课视频,机械图识读与计算机绘图说课PPT课件.ppt
- 驱动精灵修复服务器,驱动精灵一键修复系统组件工具
- 猜拳php代码,微信猜拳游戏源码
- 三星s8文档有html,【分享】你不知道的三星s8 : s8/s8+全面屏教程
- JavaEE|IO、存储、硬盘、文件系统相关常识
- 基于LSTM的股票预测模型_python实现_超详细
- java--案例:[Random]随机100-200的数、班级点名器、控制台输入三个数,输出最大值,或最小值?
- 为什么mysql不建议执行超过3表以上的多表关联查询?
- 查看jenkins端口linux,Jenkins修改端口号(成功率高)
- 最新CentOS7.5部署L版ceph 20190610及额外手册告警升级多活等
- 【引言集】 孔子:论语为政
- IOS .pch 文件详解
- Linux中用tar包配置samba,Linux建域使用samba(二)——安装Samba