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

这篇具有很好参考价值的文章主要介绍了Docker 操作之数据卷挂载【云原生】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

记得先启动 docker!

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

2. 容器

2.1 基本命令

① 创建容器

docker run

② 切换容器状态

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

③ 查看容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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 创建的

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

⑤ 进入容器

docker exec -it mn bash

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

⑩ 最后删除容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

2.3 Redis 案例

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

① 拉取 Redis 镜像

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

docker exec -it mr redis-cli

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

3. 数据卷

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

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

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

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

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

3.1 基本命令

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

docker volume

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

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

② 挂载数据卷

我们在创建容器时,可以通过 -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 数据卷

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

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

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

在本地用高级编辑器所做的修改将会通知给容器,最终访问到 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 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

docker load -i mysql.tar

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

③ 创建宿主机目录

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

④ 将 hmy.cnf 拖拽到 config 目录

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

⑥ 创建容器,设置 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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

Docker 操作之数据卷挂载【云原生】,Docker,docker,云原生,容器

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

到了这里,关于Docker 操作之数据卷挂载【云原生】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker】在容器中管理数据&&数据卷挂载以及宿主机目录挂载

                                      🎉🎉欢迎来到我的CSDN主页!🎉🎉                         🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚         🌟推荐给大家我的博客专栏《【Docker】在容器中管理数据》。🎯🎯                         🎁

    2024年01月16日
    浏览(46)
  • Docker -v 挂载主机目录到容器中(及数据卷容器)

    使用 Docker 的过程中,经常需要挂载主机上的目录或文件到 Docker 容器中,以实现数据的共享或持久化。而 docker run -v 命令便是用于挂载主机目录到 Docker 容器中的常用命令。 在创建启动容器时,使用 -v 参数设置数据卷 注意事项: 目录必须是绝对路径 如果目录不存在,会自

    2024年02月10日
    浏览(46)
  • 【云原生】Docker的端口映射、数据卷、数据卷容器、容器互联

    目录 一、端口映射(相当于添加iptables的DANT) 二、数据卷创建(宿主机目录或文件挂载到容器中) 三、数据卷容器(多个容器通过同一个数据卷容器为基点,实现所有容器数据共享) 四、容器互联(可以通过容器名称或连接别名通信) 在启动容器的时候,如果不指定对应

    2024年01月25日
    浏览(46)
  • 【云原生】Docker的数据管理(数据卷、容器互联)

    目录 一、数据卷(容器与宿主机之间数据共享) 二、数据卷容器(容器与容器之间数据共享) 三、 容器互联(使用centos镜像) 总结 用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,

    2024年02月11日
    浏览(49)
  • 【云原生】第八篇--Docker容器数据持久化存储机制

    物理机或虚拟机数据持久化存储 由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接

    2023年04月09日
    浏览(40)
  • 云原生系列之管理docker容器中的数据管理实战

    在生产环境中使用docker,一方面需要对数据进行保存或者在多个容器之间进行数据共享; 另一方面在docker的容器被删除之后,并不会保留容器的状态信息。 想要实现docker容器的信息持久化,就涉及到docker的数据管理,今天我们就来聊聊docker数据管理那些事。

    2024年02月12日
    浏览(40)
  • docker容器修改挂载路径

    环境信息 虚拟机:appserver 新增参数说明 挂载宿主机docker-cli、docker.sock到Jenkins中 宿主机docker-cli路径/usr/bin/docker 宿主机docker.sock路径/var/run/docker.sock 修改前: 关键点 “Binds”:[“/appdata/jenkins:/var/jenkins_home”] 完整版 修改后: 关键点 “Binds”:[“/appdata/jenkins:/var/jenkins_home”,“

    2024年02月03日
    浏览(51)
  • Docker数据管理之三种方式- 数据卷(Volumes)- 挂载主机目录(Bind mounts)- 数据卷容器(Data Volume Containers)

    文章主人公:帅哥BUG😎 文章路人: 路人  🤨   路人  😛 😎: docker在容器中管理数据主要有三种方式哦~ 🤨:  啊!,我记得docker在容器中管理数据主要方式是这两种吧  - 数据卷(Volumes) - 挂载主机目录(Bind mounts)      😛:  额,主要的方式是这两种?我怎么记得是这

    2024年02月05日
    浏览(72)
  • docker给已经启动容器添加挂载目录

    1.关闭docker 2. sudo su切换到root身份 cd /var/lib/docker/containers/容器id/,进入对应容器目录 3.vim hostconfig.json 修改如下,将容器目录/import绑定到主机/data目录: \\\"Binds\\\": [\\\"/data:/import\\\"], 4.vim config.v2.json 修改如下,添加MountPoints: 5.启动docker    systemctl start docker.socket  systemctl start docker.ser

    2024年02月11日
    浏览(42)
  • docker容器共享宿主机环境(目录挂载)

    一、背景介绍 如果开发的服务均需要将打成docker镜像,可是随着服务越来越多,镜像也越来越多。每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M。有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少。 二、测试 我们

    2024年02月09日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包