docker 容器数据卷

什么是容器数据卷?

docker的理念

将应用和环境打包成一个镜像

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

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

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

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

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


使用数据卷

方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器目录

#测试
[root@localhost home]# docker run -it -v /home/ceshi:/home centos /bin/bash

#启动起来之后我们可以通过 docker inspect 容器id 来查看具体是怎么挂载的

测试文件的同步

 

再测试!
1.停止容器
2.宿主机上修改文件
3启动容器.
4.容器内的数据依旧是同步的

 

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


练习:安装MySQL

MySQL的数据持久化问题!

#获取镜像

[root@localhost /]# docker pull mysql
Using default tag: latest

#运行容器,需要做数据挂载! #安装启动mysql ,需要配置密码,这是注意点


#官方测试 : docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@localhost /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:latest

#启动成功后,我们测试一下
链接到服务器的3310 --3310和容器内的3306映射,这个时候我们就可以链接上了!

#在本地测试创建一个数据库,查看一下我们的映射路径是否ok

假设我们将容器删除

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

具名和匿名挂载

#匿名挂载
-v 容器内路径 !
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的卷的情况
[root@localhost /]# docker volume ls


#这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径!
DRIVER    VOLUME NAME
local     1c73e7f2bab69cdd2962d3b654c9072faca4d89eab7c3230b3c607e1c1133a43

#具名挂载 -v 卷名:容器内路径
local     1c73e7f2bab69cdd2962d3b654c9072faca4d89eab7c3230b3c607e1c1133a43
local     juming-nginx

#通过 -v 卷名:容器内路径
#查看一下这个卷

 所有的docker容器内的卷,没有指定目录的情况下都在  /var/lib/docker/volumes/xxx/...

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的 "具名挂载"

#如果确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径                #匿名挂载
-v 卷名:容器内路径            #具名挂载
-v /宿主机路径::容器内路径    #指定路径挂载

拓展

#拓展知识 
-v 容器内路径; ro rw 改变读写权限
ro  readonly #只读
rw  readwrite #可读可写

#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx:ro nging
docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx:rw nging

# ro 只要看到ro就说明这个路径只能通过宿主机拉操作了,容器内部无法操作!

初始Dockerfile

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

通过这个脚本可以生成镜像,镜像是一层一层的,脚本就是一个一个命令,每个命令都是一层

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

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-------end-------"
CMD /bin/bash

#这里的每个命令,就是镜像的一层!
[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t cpf/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in d2286fbcf1e4
Removing intermediate container d2286fbcf1e4
 ---> f063061fd331
Step 3/4 : CMD echo "-------end-------"
 ---> Running in 942f1e6ba794
Removing intermediate container 942f1e6ba794
 ---> ac664968bf55
Step 4/4 : CMD /bin/bash
 ---> Running in f51b77c0f466
Removing intermediate container f51b77c0f466
 ---> d3af805a72cb
Successfully built d3af805a72cb
Successfully tagged cpf/centos:1.0
[root@localhost docker-test-volume]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
cpf/centos   1.0       d3af805a72cb   40 seconds ago   231MB
nginx        latest    605c77e624dd   9 days ago       141MB
mysql        latest    3218b38490ce   2 weeks ago      516MB
centos       latest    5d0da3dc9764   3 months ago     231MB
#启动一下自己写的容器
[root@localhost docker-test-volume]# docker run -it  d3af805a72cb /bin/bash 
[root@8903dfe47639 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jan  8 07:02 dev
drwxr-xr-x.   1 root root  66 Jan  8 07:02 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15 14:17 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 237 root root   0 Jan  8 07:02 proc
dr-xr-x---.   2 root root 162 Sep 15 14:17 root
drwxr-xr-x.  11 root root 163 Sep 15 14:17 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jan  8 02:15 sys
drwxrwxrwt.   7 root root 171 Sep 15 14:17 tmp
drwxr-xr-x.  12 root root 144 Sep 15 14:17 usr
drwxr-xr-x.  20 root root 262 Sep 15 14:17 var
drwxr-xr-x.   2 root root   6 Jan  8 07:02 volume01   #这两个目录就是我们生成镜像
drwxr-xr-x.   2 root root   6 Jan  8 07:02 volume02   #的时候自动挂载的卷目录
[root@8903dfe47639 /]# 

这个卷和外部一定有一个同步的目录! 

FROM centos

VOLUME ["volume01","volume02"]     #匿名挂载

CMD echo "-------end-------"
CMD /bin/bash

查看一下卷挂载的路径

 测试一下刚才的文件是否同步出去了

#同步成功 这种方式我们以后使用的很多,因为我们通常会构建自己的镜像!
假设构建自己镜像的时候没有挂载卷,要手动挂载镜像 -v 卷名:容器内路径

[root@localhost ~]# cd /var/lib/docker/volumes/0f1a5f8fd2982dc631239165cfc6a84ca04d25ab97a9a1c5fd8dd989585d9f31/_data
[root@localhost _data]# ls
container.txt

数据卷容器

多个mysql如何同步!

#启动3个容器,通过我们刚才自己写的镜像启动

 

#--volumes-from 相当与子类继承了父类 就会拥有父类的一些东西    docker01假设数据卷容器
root@localhost ~]# docker run -it --name docker02 --volumes-from docker01 cpf/centos:1.0
[root@1c7b452f853f /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jan  8 08:33 dev
drwxr-xr-x.   1 root root  66 Jan  8 08:33 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15 14:17 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 240 root root   0 Jan  8 08:33 proc
dr-xr-x---.   2 root root 162 Sep 15 14:17 root
drwxr-xr-x.  11 root root 163 Sep 15 14:17 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jan  8 02:15 sys
drwxrwxrwt.   7 root root 171 Sep 15 14:17 tmp
drwxr-xr-x.  12 root root 144 Sep 15 14:17 usr
drwxr-xr-x.  20 root root 262 Sep 15 14:17 var
drwxr-xr-x.   2 root root   6 Jan  8 08:30 volume01
drwxr-xr-x.   2 root root   6 Jan  8 08:30 volume02
[root@1c7b452f853f /]# cd volume01     
[root@1c7b452f853f volume01]# ls
docker01            #docker01创建的内容同步到了docker02上面
# 只要通过--volumes-from 我们就可以实现容器间的数据共享
[root@localhost ~]# docker run -it --name docker03 --volumes-from docker01 cpf/centos:1.0
[root@6f07a9cae019 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jan  8 08:41 dev
drwxr-xr-x.   1 root root  66 Jan  8 08:41 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15 14:17 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 247 root root   0 Jan  8 08:41 proc
dr-xr-x---.   2 root root 162 Sep 15 14:17 root
drwxr-xr-x.  11 root root 163 Sep 15 14:17 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jan  8 02:15 sys
drwxrwxrwt.   7 root root 171 Sep 15 14:17 tmp
drwxr-xr-x.  12 root root 144 Sep 15 14:17 usr
drwxr-xr-x.  20 root root 262 Sep 15 14:17 var
drwxr-xr-x.   2 root root  22 Jan  8 08:35 volume01
drwxr-xr-x.   2 root root   6 Jan  8 08:30 volume02
[root@6f07a9cae019 /]# cd volume01
[root@6f07a9cae019 volume01]# ls
docker01
[root@6f07a9cae019 volume01]# touch docker03
[root@6f07a9cae019 volume01]# ls
docker01  docker03
#测试 可以删除docker01 ,查看docker02和03是否还可以访问
#测试依旧可以访问

 多个mysql是实现数据共享

[root@localhost /]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:latest

[root@localhost /]# docker run -d -p 3310:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:latest

#这个时候,可以实现两给容器数据的同步!

结论:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值