作者简介: 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 \textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容} 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容
个人主页: \textcolor{gray}{个人主页:} 个人主页: 小呆鸟_coding
支持 : \textcolor{gray}{支持:} 支持: 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 \textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦} 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 就是给予我最大的支持! \textcolor{green}{就是给予我最大的支持!} 就是给予我最大的支持!
本文摘要
本专栏将非常细致的讲解docker原理、安装、用docker部署相关服务器以及使用docker部署自己的镜像,非常简单易懂。 本文主要讲解docker数据卷概念以及使用数据卷挂载,实现容器与容器,容器与宿主机之间文件的同步以及相关理论知识。 文章目录
- 1.数据卷介绍
- 1.什么是数据卷
- 2.为什么需要数据卷
- 2.数据卷的使用
- 方式1:直接使用命令来挂载 -v
- 3. 实战:安装MySQL实现数据卷挂载
- 4.具名和匿名挂载
- 1.匿名挂载
- 2.具名挂载
- 3.如何确定是具名挂载还是匿名挂载,还是指定路径挂载
- 4.扩展
- 5.初识Dockerfile
- 1.使用Dockerfile构建一个新的镜像
- 2.执行构建镜像
- 3.启动自己写的容器
- 4.查看卷挂载路径
- 5.测试容器创建的container.txt文件是否同步到宿主机上
- 6.容器数据卷
- 多个mysql实现数据共享
Docker系列文章:
一、Docker概述
二、Docker安装大全
三、Docker 命令大全
四、Docker容器部署
五、Docker镜像详解
六、Docker容器卷详解
七、 Dockerfile详解
八、Docker网路模式详解
笔记总结:https://www.bilibili.com/video/BV1og4y1q7M4
可面试可复习
数据卷(Data Volumes)是宿主机中的一个目录或文件
,数据卷的设计目的就是数据的持久化
,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。当容器目录和数据卷目录绑定后,对方的修改会立即同步
,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
docker是将应用和环境打包成一个镜像。
如果数据都存在容器中,那么我们将容器删除,此时数据就会丢失!需求:数据可持久化!、
例如: 容器当中下载了mysql,你把容器删了,此时mysql中的数据也被删了。需求:MySQL数据可以保存在本地!
方法: 容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!---->这就是卷技术!目录的挂载,将容器内的目录,挂载到linux版本!
卷的设计目的就是数据的持久化
,和同步操作
完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷特性
数据卷可以在容器之间共享和重用,本地与容器间传递数据更高效
对数据卷的修改会立马有效,在容器内部与本地目录均可对数据卷进行修改
对数据卷的更新,不会影响镜像,对数据与应用进行了解耦操作
docker run -it -v 主机目录:容器目录
#之前端口映射docker run -it -p 主机端口:容器端口
(1)查看主机home目录下只有一个lighthouse文件
(2)打开新的连接,查看主机home下多出测试文件
(3)查看挂载信息,通过查看Mounts
# docker inspect 容器id
[root@VM-16-15-centos home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02ea0bceb2c1 centos "/bin/bash" 7 minutes ago Up 7 minutes priceless_bassi
[root@VM-16-15-centos home]# docker inspect 02ea0bceb2c1
[
//..............................
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
//...............................
即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失。
(4)正式测试(容器与本机都启动,通过在容器中创建文件,同步到本机中)
MySQL的数据持久化的问题!
# 获取镜像
[root@VM-16-15-centos /]# docker pull mysql:5.7
#运行容器,需要做数据卷挂载!!! 安装启动mysql,需要配置密码。!!!
#官方文档:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动mysql
-d 后台启动
-p 端口映射
-v 卷挂载
-e 环境变量
--name 容器名字
[root@VM-16-15-centos /]# docker run -d -p 6666: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
#启动成功之后,在本地使用sqlyog来测试一下
#sqlyog-连接到服务器的6666 ----映射到容器的3306 ,这个时候我们就可以连接上了!!
#在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
#在sqlyog中创建一个test1数据库,用服务器查看一下,发现里面多个一个test1数据库
假设将容器删除,发现我们挂载到本地的数据库依旧没有丢失,这就实现了容器的持久化功能!!!
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。
匿名挂载Nginx容器
# 容器挂载
-v 容器内路径!!
docker run -d -P --name nginx01 -v /etc/nginx nginx
[root@VM-16-15-centos /]# docker run -d -P --name nginx02 -v /etc/nginx nginx
fc8882b1c63eeab2747c1f73de277cd17ec6adce03f3858ae80f987a89d78ffb
查看所有的volume的情况
[root@VM-16-15-centos /]# docker volume ls
DRIVER VOLUME NAME
local 6d6823cbffcdc5309333df94acf6646c8e3b49998b17b9da58fd74694ce0b061
local c393f55a28b9e8cd929cc57479c11a48290d74892ed481bc208cb8e881c1d7be
# 这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!
具名挂载,就是指定文件夹名称。
# 通过 -v 卷名:容器内路径
[root@VM-16-15-centos /]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
de989ab4da904d4485d09134ef75fbbdc902a17eb1f1ce088161e1331d04e1d1
[root@VM-16-15-centos /]# docker volume ls
DRIVER VOLUME NAME
local 6d6823cbffcdc5309333df94acf6646c8e3b49998b17b9da58fd74694ce0b061
local c393f55a28b9e8cd929cc57479c11a48290d74892ed481bc208cb8e881c1d7be
local juming-nginx
[root@VM-16-15-centos /]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-06-13T22:29:41+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/xxxx/_data
查看宿主机中的nginx信息
[root@VM-16-15-centos /]# cd /var/lib/docker/volumes
[root@VM-16-15-centos volumes]# ls
6d6823cbffcdc5309333df94acf6646c8e3b49998b17b9da58fd74694ce0b061 juming-nginx
backingFsBlockDev metadata.db
c393f55a28b9e8cd929cc57479c11a48290d74892ed481bc208cb8e881c1d7be
#为了方便找到一个卷,通常使用具名挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
# 通过 -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说明这个路径只能通过宿主机来操作,容器内部无法操作
Dockerfile就是用来构建docker镜像的文件!之前使用commint生成过dockerfile文件!相当于命令脚本,执行一下就可以!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个一个命令,每一个命令都是一层。
使用Dockerfile构建一个新的镜像,dockerfile1文件的内容,匿名挂载了volume01和volume02两个目录:
# 创建一个dockerfile1文件,文件中的内容,指令(大写) 参数
FORM centos
VOLUME ["volume01","volume02"]
CMD echo "----end-----"
CMD /bin/bash
#这里的每个命令,相当于镜像的每一层!!
[root@VM-16-15-centos home]# ls
ceshi lighthouse mysql
[root@VM-16-15-centos home]# mkdir docker-test-volume
[root@VM-16-15-centos home]# ls
ceshi docker-test-volume lighthouse mysql
[root@VM-16-15-centos home]# cd docker-test-volume/
[root@VM-16-15-centos docker-test-volume]# pwd
/home/docker-test-volume
[root@VM-16-15-centos docker-test-volume]# vim dockerfile1
[root@VM-16-15-centos docker-test-volume]# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end-----"
CMD /bin/bash
[root@VM-16-15-centos docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t dainiao/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 6c7c6458686b
Removing intermediate container 6c7c6458686b
---> 54d3b2a0f91f
Step 3/4 : CMD echo "----end-----"
---> Running in 86c3cdc908f3
Removing intermediate container 86c3cdc908f3
---> 2e803cd56d51
Step 4/4 : CMD /bin/bash
---> Running in 4cfe823935ab
Removing intermediate container 4cfe823935ab
---> 1195689ed478
Successfully built 1195689ed478
Successfully tagged dainiao/centos:1.0
这个卷和外部一定是有一个同步的目录!!,既然是匿名挂载,说明它是一个很长的乱码
[root@VM-16-15-centos ~]# docker inspect 78ce864e3f51
[
//..............................................
"Mounts": [
{
"Type": "volume",
"Name": "26ae14e541828174ac5cdf92c52f3a5d49c54178e88652530f2211ddc1b6b82a",
"Source": "/var/lib/docker/volumes/26ae14e541828174ac5cdf92c52f3a5d49c54178e88652530f2211ddc1b6b82a/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "cd929119db2de76e2502990643d82d147f512503ca8f0ae92d4aadee8146e54e",
"Source": "/var/lib/docker/volumes/cd929119db2de76e2502990643d82d147f512503ca8f0ae92d4aadee8146e54e/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
//...........................................
可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。
查看卷挂载路径,发现之前的volume01和volume02挂载成功
这种方式使用次数多,因为在构建自己镜像的时候,就直接挂载卷,如果构建镜像的时候,没有挂载卷,就要手动镜像挂载(具名或者匿名挂载) -v 卷名:容器内路径
[root@VM-16-15-centos ~]# cd /var/lib/docker/volumes/26ae14e541828174ac5cdf92c52f3a5d49c54178e88652530f2211ddc1b6b82a/_data
[root@VM-16-15-centos _data]# ls
container.txt
容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
(1)首先启动容器1,volume01、volume02为挂载目录。
注意:这里在使用名字启动的话,后面要带着标签也就是dainiao/centos:1.0,或者你直接用id启动 docker run -it --name docker01 1195689ed478
docker run -it --name docker01 dainiao/centos:1.0
(2)启动容器2,通过参数--volumes-from
,设置容器2和容器1建立数据卷挂载关系
docker run -it --name docker02 --volumes-from docker01 dainiao/centos:1.0
(3)验证在docker01中加文件,看看docker02中是否增加文件
(4)目前docker02和docker01挂载成功,现在创建一个docker03,实现和docker01挂载
docker02和docker03都是继承于docker01的
(5)删除docker01,查看docker02和docker03依旧可以访问这个文件
这是一个拷贝的概念,docker02和docker03将共享的数据拷贝到自己上面,当docker01挂掉后,docker02和docker03仍然数据存在
[root@VM-16-15-centos /]# docker run -d -p 6666:3306 -v /home/mysql/conf -v /home/mysql/data -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@VM-16-15-centos /]# docker run -d -p 6666:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#这个时候可以实现俩个数据同步!!
结论:容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦持久化到了本地,这个时候,本地数据是不会删除的