1、使用场景
将容器中的文件挂载到宿主机上,便于修改,配置,而不需要重新发布容器。
通俗描述:Docker容器启动时 当使用宿主目录直接挂载容器目录时,会出现宿主目录覆盖容器目录的情况。在部署前端项目时,想将静态文件资源暴露宿主机,一开始直接使用宿主目录进行挂载,如下代码。
version: '3.9'
services:
nginx:
image: yxs970707/deploy-web-demo:1.0.0
container_name: web
restart: always
ports:
- 7777:80
volumes:
- /volumes/web/html:/usr/share/nginx/html
部署完毕后发现宿主目录直接将容器目录覆盖了,导致容器内目录被清空
2、解决方案
解决这个问题就是使用具名 Volume 。
version: '3.9'
volumes:
web-html:
name: web-html
driver: local
driver_opts:
o: bind
type: none
device: /volumes/web/html
services:
nginx:
image: yxs970707/deploy-web-demo:1.0.0
container_name: web
restart: always
ports:
- 7777:80
volumes:
- web-html:/usr/share/nginx/html
3、案例说明
version : '3.8'
volumes:
nginx-web-html:
name: nginx-web-html
driver: local
driver_opts:
o: bind
type: none
device: D:/dockerFile/home/zzzhcj/nginx/www
services:
zzzhcj-nginx-web:
container_name: zzzhcj-nginx-web
image: registry.cn-hangzhou.aliyuncs.com/jinhu-zzzhcj/zzzhcj-nginx-web:latest
environment:
- TZ=Asia/Shanghai
volumes:
- nginx-web-html:/home/zzzhcj/www #网站UI,需要以具名的方式挂载,才不会被覆盖
- D:/dockerFile/home/zzzhcj/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录
- D:/dockerFile/home/zzzhcj/nginx/logs:/var/log/nginx #日志
- D:/dockerFile/home/zzzhcj/nginx/conf.d:/etc/nginx/conf.d #配置
# - /home/zzzhcj/nginx/www:/home/zzzhcj/www #网站UI
# - /home/zzzhcj/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录
# - /home/zzzhcj/nginx/logs:/var/log/nginx #日志
# - /home/zzzhcj/nginx/conf.d:/etc/nginx/conf.d #配置
ports:
- "80:80"
networks:
- zzzhcjlocalhost
networks:
zzzhcjlocalhost:
4、结果验证
查看是否映射成功
docker volume inspect nginx-web-html
5、【特别注意坑】
如果操作失当,未能成功挂载到自己定义的路径下,容器默认会在如下路径映射
/var/lib/docker/volumes/nginx-web-html/_data
当删除容器的时候,一定要将对应卷删除,或者直接进入以上路径,直接清除,要不然下次重启容器,旧的文件没有覆盖,导致运行的还是老程序!!!!!