Docker容器数据卷
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。
目录的挂载,将我们的容器内的目录,挂载到Linux上
容器的持久化和同步操作,容器间也是可以数据共享的。
以后修改配置,只在本地修改即可,会自动同步到docker容器内
使用数据卷
方式一:使用命令来挂载 -v
[smile@hadoop101 ~]$ sudo docker run -it -v /home/test:/home centos /bin/bash
[root@e5684c592027 /]#
# 使用 docker inspect 容器id 查看挂载信息

eg:挂载 mysql data目录
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
具名和匿名挂载
# 匿名挂载
# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
[smile@hadoop101 data]$ sudo docker run -d -P --name nginx02 -v /etc/nginx nginx
cfdeb196e97d7739e7f71833c86a0c3088b8525912d85dbcde42ec8471f6d2a3
# 查看所有 volume 的情况
[smile@hadoop101 data]$ sudo docker volume ls
DRIVER VOLUME NAME
local de77542d20244bacb664a433c84efeb7c89375982a69dd42b1390bcb76c02db3
local ed7f90fb393d15f1be09d18d82671d377824c99d8179f1708b48d57ff63697dd
# 这种就是匿名挂载,-v只写了容器内的路径
# 具名挂载
[smile@hadoop101 data]$ sudo docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
239b826e7f9f9c318cb30bc549c687678e54270f30738eb3a87ce0bf3821751b
[smile@hadoop101 data]$ sudo docker volume ls
DRIVER VOLUME NAME
local de77542d20244bacb664a433c84efeb7c89375982a69dd42b1390bcb76c02db3
local ed7f90fb393d15f1be09d18d82671d377824c99d8179f1708b48d57ff63697dd
local juming-nginx
[smile@hadoop101 home]$ sudo docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-03-16T08:03:25-04:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 读写
# 一旦这个设置了容器权限,容器对挂载出来的内容就有限定了
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx04 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作。
Dokcerfile 初识
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!
# 一:创建一个 dockerfile 文件
# 文件中的内容(指令[大写],参数)
# 通过这个脚本可以生产镜像,镜像是一层一层的
# 脚本一个个的命令,每个命令都是一层
FROM centos
VOLUME ["volume01","volume02"] # 匿名挂载
CMD echo "--------end--------"
CMD /bin/bash
[smile@hadoop101 docker-test-volume]$ sudo docker run -it 607ed0af1745 /bin/bash
[root@37af30721b9f /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
# volume01 和 volume02 就是生成镜像的时候自动挂载的 数据卷的目录
"Mounts": [
{
"Type": "volume",
"Name": "c865995f3ceb0a14c16d38ab705291ca95f14fc803f67903e5487c9e8cf99267",
"Source": "/var/lib/docker/volumes/c865995f3ceb0a14c16d38ab705291ca95f14fc803f67903e5487c9e8cf99267/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "b4a2e76fc793102cdaf03b1b63abb061662231db65be414c7d9f331241a99dbb",
"Source": "/var/lib/docker/volumes/b4a2e76fc793102cdaf03b1b63abb061662231db65be414c7d9f331241a99dbb/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
数据卷容器
两个(多个)mysql 同步数据

# 启动三个容器,通过刚才自己写的镜像
sudo docker run -it --name mycentos01 smile/centos:1.0
# 通过 --volumes-from 继承挂载 mycentos01,mycentos01就是数据卷容器
sudo docker run -it --name mycentos02 --volumes-from mycentos01 smile/centos:1.0
# 删除一个容器之后,其他容器不受影响
# 共享卷是双向拷贝,并不是同一份文件
# 所以 多个 mysql 实现数据共享
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
docker run -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,本地的数据是不会删除的