Docker---数据卷容器(volumes-from容器间传递共享)

本文介绍了Docker数据卷容器的概念,它允许在容器之间共享和持久化数据。数据卷不受容器生命周期影响,可在多个容器间共享,且改动实时生效。通过示例展示了如何创建和继承数据卷容器,证明即使删除源容器,数据仍可被其他容器访问,实现了数据的共享和持久化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是数据卷容器
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

1:数据卷可以在容器之间共享或重用数据

2:数据卷中的更改可以直接生效

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止
以上来源:https://blog.csdn.net/weixin_40322495/article/details/84957433

前提:有一个镜像leyton/centos,并且有两个数据卷,如图所示:
在这里插入图片描述


案例:

  1. 启动一个父容器dc01,在dataVolumeContainer2上新增内容

docker run

docker-compose 搭建的lamp+redis 代码 附上docker-compose # 标准配置文件应该包含 version、services、networks 三大部分, # 其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则 # 指定版本号 version: '2' services: # 在 services 标签下的第二级标签是 console,这个名字是用户自己自定义,它就是服务名称。 console: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: console # 容器内置名称 hostname: console # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/console # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # volumes_from 从其它容器或者服务挂载数据卷, # 可选的参数是 :ro 或 :rw,前者表示容器只读,后者表示容器数据卷是可读可写的(默认情况为可读可写的)。 volumes_from: - php # 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式 # ,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统 volumes: # 使用绝对路径挂载数据卷 - /root/.ssh/:/root/.ssh/ # 类似于使用 docker run 的效果 我也不知道 不写因为console并不是直接启动导致镜像不会产生 tty: true # web,这个名字是用户自己自定义,它就是服务名称。 web: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: web # 容器内置名称 hostname: web # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/nginx # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # 映射端口 ports: - '80:80' # 此选项解决了启动顺序的问题 这个的意思是必须在php启动以后才能启动 # 注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时, # 也会启动 php 服务,因为在配置文件中定义了依赖关系 depends_on: - php # volumes_from 从其它容器或者服务挂载数据卷volumes_from: - php volumes: # 已经存在的命名的数据卷 - nginx-log:/var/log/nginx # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器 - ./images/nginx/sites-enabled:/etc/nginx/sites-enabled - ./images/nginx/cert:/etc/nginx/cert # 加入指定网络 networks: default: # 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器 aliases: - web.sunchanghao.top - mid.sunchanghao.top - sevice.sunchanghao.top - admin.sunchanghao.top # php,这个名字是用户自己自定义,它就是服务名称。 php: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: php # 容器内置名称 hostname: php # 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile, # 在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile # 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器 build: # context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url # 当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context context: ./images/php # 使用此 dockerfile 文件来构建,必须指定构建路径 dockerfile: Dockerfile # 挂载一个目录或者一个已存在的数据卷容器volumes: # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器- ./app:/mnt/app # db,这个名字是用户自己自定义,它就是服务名称。 db: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: db # 容器内置名称 hostname: db # 从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID image: mysql:5.7 environment: MYSQL_USER: 'sch' MYSQL_PASS: '1111' MYSQL_ROOT_PASSWORD: 'root' volumes: - db:/var/lib/mysql ports: - '3306:3306' redis: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: redis # 容器内置名称 hostname: redis # image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 image: redis:3.2.7 # 设置端口号 ports: - '6379:6379' # 挂载一个目录或者一个已存在的数据卷容器 volumes: # 已经存在的命名的数据卷- redis:/data # node volumes: nginx-log: # 设置volume的驱动,默认是local. driver: local db: driver: local redis: driver: local
<think>嗯,用户让我写一个docker-compose脚本来搭建Hadoop、Hive、Spark、Flink、Zookeeper和Sqoop。首先,我需要回忆这些组件之的关系和依赖。比如,Hadoop需要HDFS和YARN,可能需要多个容器,比如namenode和datanode。Hive需要元数据存储,通常用MySQL或者PostgreSQL,所以可能需要一个数据库服务。Spark和Flink可能需要访问Hadoop,所以需要配置HADOOP_CONF_DIR之类的环境变量。Zookeeper通常是独立的,但如果有其他服务依赖它,比如Kafka,不过用户没提Kafka,可能这里只是单独部署。Sqoop需要连接到Hadoop和关系型数据库,所以可能需要JDBC驱动。 然后,我得考虑各个服务的版本兼容性。比如Hadoop 3.x,Hive 3.x,Spark 3.x,Flink 1.x,这些版本之是否兼容?比如Hive和Hadoop的版本是否匹配,Spark是否支持对应的Hadoop版本。可能需要查一下官方文档,确认兼容性,但用户可能希望一个通用的例子,所以暂时选较新的版本。 网络配置方面,需要让这些服务在同一个Docker网络中,以便通过服务名互相访问。比如Hive需要访问MySQL,Hadoop的namenode和datanode之通信,Spark和Flink提交作业到YARN或者独立集群。 接下来是各个服务的Docker镜像选择。Hadoop、Hive、Spark、Flink都有官方镜像,但可能需要自定义,比如安装额外的组件。比如Hive可能需要将hive-site.xml配置好,连接到MySQL的元数据存储。Sqoop的官方镜像可能较少,可能需要自己构建或者找社区提供的镜像。 然后考虑启动顺序,比如MySQL需要先启动,然后Hive,因为它依赖元数据库。Zookeeper可能需要先启动,但如果没有其他服务依赖它,可能可以并行启动。Hadoop的namenode可能需要先于datanode启动,或者使用健康检查等待。 接下来是具体的docker-compose.yml结构。每个服务定义,包括镜像、环境变量、卷挂载(配置文件)、端口映射、依赖关系。比如Hadoop可能需要暴露9000端口给其他服务访问HDFS。Hive的HiveServer2可能需要10000端口。Spark可能需要8080的Web UI,Flink同样需要Web端口。Zookeeper需要2181端口。 可能遇到的问题包括配置文件的同步,比如core-site.xml、hdfs-site.xml、yarn-site.xml等,需要在各个Hadoop相关容器中保持一致。可以通过volumes将本地配置文件挂载到容器中,或者使用环境变量生成配置文件。 Hive的配置需要指向MySQL,所以在hive-site.xml中需要JDBC URL,用户名密码,这些可以通过环境变量传递。可能需要初始化数据库,比如运行schematool -initSchema,这可能需要作为启动命令的一部分,或者使用entrypoint脚本。 Sqoop的配置可能需要连接到Hadoop和关系型数据库,所以需要Hadoop的配置文件和JDBC驱动。可能需要在Sqoop容器中安装对应的驱动,比如MySQL的JDBC驱动,可以通过卷挂载或者Dockerfile安装。 资源限制方面,这些服务可能比较吃内存,所以需要给每个容器分配足够的内存,否则可能启动失败。比如Hadoop的namenode和datanode可能需要至少2GB内存,其他服务同理。 另外,用户可能希望这些服务能够互相协作,比如使用Hive Metastore,Spark和Flink能够读取Hive的表。因此需要确保Hive的Metastore服务正确配置,并且被其他服务访问到。 总结步骤:确定各个服务的镜像和配置,编写docker-compose.yml,处理服务依赖和网络,配置文件的挂载,环境变量的设置,启动命令的调整,可能还需要初始化数据库和Hadoop的格式化。 需要检查是否有现成的Docker镜像可用,或者是否需要自定义Dockerfile。比如,如果官方镜像没有包含所需组件,可能需要自己构建。例如,Sqoop可能需要基于Hadoop镜像来构建,包含Sqoop的安装。 最后,测试整个docker-compose,确保所有服务正常启动,并且能够互相访问。比如,HDFS能够上传文件,Hive可以创建表,Spark可以提交作业,Flink可以运行任务,Sqoop能够导入导出数据。</think>以下是一个集成Hadoop、Hive、Spark、Flink、Zookeeper和Sqoop的`docker-compose.yml`示例。请注意,实际部署时可能需要根据版本兼容性和资源配置进行调整: ```yaml version: '3.8' services: # ZooKeeper 服务 zookeeper: image: zookeeper:3.8 ports: - "2181:2181" networks: - hadoop-net # Hadoop集群 namenode: image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 environment: - CLUSTER_NAME=hadoop-cluster volumes: - "9870:9870" # Web UI - "9000:9000" # HDFS networks: - hadoop-net datanode: image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 environment: - SERVICE_PRECONDITION=namenode:9000 volumes: - hadoop_datanode:/hadoop/dfs/data depends_on: - namenode networks: - hadoop-net # Hive元数据存储(MySQL) hive-metastore-db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: hive MYSQL_DATABASE: metastore volumes: - mysql_data:/var/lib/mysql networks: - hadoop-net # Hive服务 hive-server: image: bde2020/hive:2.3.2-postgresql-metastore environment: SERVICE_PRECONDITION: "namenode:9000 datanode:9864 hive-metastore-db:3306" HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: jdbc:mysql://hive-metastore-db/metastore HIVE_CORE_CONF_javax_jdo_option_ConnectionDriverName: com.mysql.jdbc.Driver HIVE_CORE_CONF_javax_jdo_option_ConnectionUserName: root HIVE_CORE_CONF_javax_jdo_option_ConnectionPassword: hive depends_on: - "10000:10000" # HiveServer2 networks: - hadoop-net # Spark spark: image: bitnami/spark:3.3 environment: - SPARK_MODE=master - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_LOCAL_STORAGE_ENABLED=no ports: - "8080:8080" # Web UI depends_on: - namenode networks: - hadoop-net # Flink flink-jobmanager: image: flink:1.17-scala_2.12 ports: - "8081:8081" command: jobmanager environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: flink-jobmanager networks: - hadoop-net # Sqoop(需要自定义镜像) sqoop: image: my-custom-sqoop:latest # 需预先构建包含Hadoop和JDBC驱动的镜像 depends_on: - namenode - hive-metastore-db networks: - hadoop-net volumes: hadoop_namenode: hadoop_datanode: mysql_data: networks: hadoop-net: driver: bridge ``` **注意事项及使用说明**: 1. **镜像说明**: - Hadoop/Hive使用BDE2020维护的镜像 - Spark使用Bitnami镜像 - Flink使用官方镜像 - Sqoop需要自定义镜像(需包含Hadoop环境和JDBC驱动) 2. **初始化步骤**: ```bash # 格式化HDFS docker-compose exec namenode hdfs namenode -format # 初始化Hive元数据库 docker-compose exec hive-server schematool -dbType mysql -initSchema # 创建HDFS目录 docker-compose exec namenode hdfs dfs -mkdir /tmp docker-compose exec namenode hdfs dfs -chmod 777 /tmp ``` 3. **服务访问**: - HDFS Web UI: http://localhost:9870 - Spark Web UI: http://localhost:8080 - Flink Web UI: http://localhost:8081 - HiveServer2: jdbc:hive2://localhost:10000 4. **扩展建议**: - 添加ResourceManager/Nodemanager实现完整YARN集群 - 配置Hive Metastore为独立服务 - 增加更多DataNode实现分布式存储 - 添加HistoryServer收集任务日志 5. **自定义构建**(Sqoop示例): ```Dockerfile FROM bde2020/hadoop-base:2.0.0-hadoop3.2.1-java8 RUN apt-get update && apt-get install -y sqoop \ && wget -P /usr/lib/sqoop/lib/ https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar ``` 该配置实现了基础的大数据组件集成,实际生产部署需要根据具体需求调整资源配置和安全设置。建议通过共享卷挂载自定义配置文件(core-site.xml, hive-site.xml等)实现更精细的控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秒不可闫M先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值