什么是容器数据卷?
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
#这个时候,可以实现两给容器数据的同步!
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止.
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的