Docker容器数据卷

1 概述

原理

  • Docker:将应用和环境打包成一个镜像
  • 数据?如果数据在容器中,那么我们容器删除,数据就会丢失。需求:数据持久化。
  • 所以:Mysql的数据可以存储在本地。
  • 所以:容器间可以有一个数据共享的技术。 Docker容器中产生的数据,同步到本地。这就是卷技术。
  • 本质上是一种目录挂载,将容器内的目录,挂载到宿主机上。

Docker容器数据卷_第1张图片

Docker容器数据卷_第2张图片

总结:容器的持久化和同步操作,容器间可以数据共享

使用

  • -v 实现文件映射
docker run -it -v 目录映射 -p 端口映射
# -it 交互式
# -v volume卷技术
# -p 主机端口
➜  ~ docker run -it -v /Users/yinkanglong/ceshi:/home centos /bin/bash
  • 使用docker inspect 查看挂载情况mount

Docker容器数据卷_第3张图片

Docker容器数据卷_第4张图片

  • 同步的过程,是一种双向绑定的过程。容器停止后,修改主机文件,再启动容器的时候,数据同样改变

Docker容器数据卷_第5张图片

是同步的过程,还是目录挂载到磁盘的同一个位置了?

实战:安装Mysql

# 获取镜像
docker pull mysql 5.7

# 运行容器,需要做数据挂载
-d 后台运行
-p 端口映射
-v 卷挂载
--name 容器名字
➜  ~ docker run -d -p 3310:3306 -v /Users/yinkanglong/mysql/conf:/etc/mysql/conf.d -v /Users/yinkanglong/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# 启动之后链接数据库服务器进行测试
➜  data mysql -h 127.0.0.1 -P 3310 -uroot -p123456

# 在本地测试创建数据库,查看映射路径是否可以
create table

Docker容器数据卷_第6张图片

2 docker volume数据卷操作

docker volume --help
create      Create a volume
inspect     Display detailed information on one or more volumes
ls          List volumes
prune       Remove all unused local volumes
rm          Remove one or more volumes
  • 查看所有的卷的情况
➜ docker volume ls    
DRIVER    VOLUME NAME
local     635d632e8d79ad10168a6bd6b65ba5b67de68c38c63b619915b6d00db2bd1b4a
local     0704fe09fca1d196b4d4f1cc14141ba05bae986d03ac1209f63ed1cca3d7bd7c
local     924b3cbb61444c73191a11200c727b52f9ccc17dd27024bce61ba63a33577663

# 这里发现的,就是匿名挂载。
  • 查看卷的配置信息
➜ docker volume inspect 635d632e8d79ad10168a6bd6b65ba5b67de68c38c63b619915b6d00db2bd1b4a
[
    {
        "CreatedAt": "2022-10-07T10:04:09Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/635d632e8d79ad10168a6bd6b65ba5b67de68c38c63b619915b6d00db2bd1b4a/_data",
        "Name": "635d632e8d79ad10168a6bd6b65ba5b67de68c38c63b619915b6d00db2bd1b4a",
        "Options": null,
        "Scope": "local"
    }
]

多种挂载方式

匿名挂载和具名挂载

  • 匿名挂载,volume名称是随机生成的字符串。没有指定目录的情况下,都是挂载在/var/lib/docker/volumes/xxxx目录下
  • 具名挂载方式,volume名称是我们指定的字符串。可以很方便地找我们的卷。大多数情况下使用具名挂载。
  • 指定路径挂载。
  • 指定读写权限挂载。容器内对路径的读写权限
    • ro readonly 只读权限
    • rw readwrite 读写权限
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径  # 具名挂载
-v /宿主机绝对路径:容器内路径 # 指定路径挂载
-v ::读写权限 # 指定目录的读写权限。
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

3 DockerFile构建docker镜像文件

Dockerfile 用来构建docker镜像的构建文件!就是命令脚本。

  • 通过这个脚本可以生成镜像,镜像就是一层一层的。脚本是一个个的命令,每个命令是一层。
# 创建一个dockerfile文件,名字尽量为dockerfile
# 文件中的恩荣,指令大写,参数
➜  test_volume cat dockerfile1 
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "--end--"
CMD /bin/bashs
# 这里的每个命令,都是镜像中的一层。

Docker容器数据卷_第7张图片

  • 运行并查看我们自己创建的镜像。可以看到挂载的卷。这是一个匿名挂载,只包含容器内的文件路径。

Docker容器数据卷_第8张图片
Docker容器数据卷_第9张图片

Docker容器数据卷_第10张图片

Docker容器数据卷_第11张图片

  • 使用docker inspect能够查看卷挂载的路径。

  • 最后测试一下文件是否同步。
    Docker容器数据卷_第12张图片

  • mac下无法访问/var/lib/docker目录。解决方案

# 拉取镜像并运行进入VM,然后就可以找到/var/lib/docker
docker run -it --rm --privileged --pid=host justincormack/nsenter1
/ # hostname
docker-desktop
/ # uname -a
Linux docker-desktop 5.10.47-linuxkit #1 SMP Sat Jul 3 21:51:47 UTC 2021 x86_64 Linux
/ # cd /var/lib/docker/containers/
/var/lib/docker/containers # ls

469a5c56d4dcfa1f10228e4a10da5fdef2576d046bf83b99066ded54aeb93f90
a2158f98ccbfe057f8bf4d9c0f3a34b8408ed1bdb22ae72ea90cb781df6af166
b0bca090076ae5e683469b95ef7279b43ae941fb7ad7732ce233057a175225d8
d211d5e9bd3e094b37699e9163825c8941e6eff03c036fd3ffc774364db99493
d4df5c6e11115695fbc4d61cd018ab8a59006a6b9373ba837bf7003df8fd14bb

/var/lib/docker/containers # ls ../volumes/

0bc95ec18e21b6fe455581b48fc8784159e5b3de52037ae0b01dc30a978b3ed7
45f7d5b3f9a819b8035b088d4bfea306f1a54c3c5257cdc0f733d24691be8dcd
54c34557ba83af6f142a0916c7eddc36acdb1652eb9b5123ff5c40f6e1e7e4e8
79d875e4bb162d15417d9a1768b0042c2d08203450dcb904e69f01816927a07a
b2d98f27082a7864f83aaf667858f3fad39a02819cd4e00e61279a7d30589159
backingFsBlockDev
c4a9d80b6636e6dede8c637210dad9abf1b476a63f38848c767802de735a51dc
db8dcda5d651ec433d83cfeee5dd6d4be198a13d9fe5c103410060addab014ac
metadata.db
nginxconfig

4 数据卷容器

共享原理

Docker容器数据卷_第13张图片

数据共享

  • 通过vulumes-from 参数实现数据共享

Docker容器数据卷_第14张图片

docker run -it --name docker01 --volumes-from a04eb38b1a38 yinkanglong/hello

你可能感兴趣的:(docker,docker,adb,容器)