Docker(三) 容器间及其容器和宿主间数据共享

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
数据可视化DataV,5个大屏 1个月
简介: Docker(三) 容器间及其容器和宿主间数据共享

一、概念



1.数据卷


概念:是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:


  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改会直接生效
  3. 对数据卷的更新,不会影响镜像
  4. 数据卷会一直存在,直到没有容器使用
  5. 数据卷可以独立于容器存在


作用:

  1. 容器的持久化
  2. 容器间继承和数据共享


2. 数据卷容器


概念:其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的


图1-2 数据卷容器


  1. 数据卷容器没有直接管理或控制数据卷,只是其它容器使用数据卷的桥梁(提供数据卷信息)。
  2. 如果删除了挂载的容器,数据卷并不会被自动删除。
  3. 如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。
  4. 可以使用数据卷容器来备份、恢复和迁移数据卷。
  5. 数据卷容器的运行与否,并不影响其他容器对数据卷的使用

作用:

  1. 对数据卷进行归类和汇总
  2. 管理容器与数据卷之间的对应关系
  3. 合理地控制数据卷的生命周期


二、操作方法



1. 添加数据卷

  1. 通过docker -v命令添加数据卷:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
  1. 添加数据卷并查看容器是否启动
[root@localhost ~]# docker run -d --name tomcat -p 8080:8080 -v /opt/infosec/webapps:/usr/local/tomcat/webapps tomcat
d3ff98bb54c00f6f177469cc165319483997400ee382a870b06ca4353168db6b
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
d3ff98bb54c0        tomcat              "catalina.sh run"   5 seconds ago       Up 4 seconds        0.0.0.0:8080->8080/tcp   tomcat


  1. 检查宿主机中是否创建webapps目录,并添加一个host.txt文件
[root@localhost ~]# ls /opt/infosec/
webapps
[root@localhost ~]# cd /opt/infosec/webapps/
[root@localhost webapps]# ll
total 0
[root@localhost webapps]# touch host.txt
[root@localhost webapps]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 29 11:03 host.txt


  1. 进入到容器目录,检查host.txt文件是否存在,容器中创建container.txt检查宿主机是否存在
[root@localhost webapps]# docker exec -it tomcat /bin/bash
root@d3ff98bb54c0:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18982 Jun  3 17:13 BUILDING.txt
-rw-r--r--. 1 root root  5409 Jun  3 17:13 CONTRIBUTING.md
-rw-r--r--. 1 root root 57092 Jun  3 17:13 LICENSE
-rw-r--r--. 1 root root  2333 Jun  3 17:13 NOTICE
-rw-r--r--. 1 root root  3255 Jun  3 17:13 README.md
-rw-r--r--. 1 root root  6898 Jun  3 17:13 RELEASE-NOTES
-rw-r--r--. 1 root root 16262 Jun  3 17:13 RUNNING.txt
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 bin
drwxr-xr-x. 1 root root    21 Jun 29 15:02 conf
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 lib
drwxrwxrwx. 1 root root  4096 Jun 29 15:02 logs
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 native-jni-lib
drwxrwxrwx. 2 root root    29 Jun 10 08:17 temp
drwxr-xr-x. 2 root root    21 Jun 29 15:03 webapps
drwxr-xr-x. 7 root root    76 Jun  3 17:11 webapps.dist
drwxrwxrwx. 2 root root     6 Jun  3 17:10 work
root@d3ff98bb54c0:/usr/local/tomcat# cd webapps
root@d3ff98bb54c0:/usr/local/tomcat/webapps# ls -l
total 0
-rw-r--r--. 1 root root 0 Jun 29 15:03 host.txt
root@d3ff98bb54c0:/usr/local/tomcat/webapps# touch container.txt
root@d3ff98bb54c0:/usr/local/tomcat/webapps# ls -l
total 0
-rw-r--r--. 1 root root 0 Jun 29 15:04 container.txt
-rw-r--r--. 1 root root 0 Jun 29 15:03 host.txt


  1. 检查主机文件夹是否存在container.txt
[root@localhost opt]# ls /opt/infosec/webapps/
container.txt  host.txt


  1. 小结:
  1. 数据卷确实达到了容器和宿主机之间的数据共享
  2. 容器重要数据的持久化(移除tomcat容器,数据卷依然存在)
  3. tomcat的webapp目录文件经常需要变动,软件开发文笔需要打成war包部署在tomcat里面,可以立即生效(也可以是配置文件,方便维护)


  1. 通过dockerfile添加数据卷
  1. 在宿主机目录上创建dokcerfile,内容如下:


FROM tomcat
VOLUME /opt/volumebyfile/webapps:/usr/local/tomcat/webapps
CMD /bin/bash


dockerfile相当于linux的shell的脚本,用来构建docker镜像。其语法下次将会详细讲解。


2. 在dockerfile的基础上build镜像


[root@localhost docker]# docker build -f /opt/docker/dockerfile -t datavolume/centos
"docker build" requires exactly 1 argument(s).
See 'docker build --help'.
Usage:  docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
[root@localhost docker]# docker build -f /opt/docker/dockerfile -t datavolume/centos .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM centos
 ---> 831691599b88
Step 2/3 : VOLUME /opt/volumebyfile/webapps:/usr/local/tomcat/webapps
 ---> Running in 34c582704242
 ---> a9c9db5e0aff
Removing intermediate container 34c582704242
Step 3/3 : CMD /bin/bash
 ---> Running in b77071cd1e11
 ---> 0214e692df2c
Removing intermediate container b77071cd1e11
Successfully built 0214e692df2c


  1. 运行datavolume/centos,检查数据卷是否挂载成功


[root@localhost docker]# docker run -it datavolume/centos
[root@localhost docker]# docker inspect
"Mounts": [
            {
                "Type": "volume",
                "Name": "98f46be0880f6308d5d1dac4c940811da981c04cbef0f97954ce2b6d68d09445",
                "Source": "/var/lib/docker/volumes/98f46be0880f6308d5d1dac4c940811da981c04cbef0f97954ce2b6d68d09445/_data",
                "Destination": "/opt/volumebyfile/webapps:/usr/local/tomcat/webapps",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],


从上面可以看出数据卷挂载成功。

  1. 通过继承数据卷容器来挂载数据卷


  1. 创建数据卷容器tomcat01_db_data


[root@localhost docker]# docker run -d -v /opt/volumes/webapps:/usr/local/tomcat/webapps --name tomcat01_db_data tomcat echo Data-only container for tomcat
7cd071fab7f8382834fe9d71018ab62d9d87c784de36402cf014f772ac1ed249


你一定会怀疑为啥不爆露端口?因为数据卷容器根本你不需要启动,只需要给其它容器提供数据卷信息,所以启动了也是浪费资源,不需要暴露端口


  1. 然后使用--volumes-from让其它容器挂载数据卷容器的数据卷


[root@localhost docker]# docker run -d --name tomcat02 -p 8082:8080 --volumes-from tomcat01_db_data tomcat
c93393e2ebd8de49d018c7f8a344a53938c916b43b28663b8abec79dffe18609


  1. 查看是否挂载成功数据卷


[root@localhost docker]# docker exec -it tomcat02 /bin/bash
root@c93393e2ebd8:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18982 Jun  3 17:13 BUILDING.txt
-rw-r--r--. 1 root root  5409 Jun  3 17:13 CONTRIBUTING.md
-rw-r--r--. 1 root root 57092 Jun  3 17:13 LICENSE
-rw-r--r--. 1 root root  2333 Jun  3 17:13 NOTICE
-rw-r--r--. 1 root root  3255 Jun  3 17:13 README.md
-rw-r--r--. 1 root root  6898 Jun  3 17:13 RELEASE-NOTES
-rw-r--r--. 1 root root 16262 Jun  3 17:13 RUNNING.txt
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 bin
drwxr-xr-x. 1 root root    21 Jun 29 16:01 conf
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 lib
drwxrwxrwx. 1 root root  4096 Jun 29 16:01 logs
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 native-jni-lib
drwxrwxrwx. 2 root root    29 Jun 10 08:17 temp
drwxr-xr-x. 2 root root     6 Jun 29 15:59 webapps
drwxr-xr-x. 7 root root    76 Jun  3 17:11 webapps.dist
drwxrwxrwx. 2 root root     6 Jun  3 17:10 work
root@c93393e2ebd8:/usr/local/tomcat# cd webapps
root@c93393e2ebd8:/usr/local/tomcat/webapps# ls -l
total 0
root@c93393e2ebd8:/usr/local/tomcat/webapps# touch container.txt
root@c93393e2ebd8:/usr/local/tomcat/webapps# exit
exit
[root@localhost docker]# ls -l /opt/volumes/webapps/
total 0
-rw-r--r--. 1 root root 0 Jun 29 12:06 container.txt


说明可以通过继承数据卷容器来给容器添加数据卷

相关实践学习
Github实时数据分析与可视化
基于Github Archive公开数据集,将项目、行为等20+种事件类型数据实时采集至Hologres进行分析,并搭建可视化大屏。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
目录
相关文章
|
9天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
9天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
25 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
1天前
|
持续交付 开发者 Docker
掌握 Docker:容器化技术在现代开发中的应用
Docker 是一个开源容器化平台,使开发者能够将应用程序及其依赖项封装在轻量级容器中,确保跨平台的一致性。本文介绍了 Docker 的基本概念、核心组件及优势,并展示了其在快速部署、一致性、可移植性和微服务架构中的应用。通过示例说明了 Docker 在本地开发环境搭建、服务依赖管理和 CI/CD 流程中的作用,以及多阶段构建、资源限制和网络模式等高级特性。掌握 Docker 可大幅提升开发效率和应用管理能力。
|
6天前
|
运维 安全 开发者
Docker容器技术
Docker容器技术
28 6
|
6天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
6天前
|
负载均衡 大数据 测试技术
docker容器技术有哪些应用场景?
docker容器技术有哪些应用场景?
19 5
|
14天前
|
Cloud Native 持续交付 Docker
云原生之旅:Docker容器化实战指南
【8月更文挑战第29天】本文将引领你进入云原生技术的世界,以Docker容器化为切入点,深入浅出地介绍如何利用Docker进行应用的打包、部署及管理。我们将通过实际代码示例,一步步展示Docker镜像的构建过程,以及如何运行和管理这些容器。无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的知识和实操经验。
|
9天前
|
应用服务中间件 nginx Docker
Docker同一台宿主机容器通信-通过容器名称互联
本文详细介绍了如何通过容器名称实现同一宿主机上容器间的互联,并提供了实战案例。首先,文章解释了容器间通过自定义名称访问的原理,随后演示了创建并连接Tomcat与Nginx容器的具体步骤。此外,还讨论了配置中可能出现的问题及解决方案,包括避免硬编码IP地址和使用自定义容器别名来增强系统的灵活性与可维护性。通过这些实践,展示了如何高效地配置容器间通信,确保服务稳定可靠。
16 1
Docker同一台宿主机容器通信-通过容器名称互联
|
9天前
|
存储 Unix 虚拟化
Docker容器简介
Docker是一种轻量级的虚拟化技术,它通过容器化应用,提高了硬件资源利用率,简化了应用的部署、运输和运行,且与虚拟机相比,具有更快的交付速度和更低的资源消耗。
24 2
|
15天前
|
存储 安全 Ubuntu
Docker 镜像与 Docker 容器的区别
【8月更文挑战第27天】
56 5