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

53

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

使用docker-compose v3文件,我只需在每个项目中具有相同的mysql容器配置,并且它们具有相同的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命令来启动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容器?

3个回答

27

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

为此,请创建一个网络:

docker network create shared

将您的网络分配给MySQL容器:

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

对于任何其他需要访问MySQL的容器,只需添加与上述相同的网络定义:

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

10
这引入了一个依赖关系,从不包含mysql的compose文件到包含mysql的compose文件,如果在两个compose文件中都定义了mysql容器,则可以避免这种情况。 - cweiske
1
有没有想法可以在多个Docker Compose项目之间共享一个网络模式设置为“host”的容器。我的要求是在多个Docker Compose项目之间共享单个nginx反向代理容器。由于反向代理容器应在主机网络模式下运行,因此这个解决方案对我来说不起作用。出现了一个错误:“ERROR:'network_mode'和'networks'不能结合使用”对于这种情况有什么想法吗? - chamindaindika
1
我不太清楚这个问题,但我建议您发布一个新的问题,因为您的问题略有不同。 - whites11
2
@cweiske,你解决了这个问题吗?读完你的评论后我有点困惑。如果mysql容器在两个compose文件中都定义了,它是否有效? - Chad Van De Hey

7
如果您的容器仅从其他compose文件创建,则可以在docker-compose中使用外部链接功能。
如果您希望两个docker compose文件都能够创建mysql容器,建议您查看在文件和项目之间共享Compose配置。在这种情况下,您可以创建一个仅定义mysql的基本文件,并在两个应用程序compose文件中进行扩展/合并。

抱歉,我已经使用了--no-recreate选项。我已经更新了问题。 - cweiske

4
我们解决这个问题的方法是使用第三方项目,其中包含我们的微服务所使用的所有共享服务,例如mysql、kafka和redis。
在每个docker-compose文件中,我们都添加了外部链接到这些服务。
虽然有点脏,但它运作得很好。
您可以在Github上关注此问题:https://github.com/docker/compose/issues/2075,该问题讨论的是您正在努力解决的同样的问题。

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