注:此笔记依据B站狂神说,想学习点此链接可直接跳转一、容器数据卷 将应用和环境打包成一个镜像!如果数据都在容器中,那么我们容器删除,数据就会丢失!比如MySQL,容器删了,删库跑路!那就需要保证MySQL数据可以存储在本地!
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!这就是卷技术,目录的挂载,将我们容器内的目录挂载到 linux 目录上面!
总结: 容器的持久化和同步操作!容器间数据也是可以共享的!
【Docker|Docker第五篇【容器数据卷、匿名和具名挂载、DockerFile】】方式一:直接命令挂载:docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
docker run -it -v /home/ceshi:/home centos /bin/bash
文章图片
文章图片
也可以用
docker inspect 容器id
查看挂载信息文章图片
方式二:具名和匿名挂载
[root@VM-12-16-centos ~]# docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
43c0eba85449tomcat"catalina.sh run"6 days agoUp 6 days0.0.0.0:8080->8080/tcp, :::8080->8080/tcptomcat01
f594e620f359nginx"/docker-entrypoint.…"6 days agoUp 6 days0.0.0.0:3344->80/tcp, :::3344->80/tcpnginx01
4d241f98e11acentos"/bin/bash -c 'while…"7 days agoUp 7 daysnice_dewdney
[root@VM-12-16-centos ~]# docker run -d -P --name nginxtest -v /etc/nginx nginx
f467d3c292c0c2ad6567eda3a13eb2556eb7a9b6b3e50f7325a4352a32b9238f
[root@VM-12-16-centos ~]# docker volume ls
DRIVERVOLUME NAME
local5ed968a63ef344d47b5b95dc00210a8ff3fab1d2fd2308c4db0266db89deebe8
[root@VM-12-16-centos ~]# docker run -d -P --name nginxtest02 -v jumingnginx:/etc/nginx nginx
2f35d38119ab35da0886862fbc470d49db47403969a2a368fa3118583f98f846
[root@VM-12-16-centos ~]# docker volume ls
DRIVERVOLUME NAME
local5ed968a63ef344d47b5b95dc00210a8ff3fab1d2fd2308c4db0266db89deebe8
localjumingnginx
[root@VM-12-16-centos ~]# docker volume inspect jumingnginx
[
{
"CreatedAt": "2022-01-09T09:22:22+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/jumingnginx/_data",
"Name": "jumingnginx",
"Options": null,
"Scope": "local"
}
]
方式三:指定路径挂载
[root@VM-12-16-centos ~]# docker run -d -P --name nginxtest03 -v /home/nginx03:/etc/nginx.conf.d nginx
5ffc1114eaa0e8ebebdeb83fa1f86104e27fd464564d617e74b4d908f628ca9c
[root@VM-12-16-centos ~]# docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
5ffc1114eaa0nginx"/docker-entrypoint.…"7 seconds agoUp 5 seconds0.0.0.0:49155->80/tcp, :::49155->80/tcpnginxtest03
2f35d38119abnginx"/docker-entrypoint.…"7 minutes agoUp 7 minutes0.0.0.0:49154->80/tcp, :::49154->80/tcpnginxtest02
f467d3c292c0nginx"/docker-entrypoint.…"9 minutes agoUp 9 minutes0.0.0.0:49153->80/tcp, :::49153->80/tcpnginxtest
43c0eba85449tomcat"catalina.sh run"6 days agoUp 6 days0.0.0.0:8080->8080/tcp, :::8080->8080/tcptomcat01
f594e620f359nginx"/docker-entrypoint.…"6 days agoUp 6 days0.0.0.0:3344->80/tcp, :::3344->80/tcpnginx01
4d241f98e11acentos"/bin/bash -c 'while…"7 days agoUp 7 daysnice_dewdney
[root@VM-12-16-centos ~]# docker volume ls
DRIVERVOLUME NAME
local5ed968a63ef344d47b5b95dc00210a8ff3fab1d2fd2308c4db0266db89deebe8
localjumingnginx
所有的docker容器内的卷,没有指定目录的情况下都是在
/var/lib/docker/volumes/xxxx/_data
下,如果指定了目录,docker volume ls
是查看不到的。三种挂载: 匿名挂载、具名挂载、指定路径挂载二、DockerFile Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:#容器内路径 指定路径挂载 docker volume ls 是查看不到的
#创建一个dockerfile文件,名字可以随便 建议Dockerfile
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#这里的每个命令,就是镜像的一层!
生成镜像步骤:
1、编写镜像脚本
[root@VM-12-16-centos home]# mkdir docker-test-volume
[root@VM-12-16-centos home]# ls
ceshidocker-test-volumelighthousenginx03
[root@VM-12-16-centos home]# cd docker-test-volume/
[root@VM-12-16-centos docker-test-volume]# vi dockerfile01 # 编写镜像脚本
[root@VM-12-16-centos docker-test-volume]# cat dockerfile01
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
2、构建镜像
[root@VM-12-16-centos docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t kuangshen/centos:1.0 . #不要忘记这个点
Sending build context to Docker daemon2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 9e122b475efb
Removing intermediate container 9e122b475efb
---> c798ffb17302
Step 3/4 : CMD echo "----end----"
---> Running in 87baa832d5b1
Removing intermediate container 87baa832d5b1
---> beea4615b125
Step 4/4 : CMD /bin/bash
---> Running in 507aea869366
Removing intermediate container 507aea869366
---> 45bcf6025466
Successfully built 45bcf6025466
Successfully tagged kuangshen/centos:1.0
[root@VM-12-16-centos docker-test-volume]# docker images
REPOSITORYTAGIMAGE IDCREATEDSIZE
kuangshen/centos1.045bcf602546628 seconds ago231MB
3、运行这个镜像
[root@VM-12-16-centos docker-test-volume]# docker run -it 45bcf6025466 /bin/bash
[root@42661e3916a9 /]# ls -l
total 56
lrwxrwxrwx1 root root7 Nov32020 bin -> usr/bin
drwxr-xr-x5 root root360 Jan9 01:45 dev
drwxr-xr-x1 root root 4096 Jan9 01:45 etc
drwxr-xr-x2 root root 4096 Nov32020 home
lrwxrwxrwx1 root root7 Nov32020 lib -> usr/lib
lrwxrwxrwx1 root root9 Nov32020 lib64 -> usr/lib64
drwx------2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x2 root root 4096 Nov32020 media
drwxr-xr-x2 root root 4096 Nov32020 mnt
drwxr-xr-x2 root root 4096 Nov32020 opt
dr-xr-xr-x 132 root root0 Jan9 01:45 proc
dr-xr-x---2 root root 4096 Sep 15 14:17 root
drwxr-xr-x11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx1 root root8 Nov32020 sbin -> usr/sbin
drwxr-xr-x2 root root 4096 Nov32020 srv
dr-xr-xr-x13 root root0 Jan9 01:45 sys
drwxrwxrwt7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x20 root root 4096 Sep 15 14:17 var
drwxr-xr-x2 root root 4096 Jan9 01:45 volume01 #这个目录就是我们生成镜像的时候自动挂载的,数据卷目录
drwxr-xr-x2 root root 4096 Jan9 01:45 volume02[root@VM-12-16-centos docker-test-volume]# docker inspect 42661e3916a9 #可以查看一下
文章图片
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
多个容器之间实现数据共享
[root@VM-12-16-centos /]# docker run -it --name docker01 kuangshen/centos:1.0
[root@49ee0ba1633e /]# [root@VM-12-16-centos /]# docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
49ee0ba1633ekuangshen/centos:1.0"/bin/sh -c /bin/bash"19 seconds agoUp 18 secondsdocker01
5ffc1114eaa0nginx"/docker-entrypoint.…"45 minutes agoUp 45 minutes0.0.0.0:49155->80/tcp, :::49155->80/tcpnginxtest03
2f35d38119abnginx"/docker-entrypoint.…"52 minutes agoUp 52 minutes0.0.0.0:49154->80/tcp, :::49154->80/tcpnginxtest02
f467d3c292c0nginx"/docker-entrypoint.…"54 minutes agoUp 54 minutes0.0.0.0:49153->80/tcp, :::49153->80/tcpnginxtest
43c0eba85449tomcat"catalina.sh run"6 days agoUp 6 days0.0.0.0:8080->8080/tcp, :::8080->8080/tcptomcat01
f594e620f359nginx"/docker-entrypoint.…"6 days agoUp 6 days0.0.0.0:3344->80/tcp, :::3344->80/tcpnginx01
4d241f98e11acentos"/bin/bash -c 'while…"7 days agoUp 7 daysnice_dewdney
[root@VM-12-16-centos /]# docker run -it --name docker02 --volumes-from docker01 kuangshen/centos:1.0
测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件
测试依旧可以访问
多个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|Docker 常见配置相关问题
- Docker学习|Docker 容器数据卷
- git|qinglong青龙面板使用
- docker|docker 容器数据卷+具名挂载匿名挂载
- Docker|Docker第四篇【Docker镜像原理、commit镜像】
- Docker学习|Docker 镜像讲解
- Docker|Docker【2】 | 大白话带你快速安装Docker,不懂你捶我
- kubernetes|Kubernetes集群StorageClass持久化存储资源核心概念以及使用
- 青龙面板|青龙面板2.10.2搭建+XDD-PLUS搭建,保姆级搭建教程。【21年12月15日更新】