前言

本讲是从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(实战篇)相关推荐

  1. Docker 学习之 Docker 容器数据卷

    容器数据卷 什么是容器数据卷 docker 理念回顾 将应用和环境打包成一个镜像! 问题:数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化! 容器之前可以有一个数据共享技 ...

  2. Docker容器间网络通信

    自从Docker容器出现以来,容器网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器网络通信又分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.Docker单主机容器通信 基 ...

  3. 能从入门到精通的 Docker 学习指南

    原文链接:https://blog.opskumu.com/docker.html 作者:Kumu 这是一份我一直参考的 Docker 学习指南,最近感觉访问慢了很多,发在公众号里留作备份也分享给大家 ...

  4. 狂神docker学习笔记

    狂神docker(基础+进阶)-学习笔记 狂神说docker 三体:弱小和无知不是生存的障碍,傲慢才是. 从基础到进阶,每个视频都有认真看,做笔记和练习,以此篇分享整个学习过程 画图网页 docker ...

  5. docker学习笔记(初阶)

    笔记整理自狂神:Docker最新超详细版教程通俗易懂 Docker学习整体框架: Docker概述 Docker安装 Docker命令 镜像命令 容器命令 操作命令 Docker镜像! 容器数据卷! ...

  6. Docker学习笔记(狂神说)

    目录 Docker 安装 Docker的基本组成 安装Docker 阿里云镜像加速 回顾HelloWorld流程 底层原理 Docker的常用命令 帮助命令 镜像命令 容器命令 常用其他命令 小结 作 ...

  7. 转,docker学习笔记

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  8. 非常详细的 Docker 学习笔记

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  9. 非常详细的Docker学习教程

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

最新文章

  1. MySQL开启远程连接权限
  2. v3 微信api 请求微信_企业微信API使用基本教程
  3. Joomla 2.5 中文语言包安装模板报错
  4. python 字节和字符串区别,Python中字节串和字符串,不是一个概念没有区别之分...
  5. Oracle数据库的命令工具sql*plus/sqlplus介绍
  6. ROS(Robot Operating System)笔记 : 2.创建并配置package
  7. 一级市场,退出有多难?
  8. 计算机绘图说课视频,机械图识读与计算机绘图说课PPT课件.ppt
  9. 驱动精灵修复服务器,驱动精灵一键修复系统组件工具
  10. 猜拳php代码,微信猜拳游戏源码
  11. 三星s8文档有html,【分享】你不知道的三星s8 : s8/s8+全面屏教程
  12. JavaEE|IO、存储、硬盘、文件系统相关常识
  13. 基于LSTM的股票预测模型_python实现_超详细
  14. java--案例:[Random]随机100-200的数、班级点名器、控制台输入三个数,输出最大值,或最小值?
  15. 为什么mysql不建议执行超过3表以上的多表关联查询?
  16. 查看jenkins端口linux,Jenkins修改端口号(成功率高)
  17. 最新CentOS7.5部署L版ceph 20190610及额外手册告警升级多活等
  18. 【引言集】 孔子:论语为政
  19. IOS .pch 文件详解
  20. Linux中用tar包配置samba,Linux建域使用samba(二)——安装Samba

热门文章

  1. 阿里云国际站免实名免备案不限内容是不是骗人的?如何注册?怎么充值?
  2. Node.js —— 回调函数callback
  3. Spring中的getBean
  4. 国内目前有哪些可用的云平台?
  5. 关于协方差矩阵的概念及意义
  6. 水军网严正声明:我们不是网络打手,可解决就业问题
  7. 连接局域网内的打印机
  8. sed删除指定行的上一行
  9. python 生成手机号,并且验证手机号是否存在
  10. 简单几步解决苹果笔记本键盘打不了字的问题