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?
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.
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.
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
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With