【docker】容器卷综合讲解,以及go实现的企业案例

容器卷(Volumes)基础讲解:

  1. 容器概念
    容器卷(Volumes)是 Docker 提供的一种持久化存储机制,允许容器持久化数据,即使容器被删除或重新创建,数据仍然可以保留。
    卷是独立于容器的,跨容器可以共享。

  2. 容器卷的特点

  • 数据持久化:卷可以将数据存储在指定的目录中,避免容器重启或删除后数据丢失。
  • 跨容器共享:多个容器可以共享同一个卷,以实现容器间的数据共享。
  • 高效存储:卷存储在宿主机的文件系统中,性能较高。
  • 备份和恢复:卷可以方便地备份和恢复数据。
  1. 创建和使用卷
    创建卷:
    使用 docker volume create 命令来创建一个卷:
docker volume create my_volume

使用卷:
使用 -v--mount 标志将卷挂载到容器内。挂载时,格式如下:

docker run -d -v my_volume:/path/in/container my_image

解释:
my_volume:容器卷的名称。
/path/in/container:容器内的挂载路径。

  1. 容器卷的生命周期
  • 容器创建时创建卷:如果容器使用的卷不存在,Docker 会自动创建一个卷。
  • 容器删除时,卷不被删除:容器删除后,卷仍然会存在。如果不再需要卷,可以手动删除。

查看所有卷:

docker volume ls

查看特定卷的详细信息:

docker volume inspect my_volume
  1. 共享卷
    不同的容器可以共享同一个卷。假设我们有两个容器,它们都需要访问同一个数据:
docker run -d -v shared_volume:/path/in/container1 my_image
docker run -d -v shared_volume:/path/in/container2 my_image

这两个容器都会共享名为 shared_volume 的卷中的数据。

  1. 读写规则
    在 Docker 中,可以控制卷的读写权限。
    只读卷
    如果我们只希望容器能够读取卷中的数据,而不能修改它,可以将卷挂载为只读模式:
docker run -d -v my_volume:/path/in/container:ro my_image

:ro 表示卷是只读的。

默认读写模式
默认情况下,卷是可读写的。如果没有指定 rorw,则卷的挂载是读写模式:

docker run -d -v my_volume:/path/in/container my_image
  1. 卷的继承与共享
    Docker 允许多个容器共享同一个卷。为了支持这个功能,容器需要使用相同的卷名称或挂载相同的宿主机目录路径。这样,容器之间就能够共享数据。
    继承和共享的案例
    假设我们有三个容器,分别是 Web 容器、数据库容器和缓存容器,它们之间需要共享卷:

启动数据库容器并挂载卷:

docker run -d --name db-container -v db-volume:/var/lib/mysql mysql

启动 Web 容器并挂载同一个卷:

docker run -d --name web-container -v db-volume:/data/web-data my_web_image

启动缓存容器并挂载同一个卷:

docker run -d --name cache-container -v db-volume:/data/cache-data my_cache_image

在这个例子中,三个容器都挂载了同一个卷 db-volume,从而共享数据。

  1. 使用宿主机目录共享数据
    除了使用 Docker 卷,我们还可以直接挂载宿主机上的目录来进行数据共享。比如:
docker run -d -v /myhostdir:/path/in/container my_image

此时,容器将挂载宿主机的 /myhostdir 目录,而不是 Docker 卷。

  1. 卷与宿主机文件系统的不同
  • 卷是由 Docker 管理的,并且具有更好的性能、可靠性和迁移性。
  • 一个宿主机目录只是宿主机上的普通文件夹,没有 Docker 的管理和优化,性能上可能不如卷。
  1. 数据备份与恢复
    Docker 卷提供了非常可靠的备份和恢复功能,尤其是对于数据库类应用,卷非常重要。

备份卷数据
可以将卷的数据拷贝到宿主机目录或其他位置进行备份:

docker run --rm -v my_volume:/volume -v /myhost/backup:/backup ubuntu tar cvf /backup/backup.tar /volume

该命令将 my_volume 卷中的数据传输到宿主机的 /myhost/backup 目录下。

恢复卷数据
将备份文件恢复到卷中:

docker run --rm -v my_volume:/volume -v /myhost/backup:/backup ubuntu tar xvf /backup/backup.tar -C /volume
  1. 卷与容器网络
    尽管 Docker 卷与容器网络不直接相关,但在多容器应用中,卷通常是跨网络共享的。不同的容器可以通过 Docker 网络互联,并共享相同卷的数据。比如:
docker network create my_network
docker run -d --name container1 --network my_network -v shared_volume:/data my_image
docker run -d --name container2 --network my_network -v shared_volume:/data my_image

总结

容器卷是 Docker 中非常重要的功能,它不仅实现了容器数据的持久化、跨容器共享,
还支持数据备份和恢复。在企业级应用中,合理使用卷可以提升数据管理的效率,
并确保容器化应用的数据不会因容器重启或删除而丢失。


企业级案例:Go Web 应用与数据库服务

假设我们正在开发一个企业级 Web 应用,该应用使用 Go 语言编写,并且依赖 MySQL 数据库。
我们希望将这个 Go 应用和 MySQL 数据库容器化,同时利用 Docker 卷来持久化数据库数据,
并利用 Docker 网络实现容器间的通信。

案例需求

  1. Go Web 应用:负责提供 Web 服务,接收用户请求,处理数据,并与 MySQL 数据库进行交互。
  2. MySQL 数据库:存储 Web 应用所需的用户数据。
  3. 容器卷(Volumes):MySQL 数据库的持久化存储,确保数据库数据在容器重启或删除后仍然存在。
  4. Docker 网络:用于不同容器间的通信,确保 Web 应用和 MySQL 数据库可以正常通信。

步骤 1:编写 Go Web 应用

首先,我们编写一个简单的 Go Web 应用,这个应用将连接到 MySQL 数据库并提供基本的用户数据处理功能。

main.go:

package mainimport ("database/sql""fmt""log""net/http""github.com/go-sql-driver/mysql"
)var db *sql.DB// 初始化数据库连接
func initDB() {var err errordsn := "root:root@tcp(db:3306)/mydb"db, err = sql.Open("mysql", dsn)if err != nil {log.Fatal("Error opening database: ", err)}
}// 处理首页请求
func handler(w http.ResponseWriter, r *http.Request) {rows, err := db.Query("SELECT name FROM users")if err != nil {fmt.Fprintf(w, "Error querying database: %v", err)return}defer rows.Close()fmt.Fprintf(w, "Users List:\n")for rows.Next() {var name stringif err := rows.Scan(&name); err != nil {fmt.Fprintf(w, "Error scanning row: %v", err)return}fmt.Fprintf(w, "%s\n", name)}
}// 启动 Web 服务
func main() {initDB()defer db.Close()http.HandleFunc("/", handler)log.Fatal(http.ListenAndServe(":8080", nil))
}

步骤 2:编写 Dockerfile

接下来,我们为 Go 应用编写 Dockerfile,将其容器化。

Dockerfile:

# 使用官方 Go 镜像作为基础镜像
FROM golang:1.20 AS builder# 设置工作目录
WORKDIR /app# 将 Go 代码复制到容器内
COPY . .# 编译 Go 应用
RUN go mod tidy && go build -o myapp .# 使用轻量级的 Alpine 镜像作为运行时环境
FROM alpine:3.17# 安装 MySQL 客户端(用于与 MySQL 数据库通信)
RUN apk --no-cache add mysql-client# 将编译好的 Go 应用从 builder 镜像中复制过来
COPY --from=builder /app/myapp /usr/local/bin/myapp# 容器启动时执行 Go 应用
CMD ["/usr/local/bin/myapp"]

步骤 3:编写 Docker Compose 文件

为了方便管理多个容器,我们使用 Docker Compose 来编排 Go 应用和 MySQL 数据库容器。

docker-compose.yml:

version: "3.8"services:# MySQL 容器db:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbvolumes:- db_data:/var/lib/mysqlnetworks:- mynetwork# Go Web 应用容器web:build: .ports:- "8080:8080"depends_on:- dbnetworks:- mynetworkvolumes:db_data:   # 用于存储 MySQL 数据的持久化卷networks:mynetwork:  # 定义自定义网络,使容器能够互相通信

解释

  • MySQL 服务:使用官方 mysql:8.0 镜像,并设置环境变量来配置数据库用户、密码和数据库名。
    使用 Docker 卷 db_data 来持久化数据库数据。
  • Go Web 应用服务:通过 build 指令从当前目录构建 Go 应用的镜像。
    容器将映射到宿主机的 8080 端口,依赖于 MySQL 容器。
  • 自定义网络mynetwork 网络确保 Go Web 应用容器能够与 MySQL 容器通信。

步骤 4:构建和启动容器

现在,我们可以使用 Docker Compose 来构建和启动所有容器。

docker-compose up --build

该命令将构建 Docker 镜像并启动 Go Web 应用容器和 MySQL 容器。构建完成后,
你的 Go Web 应用将在 localhost:8080 上提供服务。

步骤 5:测试 Web 应用

打开浏览器,访问 http://localhost:8080,如果一切配置正确,
你将看到数据库中所有用户的列表。

步骤 6:管理数据持久化

当你使用 docker-compose 启动容器时,MySQL 容器的数据库数据会被存储在宿主机的卷中,
db_data 卷。即使容器被删除,数据仍然会被保留。当你重新启动容器时,数据将自动恢复。

步骤 7:备份和恢复 MySQL 数据

备份 MySQL 数据

docker run --rm -v db_data:/db -v /path/to/backup:/backup alpine \tar czf /backup/db_backup.tar.gz /db

这条命令会将 MySQL 数据备份到宿主机的 /path/to/backup/db_backup.tar.gz 文件。

恢复 MySQL 数据

docker run --rm -v db_data:/db -v /path/to/backup:/backup alpine \tar xzf /backup/db_backup.tar.gz -C /db

此命令将备份的数据库数据恢复到 db_data 卷中。

步骤 8:容器网络和容器间通信

容器间的网络通信是通过 Docker 网络实现的。上面创建的 mynetwork 网络允许 Go Web 应用容器和 MySQL 容器在同一个网络中相互通信。

  • Go 应用通过 db 主机名来连接 MySQL 数据库(在 docker-compose.yml 中定义)。这是因为 Docker 会自动为每个服务分配一个主机名,并在网络内解析服务名。

总结

通过上述步骤,我们成功地容器化了一个 Go Web 应用,并使用 Docker Compose 将其与 MySQL 数据库容器集成。
同时,通过 Docker 卷,我们确保了数据库的数据持久化。这样,我们不仅提高了应用的可移植性,
还确保了数据在容器重启或删除后的持久性。

这个企业级案例展示了如何使用 Docker 来部署 Go 应用和数据库服务,并结合容器卷和网络进行数据持久化和容器间的通信。
这种架构非常适用于需要高可用性和数据一致性的企业应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cin/cout的性能优化和缓冲区同步问题

目录 背景导入 问题 1.1ios::sync_with_stdio(false) 1.2为什么要解除C/C IO流同步? 1.3使用场景 2.1cin和cout的绑定关系 2.2为什么要解除绑定关系? 2.3注意事项 背景导入 大家可以先看一下这段背景知识;后面我会谈谈自己的理解; 1.在C中,标准输⼊输出流…

node.js基础学习-url模块-url地址处理(二)

前言 前面我们创建了一个HTTP服务器,如果只是简单的http://localhost:3000/about这种链接我们是可以处理的,但是实际运用中一般链接都会带参数,这样的话如果我们只是简单的判断链接来分配数据,就会报404找不到链接。为了解决这个问…

基于springboot中小型制造企业质量管理系统源码和论文

信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时,解决方法需要根据服务器的操作系统(如 Linux 或 Windows )和具体服务器环境来处理。以下是常见的解决办法: 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

Java基础——(四)继承

1. 类、超类和子类 在Java中,通过关键字extends表示继承。extends表明正在构造的新类派生与一个已存在的类,已存在的类称为超类(superclass)、基类(base class)或父类(parent class&#xff09…

Python语法基础(四)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说,A函数作为B函数的参数,B函数就是高阶函数 map:映射 map(func,iterable) 这个是map的基本语法,…

《datawhale2411组队学习 模型压缩技术7:NNI剪枝》

文章目录 一、NNI简介二、 NNI剪枝快速入门2.1 加载并训练模型2.2 模型剪枝2.3 模型加速(剪枝永久化)2.4 微调压缩模型2.5 Slim Pruner测试 三、 使用NNI3.0进行Bert压缩(剪枝、蒸馏)3.1 数据预处理3.2 训练模型3.3 设置模型蒸馏函数3.4 修剪…

day22:lamp项目部署

一,lamp概述 lamp概述 LAMP 是一组开源软件的缩写,用于搭建动态网站或Web应用程序的基础环境。LAMP 代表了四个主要的组成部分: Linux:操作系统,LAMP 环境的基础。通常使用的是 Linux 发行版,如 CentOS、…

【提高篇】3.6 GPIO(六,寄存器介绍,下)

目录 2.3 输出速度寄存器OSPEEDR(GPIOx_OSPEEDR) (x = A..I) 2.4 上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I) 2.5 输入数据寄存器(IDR) 2.6 输出数据寄存器(ODR) 2.7 置位/复位寄存器(BSRR) 2.8 BSRR与ODR寄存器的区别 2.3 输出速度寄存器OSPEEDR(GPIOx_OSPEEDR) (…

Java中的“抽象类“与“接口“之间的关系

在Java中,抽象类和接口都是用于实现抽象的机制,但它们在设计目的、使用方式以及功能上有一些不同。下面我将通过文字和代码示例来详细讲解它们之间的关系。 1. 抽象类(Abstract Class) 特点: 抽象类使用abstract关键字…

ROS2-参数服务器

在 ROS 2 中,节点之间可以通过参数服务器共享和获取参数。这意味着一个节点可以声明一个参数,而其他节点可以读取或修改这个参数。这是通过 ROS 2 的参数系统实现的,它允许节点在参数服务器上声明、设置和获取参数 。 0. 背景 系统有多个 RO…

CSS3网站

(看不懂英文的记得点击右上角Change language更改语言): https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors CSS选择器 https://developer.mozilla.org/en-US/docs/Web/CSS/color_value 颜色值 https://ser…

js进阶-中括弧运算

一、题目 下面代码的输出是什么 console.log([[]][[]] [[]]); 二、变量类型转换 1.对于数字运算[负号-]、[减号-]、[乘号*]、[除号/]、[自加号]等,其后的变量都会被尝试转换为数字; 如果其后变量是基础数据类型,那么按基础数据类型转换…

【IMF靶场渗透】

文章目录 一、基础信息 二、信息收集 三、flag1 四、flag2 五、flag3 六、flag4 七、flag5 八、flag6 一、基础信息 Kali IP:192.168.20.146 靶机IP:192.168.20.147 二、信息收集 Nmap -sP 192.168.20.0/24 Arp-scan -l nmap -sS -sV -p- -…

记一次腾讯云海外服务器http能正常访问https访问拒绝问题处理过程

最近双十一, 购了一台腾讯云的海外服务器, 开通后就是一堆的服务器软件安装数据上传和配置,没想到,等待配置完成后才发现https无法正常访问,于是开启了自查。 1. 检查nginx软件的ssl配置 nginx http https配置参考 server {l…

ubuntu多版本安装gcc

1.ubuntu安装gcc 9.3.1 $ sudo apt update $ sudo apt install gcc-9 g-9 二、配置GCC版本 安装完成后,需要使用update-alternatives命令来配置GCC版本。这个命令允许系统在多个安装的版本之间进行选择 1.添加GCC 9.3.1到update-alternatives管理 $ sudo update-a…

hdlbits系列verilog解答(mt2015_muxdff)-90

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节要实现的电路来自于ECE253 2015中期测试问题5。要实现以下如图所示的时序电路中复用器及D触发器子模块。 模块声明 module top_module ( input clk, input L, input r_in, input q_in, output reg Q); 思路…

Word - 图片右键保存

以右键另存为的方式保存word里面的图片,确实会导致图片质量降低。一般图片可能看不出差别,但一些文字内容较多的图片,就会影响阅读。 针对这个问题,可以通过解压word文件的方法得到里面的图片。 首先,备份一下原文件…

Android 图形系统之七:SurfaceFlinger

一. 引言 什么是 SurfaceFlinger?SurfaceFlinger 的核心作用和地位?为什么需要了解 SurfaceFlinger? 二. SurfaceFlinger 的基本概念 Surface 和 SurfaceFlinger 的关系SurfaceFlinger 与图形渲染(OpenGL ES 和 Vulkan&#xf…

YOLOv11原创改进专栏|专栏介绍目录

一、专栏简介 本专栏自2024年12月01日开始持续更新,专栏主要面向YOLOv11的各种改进,主要改进方向为Backbone(主干)、Conv、C2f、注意力机制、Neck以及检测头的改进,本专栏会涉及到提高精度、轻量化、分割等方面的内容。…