Docker进阶(一)挂载——容器数据卷
容器数据卷
卷技术,作用是数据共享。由于容器删除后内部修改的数据也会丢失,因此需要有个地方存储数据。 卷技术可以让容器本地产生的数据映射到本地,卷技术的本质是目录的挂载,将容器内部的目录挂载到宿主机上,实现容器持久化。包括容器间也可以共享
docker -v 主机目录:容器目录
# 就算重启容器,映射关系也还是会存在

安装mysql
navicat连接到云服务器的3305端口,映射到docker容器的3306端口,即可连接成功
docker run -d -p 3305:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
-v:挂载卷
-e:配置环境,这里是设置root密码
本地创建数据库,数据直接是同步的。就算将容器删除,挂载到本地的数据卷中的数据也不会丢失
具名挂载和匿名挂载
匿名挂载
没有给挂载点取名。在-v时没有写容器外的路径,只写了容器内的路径
[root@VM-0-7-centos ~]# docker run -d -P --name jmnginx -v /etc/nginx nginx
可以发现,匿名挂载的外部路径,默认是在 /var/lib/docker/volumes/xxx/_data
[root@VM-0-7-centos ~]# docker volume ls DRIVER VOLUME NAME local 39e68d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b [root@VM-0-7-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 25b3bd3c330b nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp jmnginx [root@VM-0-7-centos ~]# docker inspect jmnginx ………… "Mounts": [ { "Type": "volume", "Name": "5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d", "Source": "/var/lib/docker/volumes/5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d/_data", "Destination": "/etc/nginx", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], …………
具名挂载
为挂载卷指定名字,方便查找卷,一般都是使用具名挂载
[root@VM-0-7-centos _data]# docker run -d -P --name nginx -v jmnginx:/etc/nginx nginx 8052e5458d216512b650455d97713e30fdb0dd31b49e22335cef8bb2a7625532 [root@VM-0-7-centos _data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8052e5458d21 nginx "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp nginx [root@VM-0-7-centos _data]# docker volume ls DRIVER VOLUME NAME local 39e68d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b local 5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d local jmnginx [root@VM-0-7-centos _data]# docker volume inspect jmnginx [ { "CreatedAt": "2021-12-05T16:57:41+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/jmnginx/_data", "Name": "jmnginx", "Options": null, "Scope": "local" } ] [root@VM-0-7-centos _data]#
扩展
为容器挂载出来的内容设置读写权限
[root@VM-0-7-centos _data]# docker run -d -P --name nginx -v jmnginx:/etc/nginx:ro/rw nginx :ro read-only 只读,只可通诺宿主机来操作,容器内不无法操作 :rw read write 可读写(默认)
在DockerFile中挂载
dockerfile用于构建docker镜像的构建文件,命令脚本。docker镜像是一层层的,dockerfile也是一个个命令的。
[root@VM-0-7-centos docker-test-volume]# cat dockerfile01 #新建脚本,注意,脚本中的指令都是大写的 FROM centos VOLUME ["volume01","volume02"] CMD echo "-------------end--------" CMD /bin/bash
构建镜像
-f file名 -t 镜像名
[root@VM-0-7-centos docker-test-volume]# docker build -f dockerfile01 -t yuanzhou/centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 5d0da3dc9764 Step 2/4 : VOLUME ["Vvolume01","volume02"] ---> Running in 794cbe294f47 Removing intermediate container 794cbe294f47 ---> 64be4f7b9f83 Step 3/4 : CMD echo "-------------end--------" ---> Running in f16a4be3b1c0 Removing intermediate container f16a4be3b1c0 ---> e9f0e352192d Step 4/4 : CMD /bin/bash ---> Running in 7c1a9d4a1363 Removing intermediate container 7c1a9d4a1363 ---> 989969f6fbad Successfully built 989969f6fbad Successfully tagged yuanzhou/centos:1.0 [root@VM-0-7-centos docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yuanzhou/centos 1.0 989969f6fbad 3 minutes ago 231MB
启动镜像
这种挂载也较为常用,如果构建镜像时没有挂载,就需要手动-v挂载
[root@VM-0-7-centos docker-test-volume]# docker run -it yuanzhou/centos:1.0 /bin/bash [root@d6afa730c9b7 /]# ls volume01 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume02 #这里的volume01和volume02就是创建镜像时自动挂载的,这种目录属于匿名目录。使用inspect可以查看宿主机的目录 "Mounts": [ { "Type": "volume", "Name": "c432ac4c1479b54b8b2248a5bd982b0d95f2909e605b0d1744bd9734c9f093f6", "Source": "/var/lib/docker/volumes/c432ac4c1479b54b8b2248a5bd982b0d95f2909e605b0d1744bd9734c9f093f6/_data", "Destination": "Vvolume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "358875250c31b98b1b5ff64e17f7873f5b3ed65f75207e5f127d430ef89b5221", "Source": "/var/lib/docker/volumes/358875250c31b98b1b5ff64e17f7873f5b3ed65f75207e5f127d430ef89b5221/_data", "Destination": "volume02", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
数据卷容器
多个容器挂载同一个目录。是容器之间的数据共享

数据卷:挂载的目录
docker run -it --name centos02 --volumes-from d6afa730c9b7 yuanzhou/centos:1.0
--volumes-from 从第一台机器volume出来的容器,数据卷目录的是共享的,即使源容器删掉目录也不会丢失,因为文件本身是存储在宿主机上的
本文来自博客园,作者:我永远喜欢石原里美,转载请注明原文链接:https://www.cnblogs.com/yuan-zhou/p/15641356.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步