Docker 与 K8S学习笔记(十 二)容器间数据共享

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host、容器与容器之间共享数据。 一、容器与host共享数据 在上一篇中介绍到的bind mount和docker manage volume,它们都可以实现容器与host之间共享数据,只是方式有所区别,bind moun

Docker 与 K8S学习笔记(十 二)容器间数据共享


数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host、容器与容器之间共享数据。

 

一、容器与host共享数据


在上一篇中介绍到的bind mount和docker manage volume,它们都可以实现容器与host之间共享数据,只是方式有所区别,bind mount在容器启动前便指定了volume所在host数据目录,并挂载到容器中了,容器启动后,我们向此目录写入数据,容器也能使用这些数据,而对于docker manage volume,有所不同,它在容器启动时才能确定volume所在host的目录,所以这里就需要用到docker cp 命令,它可以在容器和host之间复制数据。


$ sudo docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
0320b31996408b61a1bc363f999509f3bfdc17ca292dd08bd5f7496edb7c8947
$ sudo docker cp ~/htdocs/index.html 0320b31996:/usr/local/apache2/htdocs
$ curl http://127.0.0.1:80
<h1>update page</h1>

 

二、容器之间共享数据


1、bind mount


第一种方式还是bind mount,将要共享的数据通过bind mount挂载到多个容器上,例如,我们启动三个httpd容器,并让它们挂载相同的htdocs。


$ sudo docker run --name web1 -d -p 80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
f5a911434445f431d511b5292112fe0f9b9b44b868f98561feba895107e0cb40
$ sudo docker run --name web2 -d -p 80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
61e43e584c33efdab7ef5c1a72a5a4e9a0d40731d860e5fd9fb23de0a7c767df
$ sudo docker run --name web3 -d -p 80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
6494f68481a0f1971fdc33c13b969706c69b8ecaedc39aa707b6d35d32b6fba0
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                                     NAMES
6494f68481a0   httpd     "httpd-foreground"   11 seconds ago   Up 9 seconds    0.0.0.0:49155->80/tcp, :::49155->80/tcp   web3
61e43e584c33   httpd     "httpd-foreground"   19 seconds ago   Up 17 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp   web2
f5a911434445   httpd     "httpd-foreground"   28 seconds ago   Up 27 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   web1
$ curl http://127.0.0.1:49155
<h1>hello docker</h1>
$ curl http://127.0.0.1:49154
<h1>hello docker</h1>
$ curl http://127.0.0.1:49153
<h1>hello docker</h1>


2、volume container


volume container是专门为其他容器提供volume的容器,它提供的volume可以是bind mount也可以是docker manage volume,我们首先创建一个volume container:


$ sudo docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/useful/tools busybox
178dd66f492dbe0485816a9f6f9ecde97c03e322841e6b38f4a2c7c439c6f020


我们挂载了两个volume,一个是使用bind mount挂载web静态页面,另一个使用docker manage volume挂载常用工具。注意我们使用docker create命令,这是因为volume container的作用只是提供数据,它本身不需要处于运行状态。


通过docker inspect可以看到这两个volume:


$ sudo docker inspect vc_data
[
   ...
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/yangye/htdocs",
                "Destination": "/usr/local/apache2/htdocs",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "e3ba7240ef18694660ed3da4e6976fa35bb5c2d3c26f91593ea30d26289e0fd6",
                "Source": "/var/lib/docker/volumes/e3ba7240ef18694660ed3da4e6976fa35bb5c2d3c26f91593ea30d26289e0fd6/_data",
                "Destination": "/other/useful/tools",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ...
 ]


接着我们在启动容器时通过--volumes_from使用刚创建的vc_data:


$ sudo docker run --name web1 -d -p 80 --volumes-from vc_data httpd
14131cc7057528ac892b2661ed46e543bb30b65af789d83f0770dab4ebb06a33
$ sudo docker run --name web2 -d -p 80 --volumes-from vc_data httpd
320a11bcb64ee032c65b65ee744a7afd6ebc7a24330e68c688a4b9c4b5e5eb22
$ sudo docker run --name web3 -d -p 80 --volumes-from vc_data httpd
f4c4bed873f3ad76b37136fc93dd915c6e4915897e7628f3b1ca1d5fc30e920a


我们以web1为例看看它的volume是否正确:


$ sudo docker inspect web1
[
   ...
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/yangye/htdocs",
                "Destination": "/usr/local/apache2/htdocs",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "e3ba7240ef18694660ed3da4e6976fa35bb5c2d3c26f91593ea30d26289e0fd6",
                "Source": "/var/lib/docker/volumes/e3ba7240ef18694660ed3da4e6976fa35bb5c2d3c26f91593ea30d26289e0fd6/_data",
                "Destination": "/other/useful/tools",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ...


可见,web1使用的就是vc_data的volume,我再来验证下数据共享的效果:


$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                                     NAMES
f4c4bed873f3   httpd     "httpd-foreground"   10 minutes ago   Up 10 minutes   0.0.0.0:49158->80/tcp, :::49158->80/tcp   web3
320a11bcb64e   httpd     "httpd-foreground"   10 minutes ago   Up 10 minutes   0.0.0.0:49157->80/tcp, :::49157->80/tcp   web2
14131cc70575   httpd     "httpd-foreground"   10 minutes ago   Up 10 minutes   0.0.0.0:49156->80/tcp, :::49156->80/tcp   web1
$ curl http://127.0.0.1:49158
<h1>hello docker</h1>
$ curl http://127.0.0.1:49157
<h1>hello docker</h1>
$ curl http://127.0.0.1:49156
<h1>hello docker</h1>


三个容器都共享了volume_container中的volume,相比于bind mount,我们发现volume container具备以下特点:


1)不必为每一个容器指定host path,所有path都在volume container中定义好了,容器只需和volume container关联,实现了容器与host的解耦;


2)使用volume container的容器,其mount point都是一致的,有利于配置的规范和标准化,当然这样也存在一定的局限使用时需要综合考虑。


分类: 容器技术

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
13天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes 入门指南:快速上手容器编排
【8月更文第29天】Kubernetes(简称 K8s)是一个开源平台,用于自动化容器化应用程序的部署、扩展和管理。它提供了一种便捷的方式来部署和运行应用程序,而无需关心底层基础设施的细节。本指南将带你从零开始学习 Kubernetes 的基础知识,并帮助你部署第一个应用。
69 0
|
9天前
|
存储 数据管理 应用服务中间件
Docker的数据管理实战篇
关于Docker数据管理实战的教程,涵盖了Docker数据卷的使用、特点、场景以及数据卷容器的概念和应用。
37 13
Docker的数据管理实战篇
|
5天前
|
人工智能 Prometheus 监控
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
本文介绍了在阿里云容器服务 ACK 上部署 NVIDIA NIM,结合云原生 AI 套件和 KServe 快速构建高性能模型推理服务的方法。通过阿里云 Prometheus 和 Grafana 实现实时监控,并基于排队请求数配置弹性扩缩容策略,提升服务稳定性和效率。文章提供了详细的部署步骤和示例,帮助读者快速搭建和优化模型推理服务。
43 7
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
|
12天前
|
存储 Kubernetes Cloud Native
探索Python编程的奥秘云原生时代的容器编排:Kubernetes入门与实践
【8月更文挑战第30天】本文以浅显易懂的方式,探讨了Python编程的核心概念和技巧。从基础语法到高级特性,再到实际应用案例,逐步引导读者深入理解Python编程的精髓。通过本文的学习,读者将能够掌握Python编程的基本技能,并激发进一步探索的兴趣。
27 13
|
11天前
|
Kubernetes Cloud Native Docker
云原生入门:从容器到Kubernetes的旅程
【8月更文挑战第31天】云原生技术正改变着应用的开发、部署和运维方式。本文将带你走进云原生的世界,从容器的基础开始,探索Docker和Kubernetes如何助力现代软件开发与运维。你将学会如何使用Docker创建和管理容器,以及如何通过Kubernetes进行集群管理,实现服务的自动化部署、扩展和管理。准备好让你的应用在云端自由翱翔了吗?让我们启航!
|
13天前
|
Kubernetes Shell 容器
k8s临时容器
k8s临时容器
|
11天前
|
Kubernetes Cloud Native 应用服务中间件
云原生入门:Kubernetes 和容器化技术的实践之旅
【8月更文挑战第31天】 在这篇文章中,我们将踏上一场探索云原生世界的旅程。我们将从基础的容器化技术讲起,逐步深入到Kubernetes这个强大的容器编排工具。文章会通过一个实际的例子,带领大家了解如何将一个简单的应用容器化并在Kubernetes集群上运行起来。无论你是云原生领域的新手,还是希望巩固知识的开发者,这篇文章都会为你提供一次实操的机会,让你对云原生有一个更加直观的认识。
|
12天前
|
运维 Kubernetes Cloud Native
云原生技术入门:从容器到Kubernetes的探索之旅
【8月更文挑战第30天】在数字时代的浪潮中,云计算已成为推动创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭开云原生技术的神秘面纱,从容器化技术的基础出发,逐步深入到Kubernetes集群管理的实际应用。我们将一起见证代码如何转化为可在云端无缝运行的服务,体验技术变革带来的无限可能。
|
13天前
|
Kubernetes Cloud Native 网络安全
云原生入门指南:Kubernetes和容器化技术云计算与网络安全:技术融合的新篇章
【8月更文挑战第30天】在云计算的浪潮中,云原生技术如Kubernetes已成为现代软件部署的核心。本文将引导读者理解云原生的基本概念,探索Kubernetes如何管理容器化应用,并展示如何通过实践加深理解。
|
13天前
|
Kubernetes 监控 Docker
微服务与容器化:Kubernetes 实践
【8月更文第29天】随着云计算的发展,越来越多的企业选择采用微服务架构来构建他们的应用程序。微服务架构允许将复杂的大型应用程序拆分成一系列小型、独立的服务,这些服务可以独立部署、扩展和维护。然而,这种架构也带来了新的挑战,特别是在服务的部署、监控和扩展方面。容器化技术,尤其是 Kubernetes,已经成为解决这些挑战的关键工具。
31 0

相关产品

  • 容器服务Kubernetes版