Docker Compose 相对路径 vs Docker Volume

45
我有一个用于网站的docker-compose文件,其中包括用于各种目的的其他容器,包括一个具有持久数据的mysql数据库。目前,compose文件为数据指定了相对路径,例如:
 
mysql: 
  image: mysql:5.7
  container_name: sqldb
  volumes:
   - ./mysql_data/_data:/var/lib/mysql
文件夹结构如下:
 --mysql_data
 --static_content
 docker-compose.yml
这意味着在任何时候,我都可以通过复制整个文件夹并运行docker-compose up来将整个站点(包括持久内容)移动到另一台服务器。
但是,在阅读关于Docker卷的文章时,它似乎是首选方法(而且使用“docker run”不支持相对绑定挂载路径,但在compose中有效),所以我想知道是否需要更改此方法以使用卷?这种相对绑定方法本质上是否有问题?如果我切换到卷,移动容器时是否需要手动移动卷(例如使用此方法 How to port data-only volumes from one host to another?)?

{btsdaf} - Jinna Balu
2个回答

73

在Docker中持久化数据

有四种可能的选项来挂载任何卷:

  1. 相对路径
  2. 绝对路径
  3. Docker卷默认路径
  4. 带有绝对路径的Docker卷

以下是上述示例:

version: '3'
services:
    sample:
        image: sample
        volumes:
            - ./relative-path-volume:/var/data-two
            - /home/ubuntu/absolute-path-volume:/var/data-one
            - docker-volume-default-path-volume:/var/data-three
            - docker-volume-absolute-path-volume:/var/data-four
volumes:
  docker-volume-default-path-volume: {}
  docker-volume-absolute-path-volume:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /home/path/of/your/folder

相对路径./relative-path-volume:/var/data-two

绝对路径/home/ubuntu/absolute-path-volume:/var/data-one

Docker卷默认路径docker-volume-default-path-volume:/var/data-three

带有绝对路径的Docker卷docker-volume-absolute-path-volume:/var/data-four

这适用于任何服务器,因为我们将volume设备属性定制为相应的目录路径。


8
嗨Jinna,谢谢你的回复。但是,不同环境下可能存在不同的文件夹结构,这样做不会存在可移植性问题吗?虽然我知道我可以使用Docker卷来解决这个问题,但是我认为使用相对路径绑定的方式具有可移植性的优点(尽管我没有考虑Swarm,这肯定是一个好点子...)。 - statts
很棒的东西,谢谢!这对于设置个人使用的本地配置等方面非常有帮助... - Hatem Jaber
2
虽然这是一个关于可能选项的很好的解释,但它并不能回答关于差异和缺点的问题:“这种相对绑定方法本质上有什么问题吗?如果我切换到卷时,当移动容器时,我是否需要手动移动卷?” - Julius Bullinger
2
因为它并没有真正回答所提出的问题,所以被踩了。 - Switch386
相对量路径是否取决于或与设置的构建上下文有任何关系? - Jarad
Jarad,任何类型的卷挂载都不依赖于构建上下文。 - Jinna Balu

2
回答原问题,你为什么更喜欢一种路径而不是另一种路径的原因完全超出了docker本身的范围。两种方式都没有性能上的优劣之分。
哪种更好完全取决于你的环境,互联网无法回答哪种最好,特别是在没有其他信息的情况下。
你可能想要一个完整的路径,比如/foo/bar,因为这个路径在所有主机上都会存在,比如一个nfs挂载点、一个套接字或者一个全局配置文件。
你可能想要一个相对路径,因为你正在从脚本(如ansible、salt等)构建东西,或者你将在同一主机上运行多个容器,它们都需要独立的数据目录。在这种情况下,使用相对路径的脚本会更容易。
至于为什么要使用卷而不是目录,在serverfault上有一个很好的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接