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



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

    在这里插入图片描述

    一、前言

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

    容器数据卷的概念:

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

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

    二、容器数据卷的作用

    在这里插入图片描述

    1、数据共享:

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

    2、数据持久化:

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

    3、数据备份和恢复:

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

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

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

    具体命令如下:

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

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

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

    在这里插入图片描述

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

    mkdir /mynginx/conf
    mkdir /mynginx/zyl-web
    mkdir /mynginx/logs
    
    • 1
    • 2
    • 3

    在这里插入图片描述

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

    如下:容器 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
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2、进入nginx容器

    docker exec -it tmp-nginx /bin/bash
    
    • 1

    在这里插入图片描述

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

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

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

    在这里插入图片描述

    在这里插入图片描述

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

    docker stop tmp-nginx
    docker rm tmp-nginx
    
    • 1
    • 2

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

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

    vi  nginx.conf
    
    • 1

    内容如下:

     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;
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

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

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

    在这里插入图片描述

    4.6 重启nginx容器,加载配置

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

    docker restart mynginx
    
    • 1

    在这里插入图片描述

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

    docker exec -it mynginx /bin/bash
    
    cd /usr/share/nginx/html/
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    测试访问前端web项目:

    在这里插入图片描述

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

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

    5.1 具名挂载(Named Volumes)

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

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

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

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

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

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

    通过 -v  卷名:容器内路径 
    
    docker run -d -P --name=nginx01 -v juming-nginx:/etc/nginx nginx
    
    • 1
    • 2
    • 3

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

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

    在这里插入图片描述

    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
    
    • 1
    • 2

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

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

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

    docker exec -it nginx01 /bin/bash
    
    touch test-juming.txt
    
    • 1
    • 2
    • 3

    在这里插入图片描述

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

    docker stop nginx01 
    docker rm nginx01 
    
    • 1
    • 2

    在这里插入图片描述

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

    5.2 匿名挂载(Anonymous Volumes)

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

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

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

    -v 容器内路径      ##匿名挂载
    
    -v 卷名:容器内路径    ###具名挂载
    
    -v /宿主机路径:容器内路径    ##指定路径挂载
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    docker run -it --privileged=true  -v /宿主机绝对路径:/容器内目录:ro(只读,默认可读可写) 镜像名
    
    ro  ##只读,如果有ro则说明只能通过宿主机来操作,容器内无法操作
    rw  ##可读可写
    
    • 1
    • 2
    • 3
    • 4

    六、命令总结

    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/容器名:容器内文件路径  ##从本地文件系统复制文件到容器内
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述


    💖The End💖点点关注,收藏不迷路💖
  • 相关阅读:
    python列表中str实现大小写转换
    PPT:Spire.Presentation for Java 7.12.0
    4.2 K8S超级完整安装配置
    springboot校园新闻网站的设计与实现毕业设计源码142357
    将web前端项目部署到github,在hbuilderx中部署github中的项目、对Github加速
    Node.js(6)-node的web编程
    微服务技术栈-Ribbon负载均衡和Nacos注册中心
    欧拉计划Python解法(第6题-第10题)
    python判断字符串是否只由字母或数字组成——isalnum函数 的用法及实例
    2024.4.23 关于 LoadRunner 性能测试工具详解 —— VUG
  • 原文地址:https://blog.csdn.net/qq_41840843/article/details/136660495