Docker卷挂载语法差异及挂载方向相关疑问
Docker卷挂载常见疑问解答
两种挂载写法的差异本质
你用到的两种写法/home/karen/Documents/:/python和./mysql:/var/lib/mysql,其实都是Docker**绑定挂载(bind mount)**的语法,核心格式都是主机路径:容器内路径,差异仅在于主机路径的表示方式:
/home/karen/Documents/是绝对路径:明确指向主机上的固定目录,无论你在哪个目录下执行Docker命令,这个路径都能被准确识别,所以你用它挂载Python脚本的目录能正常工作。./mysql是相对路径:./代表你执行Docker命令时所在的当前工作目录。比如你在/home/karen/workspace下执行命令,./mysql就对应主机上的/home/karen/workspace/mysql。你用这个写法挂载Python脚本文件失败,大概率是因为执行命令的目录不对——主机当前目录下没有你要挂载的目标路径,或者目录权限不足导致容器无法访问。
挂载路径顺序是否等价?
./mysql:/var/lib/mysql和/var/lib/mysql:./mysql完全不等价,绑定挂载的路径顺序是严格规定的:
- 前者是将主机当前目录下的
mysql目录,挂载到容器内的/var/lib/mysql位置,这是MySQL持久化的正确写法,目的是把容器内的数据库数据目录映射到主机保存。 - 后者是将主机系统目录
/var/lib/mysql(普通用户通常无读写权限),挂载到容器内的./mysql位置(容器的工作目录下的mysql子目录),这既不符合你的需求,还可能因权限问题报错。
补充:Docker卷的两种主要类型
你之前误以为卷挂载只有一种方式,是混淆了绑定挂载的路径写法和卷的类型:
- 绑定挂载:就是你用到的这种主机路径和容器路径映射的方式,灵活性高,但依赖主机的目录结构。
- 命名卷(named volume):写法为
卷名:容器内路径,不需要指定主机路径,Docker会自动在主机的默认存储目录(通常是/var/lib/docker/volumes/下)创建对应的存储目录,更适合数据库这类不需要关心主机具体存储位置的场景。
内容的提问来源于stack exchange,提问作者user24733065
相关产品推荐
相关产品推荐

