docker-compose:通过使用相同的container_name在多个项目之间共享容器

我想为在同一台服务器上运行的多个项目使用MySQL docker容器。

使用docker-compose v3文件,我只需在每个项目中具有相同的mysql容器configuration,并且它们具有相同的container_name

 version: "3" services: app1: image: foo links: - mysql mysql: image: mysql/mysql:5.7 container_name: shared_mysql 

第二个应用程序有一个类似docker-compose.yml文件,但使用app2而不是app1

当运行docker-compose up --no-recreate for app2 ,出现错误:

 Creating shared_mysql ... error ERROR: for shared_mysql Cannot create container for service mysql: Conflict. The container name "/shared_mysql" is already in use by container "deadbeef". You have to remove (or rename) that container to be able to reuse that name. 

我可以做什么来共享多个docker项目之间的MySQL容器?

如果您的容器仅由其他撰写文件创build,则可以使用docker-compose中的外部链接function。

如果您希望两个docker撰写文件能够创buildmysql容器,我build议您查看文件和项目之间的Share Composeconfiguration 。 在这种情况下,您可以创build一个只定义mysql并在两个应用程序组合文件中扩展/合并的基本文件。

你可以简单地避免在两个docker-compose.yml文件之一中重新定义mysql,并将mysql和其他容器连接到同一个networking。

为此,请创build一个networking:

dockernetworking创build共享

分配您的networking到您的MySQL容器:

 version: '3' services: mysql: ... networks: - shared networks: shared: external: name: shared 

对于任何需要访问mysql的其他容器,只需添加与上面相同的networking定义:

 version: '3' services: app1: ... networks: - shared app2: ... networks: - shared ... networks: shared: external: name: shared 

我们通过使用第三个项目来解决这个问题,包括我们的微服务所使用的所有共享服务,如mysql,kafka和redis。

在我们的每一个docker-compose文件中,我们都添加了一个到这些服务的外部链接。

它有点肮脏,但它运作良好。

你可以在github上看到这个问题, https://github.com/docker/compose/issues/2075正在讨论你正在努力的同一个问题。