Docker 操作之数据卷挂载【云原生】

news2025/1/12 9:41:28

文章目录

    • 1. 镜像
      • 1.1 基本命令
      • 1.2 案例练习
    • 2. 容器
      • 2.1 基本命令
      • 2.2 Nginx 案例
      • 2.3 Redis 案例
    • 3. 数据卷
      • 3.1 基本命令
      • 3.2 Nginx 案例
      • 3.3 MySQL 案例

1. 镜像

镜像命令一般分两部分组成:repository:tag。比如 mysql:5.7,表示名称加版本。

在没有指定 tag 时,默认是 latest,代表最新版本的镜像。

命令太多记住不,通过 docker --help 就能够查看到 docker 中的所有命令了。

1.1 基本命令

① 获取镜像

获取镜像有两种方式:
① 一种是通过 docker build 命令,把本地的 Dockerfile 文件构建成一个镜像;
② 另一种是通过 docker pull 命令,从 Docker Registry 镜像服务器上拉取镜像(一般都是这种方式)。

docker pull

② 查看镜像

docker images

③ 删除镜像

docker rmi

④ 分享镜像

两种方式:
① 可以通过 docker push 命令,将你的镜像推送到镜像服务器去;
② 用 docker save 命令,将你的镜像打包为一个压缩包,其他人就可以拿着 U 盘来拷贝你的镜像了,最后通过 docker load 命令加载压缩包为镜像

docker save -o nginx.tar nginx:latest
docker load -i nginx.tar

1.2 案例练习

需求:从 DockerHub 中拉取一个 nginx 镜像并查看,再利用 save 将 nginx 镜像导出磁盘,然后再通过 load 把镜像加载回来.

① 首先去镜像仓库 hub.docker.com 搜索 nginx 镜像

在这里插入图片描述

② 通过 docker pull nginx 命令就可以拉取最新版本的 nginx 镜像了

在这里插入图片描述

在这里插入图片描述

记得先启动 docker!

③ 查看一下我们拉取的镜像

在这里插入图片描述

④ 将 nginx 镜像导出到 nginx.tar 文件中去

在这里插入图片描述

在这里插入图片描述

⑤ 将 nginx.tar 文件加载成镜像

在这里插入图片描述

在导入镜像之前,我们先把原来的镜像删掉!

2. 容器

2.1 基本命令

① 创建容器

docker run

② 切换容器状态

在这里插入图片描述

#运行 → 暂停
docker pause
#暂停 → 运行
docker unpause
#运行 → 停止
docker stop
#停止 → 运行
docker start

③ 查看容器

#查看容器运行状态
docker ps
#查看容器运行日志
docker logs

在这里插入图片描述

docker ps 默认只能查看运行中的容器,要想查看全部容器加上 -a 参数!

④ 进入容器内部

docker exec

⑤ 删除指定的容器

docker rm

rmi 删的是镜像,rm 删的是容器,它不仅回收内存、干掉进程,还会把硬件上与该容器相关的所有文件系统也彻底删掉!

2.2 Nginx 案例

需求:创建并运行一个 Nginx 容器,并在主机浏览器访问。进入 Nginx 容器,修改 HTML 文件的内容。

① 运行 Nginx 容器

docker run --name containerName -p 80:80 -d nginx

命令解读:
docker run:创建并运行一个容器
–name:给容器起一个名字
-p:将宿主端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口,宿主端口可以自己设置,容器端口一般是由应用本身决定的
-d:后台运行容器docker
nginx:镜像名称,该容器是基于 nginx 创建的

因为容器是对外隔离的,所以对于外部的用户请求,容器内部是无法感知的。这时候就需要将宿主端口和容器端口做一个映射,用户的请求首先发到宿主机,之后由宿主机再转发给容器去处理。所以,端口映射是容器与外部进行沟通的入口。

在这里插入图片描述

执行命令后,返回容器的唯一 id!

② 通过 ifconfig 命令找到虚拟机的 IP 地址

在这里插入图片描述

③ 在主机浏览器访问 192.168.149.100:80,成功

在这里插入图片描述

④ 回到虚拟机终端,查看一下日志,可以看到我们发起了三次 GET 请求

在这里插入图片描述

docker logs -f mn,可以持续输出 mn 容器的日志,Ctrl+C 停止输出!

⑤ 进入容器

docker exec -it mn bash

命令解读:
docker exec:进入容器内部,执行一个命令
-it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn:要进入的容器名称
bash:进入容器后执行的命令,bash 是一个 Linux 终端交互命令

⑦ 从 DockerHub 官网上找到Nginx 的静态资源目录,回到终端切换到此目录,可以发现我们要修改的 index.html 文件就在这里

在这里插入图片描述

在这里插入图片描述

⑧ 编辑 index.html 文件,注意容器内部是不支持 vim 编辑的,我们可以用其他的方式来修改

sed -i 's#Welcome to nginx#栈老师不回家哈哈哈#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html

在这里插入图片描述

不推荐在容器内修改文件,首先是不方便,其次在容器内修改的文件是没有日志记录的!

⑨ 案例成功,exit 退出容器,stop 停掉容器

在这里插入图片描述

⑩ 最后删除容器

运行中的容器不能删除,加上 -f 参数可强行删除!

在这里插入图片描述

2.3 Redis 案例

需求:拉取 Redis 镜像,创建并运行一个 Redis 容器,要求支持数据持久化。

① 拉取 Redis 镜像

在这里插入图片描述

② 到 DockerHub 搜索 Redis 镜像,查看镜像文档帮助信息,选择支持数据持久化的命令

在这里插入图片描述

③ 创建容器,这里我们要加一个端口映射

docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes

在这里插入图片描述

④ 打开防火墙,放行指定端口,最后再关闭防火墙

firewall-cmd --zone=public --add-port=6379/tcp --permanent

⑤ 打开 Redis 客户端看一下,这里的地址是我虚拟机的 IP 地址

在这里插入图片描述

在这里插入图片描述

⑥ 进入 Redis 容器,添加数据,再回到 Redis 客户端可以看到我们的数据依据添加进来了

在这里插入图片描述

其实也可以直接进入 redis-cli:

docker exec -it mr redis-cli

在这里插入图片描述

⑦ 我在本机客户端所做的修改,通过 Linux 终端也是可以看到的

在这里插入图片描述

在这里插入图片描述

3. 数据卷

容器与数据耦合的问题:
① 不便于修改。当我们需要修改 Nginx 的 html 内容时,需要进入容器内部修改,很不方便;
② 数据不可复用。在容器内的修改对外是不可见的。所有修改对新创建的容器是不可以复用的;
③ 升级维护困难。数据在容器内,如果要升级容器必然得删除旧容器,所有的数据也都跟着删除了。

而数据卷可以解除容器与数据的耦合,方便操作容器内的数据,保证数据安全。

数据卷是一个虚拟目录,指向宿主机文件系统中的某个真实的目录。

也可以认为,Nginx 容器中的 html 文件与宿主机文件系统中的 html 文件,通过一个虚拟的数据卷建立起了联系,一个发生改变另一个也跟着发生改变,这就是双向绑定。

有了数据卷之前的问题得以解决:
① 修改方便。我们可以直接在宿主机文件系统中修改文件内容,修改后的结果也会立刻传达给容器文件;
② 数据共享。当有一个新的容器也想采用旧容器的配置数据时,我们完全可以把新容器和旧容器挂在同一个数据卷下,指向宿主文件系统目录,这样数据就得到了共享;
③ 升级容易。容器删除了,但是数据卷是不会删除的,我们升级了新的容器,然后把它挂在之前的数据卷上,这样就可以继续使用旧的数据了。

3.1 基本命令

① 创建、查看、删除数据卷

docker volume

docker volume 命令是数据卷操作,根据命令后跟随的 command 来决定下一步的操作:

create:创建一个数据卷
inspect:显示一个或多个数据卷信息
ls:列出所有的数据卷
prune:删除未使用的数据卷
rm:删除一个或多个指定的数据卷

Mountpoint 就是数据卷的挂载点,它是一个真实的目录!

在这里插入图片描述

② 挂载数据卷

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录。

一个数据卷对应一个硬盘目录,容器自行将自己的目录上挂载到数据卷上即可使用。

docker run --name mn -p 80:80 -v html:/root/html -d nginx

命令解读:
docker run:创建并运行容器
–name mn:给容器 起个名字叫 mn
-v html:/root/html:把 html 数据卷挂载到容器内的 /root/html 这个目录中
-p 80:80:把宿主机的 80 端口映射到容器的 80 端口
nginx:依据 nginx 镜像创建容器

3.2 Nginx 案例

需求:上个案例中,我们进入 Nginx 容器内部,依据指定 Nginx 的 html 目录的所在位置 /usr/share/nginx/html,我们需要把这个目录挂载到 html 这个数据卷上,方便操作其中的内容。

① 创建 html 数据卷

在这里插入图片描述

② 创建 Nginx 容器,并将 html 所在目录挂载到数据卷上

docker run --name mn -p 80:80 -v html:/root/html -d nginx

在这里插入图片描述

当数据卷不存在的时候,Docker 会帮我们自动创建!

③ 切换到 html 数据卷的挂载点目录,可以看到我们 Nginx 中 /usr/share/nginx/html 目录下的文件已经被挂载到硬盘目录中了

cd /var/lib/docker/volumes/html/_data

在这里插入图片描述

④ 接下来复制目录去可视化界面,用高级的客户端工具打开该目录

在这里插入图片描述

⑤ 右键打开 index.html 就可以编辑了

在这里插入图片描述

⑦ 看一下我们的编辑内容已经保存成功,再去浏览器访问一下容器,成功

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在本地用高级编辑器所做的修改将会通知给容器,最终访问到 index.html 页面,我们再也不用忍受容器内低端的 vim 编辑模式了!

3.3 MySQL 案例

需求:创建并运行一个 MySQL 容器,将宿主机目录直接挂载到容器。
① 挂载 /tem/mysql/data 到 mysql 容器内的数据存储目录;
② 挂载 /tem/mysql/config/hmy.cnf 到 mysql 容器的配置文件;
③ 设置 MySQL 密码。

以前我们是先将容器目录挂载到数据卷,再由数据卷指向具体的宿主机目录。其实,我们完全可以将宿主机目录直接挂载到容器上。

#目录挂载与数据卷挂载的语法是类似的:
-v 宿主机目录:容器内目录
-v 宿主机文件:容器内文件

① FinalShell 控制台切换到 tmp 目录,然后将本地的 mysql.tar 拖拽到 Linux 的该目录下

在这里插入图片描述

② 将该文件上传为一个镜像,并查看版本号

docker load -i mysql.tar

在这里插入图片描述

在这里插入图片描述

③ 创建宿主机目录

#-p创建多级目录
mkdir -p mysql/data
mkdir -p mysql/config

在这里插入图片描述

④ 将 hmy.cnf 拖拽到 config 目录

在这里插入图片描述

⑤ 查阅 DockerHub,找到 mysql 镜像的使用方法,-e 就可以直接设置 mysql 密码,其实这里还缺两个配置项,端口映射和数据卷挂载

在这里插入图片描述

⑥ 创建容器,设置 mysql 密码,并将宿主机目录挂载到容器目录,容器目录从官方文档查看

docker run --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 -v /tem/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.25

在这里插入图片描述

在这里插入图片描述

⑦ 创建数据库,并连接本地 mysql 客户端测试一下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

数据卷挂载和目录挂载的区别:
数据卷挂载:自动化,隐藏目录细节,耦合度低。 挂载点目录由数据卷自动帮我们生成,我们只需要将容器挂在数据卷上就 OK 了,整个挂载过程完全是交给 Docker 容器帮我们处理的,使用起来方便,但是它的劣势也很明显,因为这个目录是由数据卷自动帮我们生成的,目录深且复杂,我们到时候找的时候不好找,需要查看数据卷的详细信息才能找到具体的存储位置;
目录挂载:需要手动管理,目录容易查找,耦合度高。 宿主机目录和容器目录直接交互,无需中间的数据卷参与,这种方式在创建容器时需要自己指定宿主机的目录,写起来麻烦,但是优点就是自己创建的目录找起来方便,能够快速定位到文件的目录。

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

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

相关文章

一文掌握Python所有常见的循环用法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 循环是编程中的重要概念&#xff0c;它允许我们重复执行一组操作&#xff0c;直到满足某个条件。Python提供了多种类型的循环&#xff0c;以适应不同的需求和场景。本文将详细介绍Python中所有常见的循环用法&am…

MySQL下对[表]的操作数据类型

目录 表的操作 创建表&#xff1a; 查看表结构&#xff1a; 修改表&#xff1a; 删除表&#xff1a; 数据类型 数据类型分类&#xff1a; 数值类型&#xff1a; tinyint类型越界测试&#xff1a; bit类型&#xff1a; 小数类型&#xff1a; 字符串类型&#xff1a; …

JAVA中 Lambda 方法引用 算法

算法和数据结构 一、Arrays类 接下来学习的类叫做Arrays&#xff0c;其实Arrays并不是重点&#xff0c;但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays&#xff0c;再通过Arrays来学习Lamdba这样学习会更丝滑一些_. 1.1 …

【Qt Quick 项目(第一集Qt Quick UI 项目项目创建)】

# Qt Quick 项目 到底什么是Qt Qml、什么是Qt Quick、QtQuick应用程序与Qt Widget程序有何区别,为了让读者在学习QML之前有一个整体认识,这里先介绍几个Quick项目。 01 Qt Quick UI 项目

Java8的Stream最佳实践

从这一篇文章开始&#xff0c;我们会由浅入深&#xff0c;全面的学习stream API的最佳实践&#xff08;结合我的使用经验&#xff09;&#xff0c;本想一篇写完&#xff0c;但写着写着发现需要写的内容太多了&#xff0c;所以分成一个系列慢慢来说。给大家分享我的经验的同时&a…

【博士每天一篇论文-技术综述】Machine Learning With Echo State Networks 一篇系统讲解ESN知识的五星文章

阅读时间&#xff1a;2023-11-21 1 介绍 年份&#xff1a;2020 作者&#xff1a;徐元超&#xff0c;曼尼托巴大学 期刊&#xff1a; 无 引用量&#xff1a;无 这篇文章是一篇技术报告&#xff0c;从递归神经网络&#xff08;RNNs&#xff09;引入到回声状态网络&#xff08;…

JavaScript基础之JavaScript简介(什么是JavaScript?)

JavaScript简介 JavaScript&#xff0c;通常被缩写为JS&#xff0c;是一种轻量级、跨平台、单线程、解释编译的编程语言。它也被称为网页脚本语言。它以网页开发而闻名&#xff0c;许多非浏览器环境也使用它。 JavaScript是一种弱类型语言。JavaScript可用于客户端开发以及服…

shell编程学习

shell编程学习 变量的高级用法变量替换字符串处理获取字符索引获取子串长度抽取字符串中的子串 案例测试 变量的高级用法 变量替换 ##变量替换&#xff08;贪婪&#xff0c;从前往后匹配&#xff0c;匹配到进行删除&#xff09; test1I love you,you love me echo $test1 han…

Java研学-spring框架(一)

一 概述 1 介绍 Spring框架是一个开源的Java EE应用程序框架&#xff0c;旨在简化Java企业级应用的开发难度和开发周期&#xff0c;主要通过控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;等技术实现。   容器&#xff08;Container&#x…

【CVE-2022-22733漏洞复现】

Apache ShardingSphere ElasticJob-UI漏洞 漏洞编号:CVE-2022-22733 文档说明 本文作者:SwBack 创作时间:2024/1/21 19:19:19 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/qq_30817059 百度搜索: SwBack漏洞描述 Apache ShardingSphere Elast…

Python基础第二篇(Python基础语法)

文章目录 一、字面量二、注释三、变量四、数据类型五、数据类型转换六、标识符七、运算符八、字符串扩展内容&#xff08;1&#xff09;字符串定义&#xff08;2&#xff09;字符串拼接、&#xff08;3&#xff09;字符串格式化&#xff08;4&#xff09;字符串格式化的精度控制…

上位机图像处理和嵌入式模块部署(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉&#xff0c;以传统算法和光源控制为主&#xff0c;部分采用了深度学习技术…

MySQL的下载、安装、配置、登录,配置(图+文)(超级详细)

一、 软件的下载 1. 下载地址 官网&#xff1a; https://www.mysql.com 2. 打开官网&#xff0c;点击 DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 4. 在 General Availability(GA) Releases 中选择适合的版本 …

【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

文章目录 一、break语句 1. break在 while 循环中 2. break在 for 循环中 3. break在 do…while 循环中 4. break在 switch 语句中 5. break 总结 二、continue语句 1. continue在 while 循环中 2. continue在 for 循环中 3. continue在 do...while 循环中 4. con…

Kubernetes网络模型概述

Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管这些Pod是否运行在同一个Node中&#xff0c;都要求它们可以直接通过对方的IP进行访问。由于Kubernetes的网络模…

C++泛型编程-类模板的项目实战实现基础的Vector的编写

请设计一个数组模板类&#xff08; Vector &#xff09;&#xff0c;完成对 int 、 char 、 float 、 double 以 及任意的自定义类等类型元素进行管理。 需求 a. 实现构造函数 b. 实现拷贝构造函数 c. 实现 cout << 操作 d. 实现下标访问符 [] 的重载操作 …

中仕教育:应届生可以考军队文职吗?有什么要求?

军队文职&#xff0c;涵盖了各个领域&#xff0c;包括行政、管理、人力资源、后勤等工作岗位&#xff0c;作为国家公务员的一种类型&#xff0c;军队文职同样享有稳定的工作和待遇。 虽然军队文职对所有符合条件的人开放&#xff0c;但对于应届生来说&#xff0c;还需满足以下…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

Spring:StopWatch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、输出总耗时 public void stopWatc…

【web 编程技术】基于 B/S 架构的电商平台(java web)

基于 B/S 架构的电商平台&#xff08;java web&#xff09; 课程设计实验目的课程设计实验环境课程设计功能概述课程设计需求分析三层架构图功能列表系统用例图系统活动图-用户端需求分析 课程设计详细设计实现过程数据库BaseServlet 的实现商品显示模块-分页显示所有商品、查看…