草庐IT

六、Docker数据卷

Charlie Brown 2023-03-28 原文

1.什么是容器卷?

docker的理念回顾
将应用和环境打包成一个镜像!

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!

2.使用数据卷

方式一 :直接使用命令挂载 -v

-v, --volume  list Bind mount a volume
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
[root@fedora home]# docker run -it -v /home/test:/home centos /bin/bash
[root@fedora home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
df3f3769a002   centos    "/bin/bash"   5 minutes ago   Up 5 minutes             sleepy_gould
# 通过 docker inspect 容器id 查看
[root@fedora home]# docker inspect df3f3769a002
......
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/test",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }

......

测试文件的同步

再来测试!

[root@df3f3769a002 home]# ls
hello
[root@df3f3769a002 home]# cat hello 
# 容内hello文件为空
# 1、停止容器
[root@df3f3769a002 home]# exit
exit
# 2、宿主机修改文件
[root@fedora home]# ls
chrlie  test
[root@fedora home]# cd test/
[root@fedora test]# vim hello 
# 3、启动、进入容器
[root@fedora test]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
df3f3769a002   centos    "/bin/bash"   20 minutes ago   Exited (0) 49 seconds ago             sleepy_gould
[root@fedora test]# docker start df3f3769a002
df3f3769a002
[root@fedora test]# docker exec -it df3f3769a002 /bin/bash
# 4、容器内的数据依旧是同步的
[root@df3f3769a002 /]# cd /home/
[root@df3f3769a002 home]# ls
hello
[root@df3f3769a002 home]# cat hello 
hello world

好处:我们以后修改只需要在本地修改即可,容器内会自动同步! 

3.实战:MySQL数据同步

思考:MySQL的数据持久化的问题

# 获取mysql镜像
[root@fedora ~]# docker pull mysql:5.7
# 运行容器,需要做数据挂载 
# 安装启动mysql,需要配置密码,这是要注意点!
# 参考官网hub
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字

[root@fedora ~]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 启动成功之后,我们在本地使用sqlyog来测试一下
# sqlyog连接到服务器的3306和容器内的3306 映射
# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!

假设我们将容器删除

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能

4.具名和匿名挂载

三种挂载: 匿名挂载、具名挂载、指定路径挂载

-v 容器内路径              #匿名挂载
-v 卷名:容器内路径        #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
# 匿名挂载
[root@fedora ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume的情况
[root@fedora ~]# docker volume ls
DRIVER    VOLUME NAME
local     4bd0a96149d19e42c416bc8ffe0ff70f2fefee91719622944e989277092d56de
......
local     cd2b7473dc48824ed40de704699609e60b47908713ca14b137c0652ac27daf6e
# 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!

# 具名挂载
# 通过 -v 卷名:容器内路径
[root@fedora ~]# docker run -d -P --name nginx02 -v nginx02:/etc/nginx nginx
[root@fedora ~]# docker volume ls
DRIVER    VOLUME NAME
......
local     cd2b7473dc48824ed40de704699609e60b47908713ca14b137c0652ac27daf6e
local     nginx02
# 查看一下这个卷
[root@fedora ~]# docker volume inspect nginx02 
[
    {
        "CreatedAt": "2022-06-23T14:49:37+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx02/_data",
            # 默认路径:/var/lib/docker/volumes/xxxx/_data 
        "Name": "nginx02",
        "Options": null,
        "Scope": "local"
    }
]
# 所有的docker容器内的卷,没有指定目录的情况下
# 都是在 /var/lib/docker/volumes/xxxx/_data下
# 如果指定了目录,docker volume ls 是查看不到的。

# 指定路径挂载
[root@fedora ~]# docker run -d -P --name nginx03 -v /etc/nginx03:/etc/nginx nginx
[root@fedora ~]# docker volume ls
DRIVER    VOLUME NAME
......
local     cd2b7473dc48824ed40de704699609e60b47908713ca14b137c0652ac27daf6e
local     nginx02
[root@fedora ~]# docker volume inspect nginx03
[]
Error: No such volume: nginx03

 拓展:

# 通过 -v 容器内路径:ro / rw 改变读写权限
ro #readonly  只读
rw #readwrite 可读可写
docker run -d -P --name nginx -v nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx -v nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

5.初识Dockerfile

 Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!

 通过这个脚本可以生成镜像

# 创建一个dockerfile文件,名字可以随便 建议Dockerfile
# 文件中的内容 指令(大写) 参数

# 编写dockerfile
[root@fedora ~]# touch dockerfile
[root@fedora ~]# chmod 755 dockerfile 
[root@fedora ~]# vim dockerfile 
[root@fedora ~]# cat dockerfile 
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "hello world !"
CMD /bin/bash
#这里的每个命令,就是镜像的一层!
# 使用dockerfile构建docker镜像
[root@fedora ~]# docker build -f /root/dockerfile -t test-centos:1.0 .
Sending build context to Docker daemon  27.65kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume1","volume2"]
 ---> Running in d372a812cc7d
Removing intermediate container d372a812cc7d
 ---> cf44dfcec98e
Step 3/4 : CMD echo "hello world !"
 ---> Running in 92cfcc99ea49
Removing intermediate container 92cfcc99ea49
 ---> bcb01dff9ca9
Step 4/4 : CMD /bin/bash
 ---> Running in 4ecd258bb6c4
Removing intermediate container 4ecd258bb6c4
 ---> 2b09bf17ffcc
Successfully built 2b09bf17ffcc
Successfully tagged test-centos:1.0
[root@fedora ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
test-centos           1.0       2b09bf17ffcc   8 seconds ago   231MB
centos                latest    5d0da3dc9764   9 months ago    231MB
# 启动镜像
[root@fedora ~]# docker run -it test-centos:1.0 /bin/bash 
[root@d2e33c323777 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	  volume2
dev  home  lib64  media       opt  root  sbin  sys  usr  volume1
# volume1和volume2就是生成镜像的时候,
# 自动挂载的 数据卷目录

# 查看一下卷挂载
[root@fedora ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND       CREATED         STATUS                     PORTS     NAMES
d2e33c323777   test-centos:1.0   "/bin/bash"   4 minutes ago   Exited (0) 8 seconds ago             condescending_poincare
[root@fedora ~]# docker inspect d2e33c323777
......
"Mounts": [
            {
                "Type": "volume",
                "Name": "98c0a007f824d767f3b30fbd9d2ab044e93dc13aca0a75b4581cd32346f32ff2",
                "Source": "/var/lib/docker/volumes/98c0a007f824d767f3b30fbd9d2ab044e93dc13aca0a75b4581cd32346f32ff2/_data",
                         # 卷挂载的路径
                         # 由于是匿名挂载,生成的名字比较长
                "Destination": "volume1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "f03956b31478d2d3f543b9d83d57413e95980cc9d509706dc80b82f90e24037d",
                "Source": "/var/lib/docker/volumes/f03956b31478d2d3f543b9d83d57413e95980cc9d509706dc80b82f90e24037d/_data",
                "Destination": "volume2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

......
# 测试一下文件是否同步出去
[root@d2e33c323777 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@d2e33c323777 /]# cd volume1
[root@d2e33c323777 volume1]# touch hello
[root@d2e33c323777 volume1]# ls
hello
[root@d2e33c323777 volume1]# exit
exit
[root@fedora ~]# cd /var/lib/docker/volumes/98c0a007f824d767f3b30fbd9d2ab044e93dc13aca0a75b4581cd32346f32ff2/_data
[root@fedora _data]# ls
hello

这种方式使用的十分多,因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

6.数据卷容器

 多个MySQL同步数据!

命名的容器挂载数据卷!

  

--volumes-from list  Mount volumes from the specified container(s)
# 测试,我们通过刚才启动的

 

测试:可以删除docker01,查看一下docker02docker03是否可以访问这个文件

测试依旧可以访问!

多个mysql实现数据共享

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候,可以实现两个容器数据同步!

结论

容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

有关六、Docker数据卷的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐