• Docker的数据卷


    文章目录

    四、数据卷

    前面我们已经使用Docker启动并进入容器执行过命令了,也确实发现了以下这几个问题:

    • 容器的内容不便于修改(前面进入Nginx修改html文件内容时候可以清晰感受到)
    • 数据不可复用(在容器内的修改对外是不可见的且所有修改的内容对新创建的文件都是不可复用的)
    • 升级维护困难(如果要升级我的容器,那么我们只能通过删除老的容器,再运行一个新的容器,这么做的坏处是老容器中的内容将会被我们一起删掉)

    数据集: 是一个虚拟的目录,指向宿主机文件系统中的某个目录。通过创建数据卷,我们可以使容器与宿主机之间产生一个目录与目录之间的映射关系。举个例子,我有个数据集名叫html,他映射到我本地的路径是/var/lib/docker/volumes/html,而我的Nginx容器的html目录也映射到他上面,此时,我们修改本地的html目录下的文件或者修改Nginx容器下的html目录中的文件,另一个地方的文件也会发生响应的改变。

    Docker操作数据卷的命令如下:
    在这里插入图片描述
    比如,我们创建一个叫html的数据卷,那么我们使用命令docker volumn create html,然后我们使用docker volumn ls来查看是否创建成功。
    在这里插入图片描述
    然后,我们看一下我们的数据卷 html 的详细信息:(框中部分就是他的宿主机的位置了)。
    在这里插入图片描述
    下面,来演示几个案例,加深一下对数据卷了解并熟悉日常的使用。

    案例一、创建一个新的Nginx容器,并将该容器的/usr/share/nginx/html 目录挂载到html数据卷,通过修改本地html目录下的index.html文件,从而修改容器的显示内容标题为Hello,World!!!

    知识点:运行容器时,使用-v参数即可挂载我们的数据卷。

    首先,创建我们的Nginx容器,并将其 /usr/share/nginx/html 目录挂载到html数据卷。命令如下:

    docker run --name ngx -p 8092:80 -v html:/usr/share/nginx/html -d nginx:1.22
    
    • 1

    命令解析:

    docker run 启动容器命令
    –name ngx 容器名设置为ngx
    -p 8092:80 映射宿主机的8092端口到该容器的80端口
    -v html:/usr/share/nginx/html 映射数据卷html到该容器的/usr/share/nginx/html目录
    -d nginx:1.22 以nginx:1.22为镜像后台启动容器

    然后我们开启宿主机防火墙的8092端口。

    #开启8092端口
    firewall-cmd --add-port=8092/tcp --permanent --zone=docker
    #重启防火墙
    firewall-cmd --reload
    
    • 1
    • 2
    • 3
    • 4

    之后,我们就可以直接进入刚才说的数据卷映射的宿主机的html目录去修改我们的index.html文件了。

    cd /var/lib/docker/volumes/html/_data/
    vim index.html
    
    • 1
    • 2

    我们只需要将 h1 标签中的内容修改为 Hello,World!!!然后保存退出即可。
    此时,我们使用本机访问我们的宿主机ip地址加端口号8092,显示如下:
    在这里插入图片描述

    注意:当数据卷不存在时,我们运行容器并希望将其挂载到一个不存在的数据卷,那么Docker会自动帮我们创建一个数据卷,即可以不先通过 docker volumn create 命令创建数据卷再将容器进行挂载,直接docker run 运行容器的时候 -v 让他帮我们自动创建一个我们指定的数据卷也是可以的。

    案例二、创建并运行一个MySQL容器,将宿主机目录直接挂载到容器。

    对于宿主机目录和文件的直接挂载,语法跟数据卷的挂载类似,如下:

    -v 宿主机目录:容器内目录
    -v 宿主机文件:容器内文件

    首先,我们当然还是从dockerhub拉取镜像:

    # 拉取镜像
    docker pull mysql:8.0
    
    # 新建目录 tmp/mysql/data
    mkdir -p tmp/mysql/data
    
    # 新建目录 tmp/mysql/conf
    mkdir tmp/mysql/conf
    
    # 进入 tmp/mysql/conf 目录
    cd tmp/mysql/conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后,我们用vim指令 vim hmy.cnf 写我们的配置文件如下:

    [mysqld]
    skip-name-resolve
    character_set_server=utf8
    datadir=/var/lib/mysql
    server-id=1000
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后我们启动我们的8093端口,给待会要开启的mysql容器做准备。

    # 打开8093端口号
    firewall-cmd --add-port=8093/tcp --permanent --zone=docker
    
    # 重启防火墙
    firewall-cmd --reload
    
    • 1
    • 2
    • 3
    • 4
    • 5

    启动后,我们就可以启动我们的容器了。

    docker run --name mysql \ 
    -e MYSQL_ROOT_PASSWORD=root \
    -p 8093:3306 \
    -v /root/tmp/mysql/data:/var/lib/mysql \
    -v /root/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
    -d mysql:8.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    命令解析:

    • docker run --name mysql:运行docker容器,自定义容器名称为 mysql
    • -e MYSQL_ROOT_PASSWORD=root:配置环境变量的密码为root(具体可查看官网Environment Variables菜单)
    • -p 8093:3306:映射宿主机的8093端口号到该容器的3306端口
    • -v /root/tmp/mysql/data:/var/lib/mysql:映射宿主机的/root/tmp/mysql/data 目录到 容器的/var/lib/mysql 目录(mysql容器的/var/lib/mysql目录就是其数据存储目录)
    • -v /root/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf:映射宿主机的/root/tmp/mysql/conf/hmy.cnf 文件到容器的 /etc/mysql/conf.d/hmy.cnf文件。
    • -d mysql:8.0:-d表示后台启动,mysql:8.0指定的是镜像及其版本

    启动后,我们使用docker ps命令可以看到:
    在这里插入图片描述

  • 相关阅读:
    前端开发日常——CSS动画无限轮播
    VirtualKD-Redux 双机调试内驱驱动
    基于python+django的个性化电影推荐系统设计与实现
    IDEA创建完Maven工程后,右下角一直显示正在下载Maven插件
    数据可视化:揭示隐藏信息的强大工具
    【深度学习】解析Vision Transformer (ViT): 从基础到实现与训练
    删除的短信怎么恢复?专业与非专业方法的全面比较
    kepler.gl笔记:添加数据
    小程序 英语学习小助手java
    如何在 Tomcat 中为 Web 应用程序启用和配置缓存?
  • 原文地址:https://blog.csdn.net/weixin_44741023/article/details/126593847