在使用docker时,如果不挂载数据卷直接运行一个容器,在删除容器时会丢失所有新增或修改的数据,并且经常会遇到多个容器需要访问同一份数据的情况,所以我们在运行一个容器时需要挂载数据卷来达到数据共享和数据持久化的目的。

root@docker1:/home/z9999# docker volume --help                                             \\查看docker volume命令帮助

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@docker1:/home/z9999# docker volume create test                                           \\创建一个名为test的数据卷
testroot@docker1:/home/z9999# docker volume ls                                                    \\打印已有数据卷
DRIVER    VOLUME NAME
local     testroot@docker1:/home/z9999# docker volume inspect test                                         \\查看test数据卷的信息
[
    {
        "CreatedAt": "2022-10-20T12:36:26Z",                                                         \\创建时间
        "Driver": "local",                                                                           
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test/_data",                                           \\该数据卷再系统中的位置
        "Name": "test",
        "Options": {},
        "Scope": "local"
    }
]root@docker1:/home/z9999# docker run -it -d -v test:/tmp nginx                                 \\创建一个容器并挂载数据卷
ee4dd210ec4a49f0e4a15ceea93bac354620572a6e435810d4b066d501a7e6ff
root@docker1:/home/z9999# docker exec -it ee bash                                              \\进入容器并写一个文件到挂载数据卷的目录中
root@ee4dd210ec4a:/# echo $HOSTNAME > /tmp/test                                               
root@ee4dd210ec4a:/# cat /tmp/test
ee4dd210ec4a
root@ee4dd210ec4a:/#
exit                                                                                 \\退出容器
root@docker1:/home/z9999# cat /var/lib/docker/volumes/test/_data/test                 \\在系统中查看数据卷中的内容,发现刚才写的内容已经在里面了
ee4dd210ec4a 
root@docker1:/home/z9999# docker rm -f ee                                          \\删除刚才挂载这个卷的容器
ee
root@docker1:/home/z9999# cat /var/lib/docker/volumes/test/_data/test               \\删除容器后刚才写入的数据并未丢失
ee4dd210ec4a 
root@docker1:/home/z9999# docker run -it -d -v test:/tmp httpd                       \\重新运行一个容器并挂载test数据卷
f31500655226b1b77b175bad1dfd3f9cf87b517173f1177c1325121090ed768d
root@docker1:/home/z9999# docker exec -it f3 bash
root@f31500655226:/usr/local/apache2# cat /tmp/test                                   \\到挂载点查看刚才写入的文件
ee4dd210ec4a

由此可见删除容器不会对写入到数据卷中的数据有任何影响,并且仍然可以挂载到其他容器

以数据卷的方式,将自定义的宿主机目录或文件提供给容器使用,比如容器可以直接挂载宿主机本地的数据目录(如mysql容器的数据持久化)、

配置文件(如nginx的配置文件)、静态文件(如web服务的图片或js文件)等,只需要在创建容器的时候指定挂载即可。

root@docker1:/home/z9999# echo "testapp web page" > /data/testapp/index.html                            
root@docker1:/home/z9999# cat /data/testapp/index.html
testapp web page
root@docker1:/home/z9999# docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -v test:/tmp -p 80:80 nginx  \\一个容器可以写多个-v参数挂载    
45168a44de5bdd52cd76cf42a5924230feb9189a28599bef6c6e9012816356a0
root@docker1:/home/z9999# docker run -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 81:80 nginx      \\后面的ro表示以只读权限挂载 
6e17be9c8e59b428f0f2e06f46c3f3013ebd5c447613664dcba12bf298b6d538

\\把写好的html文件挂载到两个nginx容器存放页面的目录,并将容器的端口分别映射到本地不同的端口

docker新版不会创建目录 docker create volume_docker

docker新版不会创建目录 docker create volume_docker新版不会创建目录_02

 

root@docker1:/home/z9999# docker ps -aq | xargs docker rm -f    \\强制删除刚才测试用的容器
6e17be9c8e59
45168a44de5b
d36a2a7b4f7f
f31500655226

root@docker1:/home/z9999# docker volume prune      \\删除容器后可以使用“docker volume prune”删除未在使用的额容器(生产环境请谨慎操作!个人认为docker rm DOCKERNAME风险更低)
WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: test Total reclaimed space: 13B