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

时间:2017-08-28 08:53:05

标签: docker docker-compose

我想在同一台服务器上运行多个项目使用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 个答案:

答案 0 :(得分:13)

您可以简单地避免在两个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

答案 1 :(得分:5)

如果您的容器仅使用其他撰写文件创建,则可以使用docker-compose中的external links功能。

如果您希望两个docker compose文件都能够创建mysql容器,我建议您查看Share Compose configurations between files and projects。在这种情况下,您可以创建一个仅定义mysql的基本文件,并在两个应用程序撰写文件中扩展/合并它。

答案 2 :(得分:2)

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

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

它有点脏,但效果很好。

您可以在github上关注此问题,https://github.com/docker/compose/issues/2075 这是在谈论你正在努力解决的同一个问题。