我看到了码头组合模式,但我很困惑。制作组合容器的最佳方法是什么。
我应该何时使用link
或volumes_from
。
我应该何时使用volumes_from
,volumes
app:
image: someimage
link:
- db // data volume container name
db:
image: mysql
volumes_from:
- data // data volume name
data:
image: someimage
volumes:
- {host data}:{guest data}
app:
image: someimage
link:
- db // data volume container name
db:
image: mysql
volumes:
- data // data file name
应用
app:
image: someimage
volumes_from:
- service // service container name
service:
image: mysql
volumes_from:
- data // image container name
data:
image: someimage
volumes:
- {host data}:{guest data}
app:
image: someimage
volumes_from:
- service // service container name
service:
image: mysql
volumes:
- data // mounted file
由于
答案 0 :(得分:24)
链接和 volumes_from 是不同的概念。当您需要连接(通过网络)两个容器时,将使用链接。在这种情况下,如果要将App连接到数据库,则执行此操作的方法是使用链接,因为应用程序使用端口和主机连接到数据库(而不是文件系统上的目录)。
卷和 volumes_from 的不同之处在于,第一个只声明了docker将使持久性或主机:guest安装的卷,但volumes_from告诉docker使用的卷是已在另一台主机上声明(使其可供此主机使用)。
在您提出的4个案例中,我认为第一个和第二个案例都是不错的选择。首先,您要创建一个仅数据容器,并使mysql容器使用它。在第二种情况下,数据和mysql容器是相同的。
Links和volumes在docker文档中有完美的解释。
希望它有所帮助。
答案 1 :(得分:18)
简而言之:
volumes_from
从其他容器中安装。volumes
安装内联定义。links
连接容器。稍微解释一下:
volumes_from
从其他容器装入卷。例如,如果您只有数据容器,并且您希望仅在具有应用程序代码的容器中装载这些数据。
volumes
是定义和装载卷的内联方式。如果您阅读#17798,您可以看到命名卷在大多数情况下只能替换数据容器。
最简单的就是使用卷。由于您可以通过命名来重复使用它们。
links
不同。因为它无法挂载。相反,它连接容器。所以如果你这样做:
app:
container_name: app_container
links:
- db
这意味着,如果您使用app_container
连接到docker exec -it app_container bash
并尝试ping db
,您将看到该容器能够解析数据库的ip。
这是因为docker在容器之间创建network。
答案 2 :(得分:0)
添加:当您想要装载容器的所有非卷时使用Volumes_from - 从早期开始就可以直接装入命名卷。
AFAIC https://docs.docker.com/compose/compose-file/#volumes。 docker-compose完全删除了这个功能,不确定如何以及为什么以及是否有替代方案。但是假设你有一个app容器,你有一个httpd容器。通常你会将codebase文件夹/ var / www定义为anon卷,然后将其挂载到httpd中以使用httpd服务提供静态文件,同时将所有动态文件(如ruby / php / java)传递给上游后端应用
使用anon卷而非命名卷的重点是,实际上您希望能够重新部署应用程序并更改代码库(应用程序更新),如果应用程序具有命名卷,则无法使用。也就是说,anon卷正是这样做的,这就是为什么在这里使用volumes_from - 在这种情况下使用命名卷是没有选择的(因为它在许多其他情况下非常实用)。
有关volumes_from的升级指南,请参阅: https://docs.docker.com/compose/compose-file/compose-versioning/#upgrading
因此,volumes_from通常用于不同的上下文/场景中,并且命名卷是ll其他情况中的标准,如上所述。关于这一点的简短帖子是https://stackoverflow.com/a/44744861/3625317