Docker进阶:深入了解容器数据卷

news2025/1/13 14:15:01

Docker进阶:深入了解容器数据卷

  • 一、前言
  • 二、容器数据卷的作用
  • 三、容器数据卷的使用方法
  • 四、实战--使用docker部署前端项目(数据卷挂载)
    • 4.1 重要:准备工作,先在本地创建挂载目录
    • 4.2 启动一个临时的nginx容器,拷贝nginx容器内的初始配置文件
    • 4.3 重新挂载目录
    • 4.4 修改宿主机nginx的配置文件
    • 4.5 拷贝前端项目到挂载目录
    • 4.6 重启nginx容器,加载配置
  • 五、容器数据卷具名挂载、匿名挂载
    • 5.1 具名挂载(Named Volumes)
    • 5.2 匿名挂载(Anonymous Volumes)
    • 5.3 如何确定是具名挂载还是匿名挂载
    • 5.4 拓展:读写规则映射添加
  • 六、命令总结


💖The Begin💖点点关注,收藏不迷路💖

在这里插入图片描述

一、前言

在Docker中,容器数据卷是一个非常有用的功能,它可以用于实现容器与主机之间的数据共享和持久化存储。

容器数据卷的概念:

容器数据卷是Docker中用于实现数据持久化的一种机制。

它可以将容器内部的数据目录或文件与主机上的目录或文件进行映射,从而实现数据在容器和主机之间的共享和持久化存储。

二、容器数据卷的作用

在这里插入图片描述

1、数据共享:

容器数据卷可以让多个容器之间共享数据。比如,一个Web应用程序可能需要一个容器负责前端页面的展示,另一个容器负责处理后端逻辑,它们可以通过容器数据卷共享数据。

2、数据持久化:

容器数据卷可以实现数据在容器销毁或重新创建时的持久化存储。通常情况下,容器内部的数据在容器销毁后会丢失,而通过容器数据卷,我们可以将数据存储在主机上,从而保证数据的持久性。

3、数据备份和恢复:

容器数据卷可以用于数据的备份和恢复。我们可以将容器数据卷中的数据备份到主机上,以便在需要时进行恢复。

三、容器数据卷的使用方法

1、在运行 Docker 容器时,将宿主机上的一个目录(使用绝对路径表示)映射到容器内的指定目录中。以实现数据在宿主机和容器之间的共享和持久化存储。

具体命令如下:

docker run -it -v /宿主机绝对路径:/容器内目录 镜像名

##其中,-it 表示以交互模式启动容器,-v /宿主机绝对路径:/容器内目录指定了数据卷的映射关系,镜像名表示要基于哪个镜像运行容器。

四、实战–使用docker部署前端项目(数据卷挂载)

运行一个 nginx 容器并将宿主机上的一个目录映射到容器内的指定目录中,让 nginx 使用自定义的配置文件来启动服务。**

在这里插入图片描述

4.1 重要:准备工作,先在本地创建挂载目录

mkdir /mynginx/conf
mkdir /mynginx/zyl-web
mkdir /mynginx/logs

在这里插入图片描述

如果没有先在本地创建有关文件,会启动报错如下:

如下:容器 mynginx 已经成功创建并运行,但是在 45 秒前已经退出。容器状态显示为 Exited (1)

报错1:2024/03/12 11:58:54 [emerg] 1#1: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)

报错2:2024/03/12 12:08:13 [emerg] 1#1: open() "/etc/nginx/mime.types" failed (2: No such file or directory) in /etc/nginx/nginx.conf:18

在这里插入图片描述

4.2 启动一个临时的nginx容器,拷贝nginx容器内的初始配置文件

先启动一个临时的 nginx 容器,然后将容器内的初始配置文件拷贝到本地宿主机。

1、启动临时的 nginx 容器:

docker run -d --name=tmp-nginx -p 8000:80 nginx

docker ps

在这里插入图片描述

2、进入nginx容器

docker exec -it tmp-nginx /bin/bash

在这里插入图片描述

3、拷贝 nginx 配置文件到本地宿主机:

把tmp-nginx容器中/etc/nginx/目录下的文件(不包括该目录本身)复制到本地文件系统的/mynginx/conf/目录中。

docker cp tmp-nginx:/etc/nginx/. /mynginx/conf/

在这里插入图片描述

在这里插入图片描述

3、停止并删除临时的 nginx 容器:

docker stop tmp-nginx
docker rm tmp-nginx

在这里插入图片描述

4.3 重新挂载目录

需要多次使用 -v 参数来实现将多个目录或文件挂载到容器内。

将本地的 zyl-web/dist 目录挂载到容器内的 /usr/share/nginx/html 目录,conf 目录挂载到容器内的 /etc/nginx 目录,logs 目录挂载到容器内的 /var/log/nginx 目录。

##重新挂载

docker run -d -p 8000:80 \
-v /mynginx/zyl-web/dist/:/usr/share/nginx/html \
-v /mynginx/conf:/etc/nginx \
-v /mynginx/logs:/var/log/nginx \
--name=mynginx nginx

在这里插入图片描述

4.4 修改宿主机nginx的配置文件

vi  nginx.conf

内容如下:

 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            # 前端项目地址,注意:这里是容器内部的地址
            root /usr/share/nginx/html;
            # 默认访问的资源
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

在这里插入图片描述

4.5 拷贝前端项目到挂载目录

## 根据你项目而定
mv /zyl-web/* /mynginx/zyl-web/

在这里插入图片描述

4.6 重启nginx容器,加载配置

重新启动后,容器会继续使用之前加载的配置文件、数据和设置。

docker restart mynginx

在这里插入图片描述

2、进入mynginx容器,你会看到数据同步

docker exec -it mynginx /bin/bash

cd /usr/share/nginx/html/

在这里插入图片描述

测试访问前端web项目:

在这里插入图片描述

这样发布前端项目、修改配置即可不用进到容器内部,而是在本地宿主机修改即可。

五、容器数据卷具名挂载、匿名挂载

5.1 具名挂载(Named Volumes)

具名挂载是通过为容器指定一个特定的卷(Volume)来实现的。

具名挂载可以为卷指定一个名称,并且可以在容器创建时或后续运行时进行管理。

具名挂载的优点是可以方便地管理和共享数据,同时也支持在多个容器之间共享数据。

具名挂载在容器的生命周期内保留数据,即使容器被删除,数据仍然存在。

例1:验证具名挂载,即使容器被删除,数据仍然存在。

1、创建具名挂载卷并运行容器

通过 -v  卷名:容器内路径 

docker run -d -P --name=nginx01 -v juming-nginx:/etc/nginx nginx

2、检查名为 juming-nginx 的 Docker 卷的详细信息

##将返回有关指定卷的元数据和配置信息。
docker volume inspect juming-nginx

在这里插入图片描述

3、查看具名卷的数据目录

docker 在没有指定目录的情况下,容器内的卷都在’/var/lib/docker/volumes/卷名/_data

/var/lib/docker/volumes/ 是Docker 用于存储具名卷数据的默认路径。在这个路径下,Docker 会为每个具名卷创建一个单独的目录,并在其中保存卷的数据。

[root@zyl-server ~]# find / -name juming-nginx
/var/lib/docker/volumes/juming-nginx

在这个目录下,能够找到与 juming-nginx 具名卷相关联的数据目录。

即使容器被删除,这些数据目录仍然存在,说明数据得到了持久化存储。
在这里插入图片描述

4、进入容器内部,创建文件

docker exec -it nginx01 /bin/bash

touch test-juming.txt

在这里插入图片描述

5、验证删除前面创建的nginx01 容器,数据是否持久化存储

docker stop nginx01 
docker rm nginx01 

在这里插入图片描述

可以看到数据仍然存在,则说明具名挂载的数据是持久化的,即使容器被删除也不会丢失。

5.2 匿名挂载(Anonymous Volumes)

匿名挂载是在容器创建时自动创建的临时卷,没有指定一个特定的名称。匿名挂载的优点是可以快速创建和销毁临时数据,适用于临时存储或临时共享数据的场景。

匿名挂载在容器删除后会自动销毁,数据不会保留。

5.3 如何确定是具名挂载还是匿名挂载

-v 容器内路径      ##匿名挂载

-v 卷名:容器内路径    ###具名挂载

-v /宿主机路径:容器内路径    ##指定路径挂载

5.4 拓展:读写规则映射添加

docker run -it --privileged=true  -v /宿主机绝对路径:/容器内目录:ro(只读,默认可读可写) 镜像名

ro  ##只读,如果有ro则说明只能通过宿主机来操作,容器内无法操作
rw  ##可读可写

六、命令总结

docker run -d 镜像名  ##重启之后不会自动运行

docker run -d --restart=always 镜像名  ##重启之后自动运行容器

docker start 容器id/容器名     ##启动

docker restart 容器id/容器名   ##重启

docker stop  容器id/容器名     ##停止

docker kill 容器id/容器名      ##kill进程

docker ps                      ###列出当前运行的容器

docker ps | grep 容器id/容器名   ## 查看进程是否正常

docker ps -a                   ###列出所有容器

docker exec -it 容器id/容器名 /bin/bash   ##进入容器

docker logs 容器id/容器名      ###看容器的日志

docker cp 容器id/容器名:/容器内文件路径 宿主机文件绝对路径  ##从容器复制文件到本地文件系统

docker cp 宿主机文件绝对路径 容器id/容器名:容器内文件路径  ##从本地文件系统复制文件到容器内

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

苍穹外卖学习-----2024/03/010---redis,店铺营业状态设置

1.Redis入门 2.在Java中操作Redis 3.店铺营业状态设置 BUG!!! 今天在启动项目时,用到了Redis缓存数据库,但是却出现了报错信息: ERR Client sent AUTH, but no password is set。Caused by: io.lettuce.core.RedisCommandExecutionException…

ThreeJs 射线拾取不准确设置

欢迎关注进来点个关注; 关注获取更多咨询!关注获取答案! 1、效果图如下: 2、问题描述:点击一开始无法获取当前的位置,官方推荐直接使用 mouseClick.x = (event.offsetX / window.innderWidth) * 2 - 1; mouseClick.y = -(event.offsetY / window.innderHeight) * 2 + 1;…

真空泵系统数据采集远程监控解决方案

行业背景 半导体制造业可以说是现代电子工业的核心产业,广泛应用于计算机、通信、汽车、医疗等领域。而在半导体生产加工过程中,如刻蚀、 镀膜、 扩散、沉积、退火等环节,真空泵都是必不可少的关键设备,它可以构建稳定受控的真空…

UE5 GAS开发p30 创建UI HUD 血条

新建AuraUserWidget,AuraWidgetController,AuraHUD 首先设置AuraWidgetController.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AbilitySystemComponent.h" #in…

数据结构系列-链表实现

🌈个人主页: 会编辑的果子君 💫个人格言:“成为自己未来的主人~” #define _CRT_SECURE_NO_WARNINGS #include"List.h" void ListTest01() {LTNode* plist LTInit();LTPushFront(plist, 1);LTPushFront(plist, 2);LTPushFront(plist, 3);…

yum安装mysql、数据库tab自动补全,快来浅了解下 ?

centos7上面没有mysql,它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

UE5 局域网联机,寻找会话失败。

目录 参考资料: 尝试解决办法 1.1在【项目名.Build.cs】脚本中添加该行,添加后关闭编辑器,重新生成解决方案。​编辑 2.检查是否在同一个C类子网 参考资料: 1.Cant find session in LAN - Programming & Scripting / Mul…

外包干了30天,技术明显退步。。。。

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 这次来聊一个大家可能也比较关心的问题,那就是就业城市选择的问题。而谈到这个问题&a…

前端之用html做一个用户登陆界面

用户登陆界面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>用户注册页面</title></head> <body><form action"https://www.baidu.com" method"post">…

JavaScript进阶3之参数按值传递、call,apply,bind和new的实现、继承的多种方式

JavaScript基础 参数按值传递按值传递共享传递 call、apply、bind和new的实现this软绑定硬绑定 call的实现第一步第二步第三步 apply的实现bind的实现返回函数的模拟实现传参的模拟实现构造函数效果的模拟实现构造函数效果的优化实现 new的实现初步实现 继承的多种方式&优缺…

代码随想录算法训练营第25天|216.组和总和三、17.电话号码的字母组合

目录 一、力扣216.组合总和三1.1 题目1.2 思路1.3 代码 二、力扣17.电话号码的字母组合2.1 题目2.2 思路2.3 代码 一、力扣216.组合总和三 1.1 题目 1.2 思路 自己的想法&#xff1a;和总和问题思路类似&#xff0c;回溯法。 &#xff08;1&#xff09;k个数的组合&#xff0…

全自动守护数据安全:全自动备份文件的重要性与高效方案

一、全自动备份文件&#xff1a;数据安全的坚实防线 在数字化时代&#xff0c;电脑成为我们生活和工作中不可或缺的重要工具。然而&#xff0c;随着电脑中存储的数据量不断增长&#xff0c;数据丢失或损坏的风险也随之上升。因此&#xff0c;全自动备份文件的重要性愈发凸显&a…

【C语言】三种方式实现字符串(char*)/字符数组(char[ ])输入输出

前言 做题时经常需要用到字符串&#xff0c;写篇笔记加强记忆&#xff0c;本文用 4个例子实现字符串的输入输出操作。 scanf(); 从键盘输入数据时&#xff0c;遇到 “空格”、“回车” 都会终止。若要接受空格&#xff0c;使用 gets(); 代替 scanf(); 多个 scanf(); 同时出现…

全球首个 AI 超级工程师:拥有全栈技能,一个指令就能完成整个开发过程

全球首位AI软件工程师Devin是由初创公司Cognition推出的&#xff0c;它被认为是世界上第一个完全自主的AI软件工程师[2][15]。Devin具备强大的编程和软件开发能力&#xff0c;能够在多个方面协助或完全独立地完成软件开发任务[15]。它的核心能力包括自学新语言、开发迭代App、自…

浅谈Redis 的 保护模式(protected-mode)

今天在一台服务器上面部署了redis,发现始终无法用工具远程连接,项目里面是正常的,就是工具不行,防火墙也关闭了.折腾了一会才突然想起来,是不是触发了保护模式. 什么时候触发保护模式protected-mode: 同时满足以下两个: 1.bind未指定ip 2.未配置密码 解决方案: 编辑redis…

UL1642标准_锂聚合物电池亚马逊测试报告

UL1642标准_锂聚合物电池亚马逊测试报告 什么是锂聚合物电池UL1642标准&#xff1f; UL1642 认证要求涵盖旨在用于技术人员可更换或用户可更换应用的锂离子电池。UL1642 认证要求是为了避免锂离子电池在产品中工作时发生火灾或爆炸的风险。 锂聚合物电池 UL是Underwriters L…

2014

1,写出计算Ack(m,n)的递归算法 #include<iostream> using namespace std; int A(int m,int n){if(m0){return n1;}else if(m>0&&n0){return A(m-1,1);}else{return A(m-1,A(m,n-1));} }int main(){int m,n;cout<<"please input two number"&l…

移动端App、小程序、公众号该怎么选择,你真得知道吗?

当下移动App,小程序泛滥&#xff0c;如何选择&#xff0c;你真的知道吗&#xff1f; 今天我们就聊聊App、小程序、公众号、微应用具体是什么&#xff1f;怎么样开发&#xff1f;适合在什么情况下使用&#xff1f; 1.App、小程序、公众号、微应用之初识 App App本质来说就是手…

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

23、设计模式之访问者模式(Visitor)

一、什么是访问者模式 访问者模式是一种行为型设计模式&#xff0c;它可以用于在不修改已有对象结构的情况下&#xff0c;定义新的操作方式。简单地说就是在不改变数据结构的前提下&#xff0c;通过在数据结构中加入一个新的角色——访问者&#xff0c;来达到执行不同操作的目的…