什么是容器数据卷
docker的理念回顾
将应用的环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器的删除,数据就会丢失!需求:数据可以持久化
总结就是:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接命令挂载
docker run -it -v 主机目录:容器目录
#测试
[root@VM-0-14-centos /]# docker run -it -v /cy:/home centos /bin/bash
[root@VM-0-14-centos ~]# docker inspect a0140ed29df7
看到挂载信息表明这时已经挂在成功
使用数据卷技术实现mysql持久化
# 运行容器,需要做数据挂在! #安装启动mysql ,需要配置密码
#官方,docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动我们的mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@VM-0-14-centos ~]# docker run -d -p 39995:3306 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=chenyu --name mysql905 mysql:5.7
# 查看是否挂载成功
[root@VM-0-14-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1bcaf11741a mysql:5.7 "docker-entrypoint.s…" 20 hours ago Up 20 hours 33060/tcp, 0.0.0.0:39995->3306/tcp, :::39995->3306/tcp mysql905
7cad9c50012d nginx "/docker-entrypoint.…" 27 hours ago Up 27 hours 0.0.0.0:39001->80/tcp, :::39001->80/tcp beautiful_mirzakhani
[root@VM-0-14-centos ~]# docker inspect f1bcaf11741a
"Mounts": [
{
"Type": "bind",
"Source": "/home/mysql/conf",
"Destination": "/etc/mysql/conf.d",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/mysql/data",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
# 出现这个时说明启动和挂载成功
# 启动之后,我们本地使用sqlyog来测试一下
# sqlyog-连接到服务器的39995 和容器内的3306映射,这个时候我们可以连接上了!
尝试远程连接,连接成功证明部署没问题
具名和匿名挂载
# 匿名挂载
-v 容器内的路径!
docker run -d -p --name nginx01 -v /etc/ngxin nginx
# 查看所有的volume的情况
[root@VM-0-14-centos conf]# docker volume ls
DRIVER VOLUME NAME
local 2d511795d19c39f9f2a198367d1008a5d88f27327fdf0fba0bd6db7777c6ca7b
# 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!
#具名挂载
[root@VM-0-14-centos conf]# docker run -d -P --name nginx01 -v juming-ngninx:/etc/nginx nginx
e99712faffa6a6f4c315e50bb14b1432067795b0b3c2b949ea2bfc8769dfc93c
[root@VM-0-14-centos conf]# docker volume ls
DRIVER VOLUME NAME
local juming-ngninx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/
# docker工作目录
[root@VM-0-14-centos conf]# cd /var/lib/docker
[root@VM-0-14-centos docker]# ls
buildkit image overlay2 runtimes tmp volumes
containers network plugins swarm trust
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用具名挂载
# 如何确定具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
扩展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly 只读
rw readwrite 可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
# ro 只能通过宿2主机操作
初认Dockerfile
Dockerfile
# 创建一个dockerfile文件并输入一下内容, 文件的内容指令(大写)
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
# 构造镜像
[root@VM-0-14-centos dockerfile]# docker build -f /home/dockerfile/dockerfile01 -t home/cnetos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in a8be2ce9428c
Removing intermediate container a8be2ce9428c
---> 64d48c3e3521
Step 3/4 : CMD echo "-----end-----"
---> Running in d035351bfa2d
Removing intermediate container d035351bfa2d
---> 094249c97e7c
Step 4/4 : CMD /bin/bash
---> Running in 57976fed6748
Removing intermediate container 57976fed6748
---> ad892d7da4f0
Successfully built ad892d7da4f0
Successfully tagged home/cnetos:1.0
# 启动镜像
[root@VM-0-14-centos dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
home/cnetos 1.0 ad892d7da4f0 5 minutes ago 209MB
mysql 5.7 6c20ffa54f86 27 hours ago 448MB
redis latest aa4d65e670d6 3 weeks ago 105MB
nginx latest 08b152afcfae 3 weeks ago 133MB
mysql latest c60d96bd2b77 3 weeks ago 514MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
[root@VM-0-14-centos dockerfile]# ls
dockerfile01
[root@VM-0-14-centos dockerfile]# docker run -it ad892d7da4f0
# 查看挂载
[root@VM-0-14-centos home]# docker inspect f301b52470ec
"Mounts": [
{
"Type": "volume",
"Name": "e710d20341dfe981db3106dae45f1c7dd290c7e23b15166e2e57985e96698734",
"Source": "/var/lib/docker/volumes/e710d20341dfe981db3106dae45f1c7dd290c7e23b15166e2e57985e96698734/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "a1ee72f4e26d4ab8576374d4ea62b0750b59e96b64b1e02dae876719930a0eb4",
"Source": "/var/lib/docker/volumes/a1ee72f4e26d4ab8576374d4ea62b0750b59e96b64b1e02dae876719930a0eb4/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# 检查挂载是否成功,容器里创建文件
[root@f301b52470ec volume01]# touch index.php
# 查看宿主机有无
[root@VM-0-14-centos volumes]# cd /var/lib/docker/volumes/e710d20341dfe981db3106dae45f1c7dd290c7e23b15166e2e57985e96698734/_data
[root@VM-0-14-centos _data]# ls
index.php