[root@localhost data]# cd /var/lib/docker/
[root@localhost docker]# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
[root@localhost docker]# cd volumes/
[root@localhost volumes]# ls
6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49 backingFsBlockDev metadata.db
8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49 ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af gaole
[root@localhost volumes]# ls -al
total 28
drwx-----x. 7 root root 4096 Jan 30 16:34 .
drwx--x---. 13 root root 167 Jan 28 06:16 ..
drwx-----x. 3 root root 19 Jan 30 16:25 6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
drwx-----x. 3 root root 19 Jan 28 21:43 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
drwx-----x. 3 root root 19 Jan 30 16:34 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49
drwx-----x. 3 root root 19 Jan 30 16:25 ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
brw-------. 1 root root 8, 2 Jan 28 06:16 backingFsBlockDev
drwx-----x. 3 root root 19 Jan 30 16:34 gaole
-rw-------. 1 root root 32768 Jan 30 16:34 metadata.db
如果数据在容器中,容器被删除,数据就会被删除。
要求数据可以持久化!
容器之间可以又一个可以数据共享的技术!Docker容器中产生的数据,同步到本地
这就是卷技术,把容器内的目录挂载到宿主机上
假设容器里是/usr/mysql
宿主机是/home/mysql
方式一:
docker run -it -v 宿主机的目录:容器内的目录 -p 主机端口,容器内端口
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect的时候可以看到元数据里又"Mount"的数据:其中source是宿主机目录,destination是目的主机目录
这样就是自动同步,双向绑定,一边有变化,另外一边也会有变化
容器删掉,本地的这个目录还是会存在的!即使容器停止,本地的目录修改,容器里的数据依然会随之变化
练习:mysql
#启动成功后,我们本地的sqlyog来接测试一下
#sqlyog-连接到服务器的3310,容器内的3306,
[root@localhost home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MY_SQL_ROOT_PASSWORD=123456 --name mysql01 mysql
69d523fc04622807e81804e54bd7b4f8a40eda1c13a8a913d23ce3abbbf98b3c
[root@localhost home]# cd /home #-v写两个就可以挂载两个目录
[root@localhost home]# ls
mysql
[root@localhost home]# cd mysql/
[root@localhost mysql]# ls
conf data
[root@localhost mysql]# cd conf/
[root@localhost conf]# ls
[root@localhost conf]# cd ..
[root@localhost mysql]# cd data
[root@localhost data]# ls
[root@localhost data]# ^C
[root@localhost data]# docker rm -f mysql01
mysql01
[root@localhost data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90d02b1d184f mysql "docker-entrypoint.s鈥 42 hours ago Exited (1) 42 hours ago practical_burnell
13c36870224f centos "/bin/bash" 42 hours ago Exited (0) 42 hours ago objective_lamarr
c1d26ff55f14 centos "/bin/bash" 2 days ago Up 42 hours keen_payne
5365c82423ff hello-world "/hello" 2 days ago Exited (0) 42 hours ago clever_ritchie
[root@localhost data]#
[root@localhost data]#
[root@localhost data]# docker volume ls
DRIVER VOLUME NAME
local 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49 #删除容器以后数据卷还是在
匿名挂载
-v 容器路径 #不写宿主机的路径
#
root@localhost data]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -e MY_SQL_ROOT_PASSWORD=123456 --name mysql02 mysql #匿名卷挂载
23aa674d2e1e38f7a45630651ca0767b75527ac65a3fb630d61ffdffffe39753
[root@localhost data]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
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
Run 'docker volume COMMAND --help' for more information on a command.
[root@localhost data]# docker volume ls #显示所有卷
DRIVER VOLUME NAME
local 6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
local 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
local ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
[root@localhost data]#
具名挂载
-v 卷名:容器内路径
docker inspect 容器ID可以查看到Mounts里的数据,就可以知道mount到了那里。并且还有卷的ID
"Mounts": [
{
"Type": "volume",
"Name": "gaole",
"Source": "/var/lib/docker/volumes/gaole/_data",
"Destination": "/etc/mysql/conf.d",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49",
"Source": "/var/lib/docker/volumes/9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
或者用docker volume inspect gaole
[root@localhost data]# docker volume inspect gaole
[
{
"CreatedAt": "2022-01-30T16:34:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/gaole/_data",
"Name": "gaole",
"Options": null,
"Scope": "local"
}
]
[root@localhost data]# docker run -d -P --name mysql03 -v gaole:/etc/mysql/conf.d mysql
57fb2a83ed299638d6413ae4f6262a95334a4f39bd210f6c0eb49bf1fa5ba99c
[root@localhost data]#
[root@localhost data]# docker volume ls #挂载出来就会有卷名
DRIVER VOLUME NAME
local 6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
local 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
local 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49
local ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
local gaole
在这个目录下也会有保存volume的信息,使用具名挂载可以方便的找到我们的卷
[root@localhost data]# cd /var/lib/docker/
[root@localhost docker]# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
[root@localhost docker]# cd volumes/
[root@localhost volumes]# ls
6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49 backingFsBlockDev metadata.db
8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49 ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af gaole
[root@localhost volumes]# ls -al
total 28
drwx-----x. 7 root root 4096 Jan 30 16:34 .
drwx--x---. 13 root root 167 Jan 28 06:16 ..
drwx-----x. 3 root root 19 Jan 30 16:25 6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
drwx-----x. 3 root root 19 Jan 28 21:43 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
drwx-----x. 3 root root 19 Jan 30 16:34 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49
drwx-----x. 3 root root 19 Jan 30 16:25 ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
brw-------. 1 root root 8, 2 Jan 28 06:16 backingFsBlockDev
drwx-----x. 3 root root 19 Jan 30 16:34 gaole
-rw-------. 1 root root 32768 Jan 30 16:34 metadata.db
如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内的路径 #匿名挂在
-v 卷名:容器内的路径 #具名挂载
-v /宿主机路径:容器内的路径 #指定路径挂载
拓展
docker run -d -P --name gaole -v gaole:/etc/test:ro mysql #ro:只读
docker run -d -P --name gaole -v gaole:/etc/test:rw mysql #rw:可读可写
#一旦这个设置了容器的权限,容器对我们挂载出来的内容就有限定了。
#ro,这个路径只能通过宿主机改变,容器内部无法操作。默认是rw