Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker-compose: Sharing container between multiple projects by using the same container_name

I want to use a MySQL docker container for multiple projects running on the same server.

Using docker-compose v3 files, I simply have the same mysql container configuration in each of the projects, and they have the same container_name:

version: "3"

services:
  app1:
    image: foo
    links:
      - mysql

  mysql:
    image: mysql/mysql:5.7
    container_name: shared_mysql

The second application has a similar docker-compose.yml file, but with app2 instead of app1.

When running docker-compose up --no-recreate for app2, I get an error:

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.

What can I do to share the MySQL container between multiple docker projects?

like image 455
cweiske Avatar asked Aug 28 '17 08:08

cweiske


People also ask

How do containers communicate with each other Docker compose?

For containers to communicate with other, they need to be part of the same “network”. Docker creates a virtual network called bridge by default, and connects your containers to it. In the network, containers are assigned an IP address, which they can use to address each other.

How multiple containers communicate with each other?

If you are running more than one container, you can let your containers communicate with each other by attaching them to the same network. Docker creates virtual networks which let your containers talk to each other. In a network, a container has an IP address, and optionally a hostname.


3 Answers

You can simply avoid redefining the mysql in one of the two docker-compose.yml files and connect mysql and the other containers to the same network.

In order to do so, create a network:

docker network create shared

Assign your network to your mysql container:

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

For any other container that has need to access mysql, just add the same network definition as above:

version: '3'
services:
  app1:
    ...
    networks:
    - shared
  app2:
    ...
    networks:
    - shared
  ...
networks:
  shared: 
    external:
      name: shared
like image 199
whites11 Avatar answered Oct 22 '22 21:10

whites11


If your container is only created from other compose file you can use the external links feature in docker-compose.

If you want both docker compose files to be able to create the mysql container, I suggest you look into Share Compose configurations between files and projects. In this case, you can create a base file that only defines mysql and extend/merge it in both apps compose files.

like image 31
yamenk Avatar answered Oct 22 '22 19:10

yamenk


We solve it by using a third project including all the shared services our micro-services are using like mysql, kafka and redis.

in each one of our docker-compose files, we added a external links to those services.

Its a little bit dirty but it working well.

You can follow this issue on github, https://github.com/docker/compose/issues/2075 that is talking about the same issue you struggling with.

like image 4
Yuri Ritvin Avatar answered Oct 22 '22 21:10

Yuri Ritvin