目录
5.数据卷
1.什么是数据卷
docker理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!
总结:容器的持久化和同步操作!容器间数据也是可以共享的!
2.使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
启动之后新开一个窗口,通过 docker inspect 容器id 查看具体挂载的内容
测试文件的同步(在主机上改动,观察容器变化)
再来测试
-
1.停止容器,然后在主机上修改文件
-
2.启动并进入容器,查看容器内数据,容器内的数据依旧是同步的!
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
1.实战:mysql
思考:MySQL的数据持久化的问题!
# 获取镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker pull mysql:5.7
# 运行容器, 需要做数据挂载! # 安装启动mysql,需要配置密码(注意)
# 官方测试, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动我们的
-d # 后台运行
-p # 端口隐射
-v # 卷挂载
-e # 环境配置
--name # 容器的名字
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# 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=000000 --name mysql01 mysql:5.7
4e380de478d6ce69e23c4253e03c2beb9482ac2c300be9a9bc6f499b94882c7e
- 1.启动成功之后,将阿里云服务器打开安全组3310端口
- 2.我们在本地使用navicat链接测试一下
- 3.查看本地目录和myql目录
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi kuangshen mysql redis www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
- 4.在本地测试创建一个数据库,查看下我们的路径是否ok!
2.删除容器
问题:那我们将mysql容器删除,卷还在嘛?
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e380de478d6 mysql:5.7 "docker-entrypoint.s…" 40 minutes ago Up 40 minutes 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker stop 4e380de478d6 #停止容器
4e380de478d6
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker rm -f mysql01 #删除容器
mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps -a #查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6836cef1437 centos "/bin/bash" About an hour ago Exited (0) 56 minutes ago friendly_hugle
删除之后,去主机的data目录查看
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi kuangshen mysql redis www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 performance_schema public_key.pem server-key.pem test
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 mysql private_key.pem server-cert.pem sys
发现,我们加载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
3.匿名和具名挂载
匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口
# 查看所有volume(卷)的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
具名挂载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02
486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-08-12T18:15:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
拓展
默认的权限是rw
# 通过 -v 容器内容路径 ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
3.DockerFile
DockerFile就是用来构建docker镜像的构建文件!命令脚本!
[root@iZ8vbgi1zpv4do6camhur3Z home]# mkdir docker-test-colume
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi docker-test-colume kuangshen mysql redis www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd docker-test-colume/
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# clear
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# pwd
/home/docker-test-colume
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
# 创建一个dockerfile文件
vim dockerfile1
# 文件的内容 指定(大写) 参数
#按i进入编辑模式,输入
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
#按esc,退出编辑模式
:wq
# 这里的每一个命令都是镜像的一层!
构建并查看镜像
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# cat dockerfile1 #查看文件
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker build -f dockerfile1 -t shuangma/contos:1.0 . #构建
[+] Building 0.1s (5/5) FINISHED
=> [internal] load build definition from dockerfile1 0.0s
=> => transferring dockerfile: 121B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [1/1] FROM docker.io/library/centos 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:0282d836c4f5ab8268cf4ebcf33ca7109bd03217f82358c4fa764466139852f2 0.0s
=> => naming to docker.io/shuangma/contos:1.0 0.0s
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 14 months ago 448MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
centos latest 5d0da3dc9764 17 months ago 231MB
这个卷和外部一定有一个同步的目录!
- 在volume01里创建一个文件
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker run -it 0282d836c4f5 /bin/bash
[root@d5ffb179942a /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@d5ffb179942a /]# cd volume01
[root@d5ffb179942a volume01]# ls
[root@d5ffb179942a volume01]# touch container.txt
[root@d5ffb179942a volume01]# ls
container.txt
- 查看容器信息,寻找卷挂载的路径
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5ffb179942a 0282d836c4f5 "/bin/bash" 2 minutes ago Up 2 minutes infallible_villani
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker inspect d5ffb179942a
进入到匿名挂载卷里的文件是否同步
[root@iZ8vbgi1zpv4do6camhur3Z ~]# cd /var/lib/docker/volumes/f49d8938103d318672f59bf34cf7c840bb920cb20ceffc0ce263c971d0973e4f/_data
[root@iZ8vbgi1zpv4do6camhur3Z _data]# ls
container.txt
4.容器数据卷
多个mysql同步数据!
启动3个容器,通过我们刚才自己写的镜像启动
- 1.启动docker01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 14 months ago 448MB
centos latest 5d0da3dc9764 17 months ago 231MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker run -it --name docker01 0282d836c4f5
[root@2ce5e311bb81 /]# ls -l
- 2.ctrl+p+q退出并不关闭容器docker01,然后启动docker02(这里继承并挂载docker01)
[root@40980c48f0f4 /]# [root@iZ8vbgi1zpv4do6camhur3Z ~]# clear
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker run -it --name docker02 --volumes-from docker01 0282d836c4f5
- 3.新开一个会话进入docker01容器,在volume01里创建一个文件夹,然后查看docker02容器的colume01里有没有,发现有的 <