Docker数据卷

容器数据库卷

什么是容器数据卷?

docker的理念:将应用和环境及打包成为一个镜像。

数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求数据可以持久化!

例如,我Docker安装一个MySql,我将MySql删除了,但是我不希望删除它的数据(表)==需求:MySql数据可以存储在本地==

容器之间可以有一个数据共享的技术!将Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,挂载到Linux上面。

总结:就是为了容器的持久化和同步操作!容器之间也是可以数据共享的!

使用数据卷

方式一:直接使用命令来进行挂载 -v

1
2
3
4
5
6
7
docker run -it -v     #主机目录, 容器内目录
#测试
root@LAPTOP-10L6P3UV:/mnt/c/Users/17083/Desktop# cd /home
root@LAPTOP-10L6P3UV:/home# pwd
/home
root@LAPTOP-10L6P3UV:/home# docker run -it -v /home/ceshi:/home centos /bin/bash
#通过Docker inspect 查看容器的信息

在宿主机的/home/ceshi目录下新建一个test.c文件,发现容器之内/home目录下也存在这个文件这就是双向绑定

实战:安装MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 获取镜像
docker pull mysql
# 运行容器的时候需要进行容器挂载 #安装启动mysql,需要配置密码的,这是需要注意的一个点

#官方测试, $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#启动
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置
--name 容器名字
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:5.7

# 启动成功之后,我们在本地的Navicate来进行测试连接,然后是可以进行连接的

#在本地新建一个数据库,查看一下我们的映射路径是否OK!

持久化就是绑定在了本地

假设我们将容器进行删除,发现我们挂载的数据卷仍然没有丢失,这就实现了容器数据的持久化

具名和匿名挂载

1
2
3
4
5
6
7
8
#匿名挂载
-v 容器内的路径
docker run -d -P --name nginx01 -v /etc/nginx

docker volume --help
#查看所有卷的情况
root@LAPTOP-10L6P3UV:/home/mysql/data# docker volume ls
# 这里发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 这里发现这种就是匿名挂载,我们在-v的时候只写了容器内的路径,没有写容器之外的路径


# 具名挂载
root@LAPTOP-10L6P3UV:/home# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
root@LAPTOP-10L6P3UV:/home# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
root@LAPTOP-10L6P3UV:/home# docker volume inspect juming-nginx
[
{
"CreatedAt": "2024-06-11T09:14:55Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]

所有Docker容器内的卷,在没有指定目录的情况之下都是在/var/lib/docker/volumes/xxxxxx/_data,(但是我在WSL中没有找到,毕竟Linux的内存结构与windows存储结构不一样)

算了,还是在Ubuntu上面下载一个Docke,重来一次,耗费了我好多时间!!!

Ubuntu下面的

我么可以通过具名挂载,可以方便的找到 我们的卷,大多数情况下使用具名挂载。

1
2
3
4
# 如何进行确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内的路径 # 匿名挂载
-v 卷名:容器内的路径 # 具名挂载
-v /宿主机路径:容器内的路径 #指定路径挂载

拓展

1
2
3
4
5
6
7
8
# 通过-v 容器内的路径:ro rw 改变读写权限
ro readonly # 可读
rw readwrite # 可读可写
# 一旦设置了容器的权限,容器对于我们挂载出来的内容就有了限定!

docker run -d -P --nama nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# 只要看到了ro就说明这个路径只能通过宿主机来操作,容器内是不能改变的

初识DockerFile

第一种方式使用了commit来构建

DockerFile就是用来构建docker镜像的构建文件!命令脚本,先体验一下!

通过这个脚本可以生镜像,镜像是一层一层的,脚本的一个个命令都是一层!

1
2
3
4
5
6
7
8
# 创建一个dockerfile文件,名字可以是随机的,建议就是一个DockerFile
# 以下是它的文件内容 指令(大写) 参数
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "---end---"
CMD /bin/bash

# 这里的每一个命令都是镜像的一层

1
2
# 启动自己生成的容器
docker run -it 2771b5374df0 /bin/bash

这个卷和外部一定有一个同步的目录

1
2
3
VOLUME ["volume01", "volume02"]          #这一块是匿名挂载
CMD echo "---end---"
CMD /bin/bash

进入volume01在其中添加一个container.txt文件

1
2
3
[root@104f58e694f9 volume01]# touch container.txt
[root@104f58e694f9 volume01]# ls
container.txt

查看以下卷挂载的路径

1
2
3
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS              PORTS     NAMES
104f58e694f9 2771b5374df0 "/bin/bash" About a minute ago Up About a minute silly_kare
root@kyclnx:/home/docker-test-volume# docker inspect 104f58e694f9

然后在宿主机的volume01中查看是否有container.txt文件

1
2
3
4
root@kyclnx:/home/docker-test-volume# cd /var/lib/docker/volumes/79cedab2401c9f142f41f3162548a9329b1ed45dc5a08200561b284158feadd0/_data
root@kyclnx:/var/lib/docker/volumes/79cedab2401c9f142f41f3162548a9329b1ed45dc5a08200561b284158feadd0/_data# ls
container.txt
# 同步成功

这种方式未来使用的很多,因为我们通常会构建自己的镜像

假设构建镜像的时候没有挂载卷,要自动镜像挂载 -v 卷名 容器内路径

数据卷容器

容器之间也是可以数据共享的,假设两个mysql同步数据

谁去挂载了谁,那么就称它为父容器

1
2
3
# 启动三个容器通过我们刚才自己写的镜像启动
# 第一个启动
docker run -it --name docker01 kuangshen/centos
1
2
3
# 第二个启动
docker run -it --name docker02 --volumes-from docker01 kuangshen/centos
# 然后ls-l发现了docker02之中也有volume01和volume02

然后在docker01之中创建一个test.txt的是可以同步到docker02之中去的

1
2
3
4
5
# 第三个启动
docker run -it --name docker03 --volumes-from docker01 kuangshen/centos
#实现了数据共享
# 测试,可以删除docker01,查看一下docker02和docker03是否还可以访问这个文件
# 测试依旧可以进行访问,增加test03.c文件,或者删除已存在的文件,依旧可以实现数据共享。

这种就类似于Linux中的硬链接(现在我还不知道Linux硬链接和软链接)传递的作用

结论:

容器之间可以实现配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦你持久化到了本地,这个时候本地的数据是不会删除的!


Docker数据卷
http://example.com/2024/06/14/docker2_volume/
作者
nianjx
发布于
2024年6月14日
许可协议