Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker-compose with multiple databases

I'm trying to figure out how to implement docker using docker-compose.yml with 2 databases imported from sql dumps.

httpd:     container_name: webserver     build: ./webserver/     ports:         - 80:80     links:         - mysql         - mysql2     volumes_from:         - app  mysql:     container_name: sqlserver     image: mysql:latest     ports:         - 3306:3306     volumes:         - ./sqlserver:/docker-entrypoint-initdb.d     environment:         MYSQL_ROOT_PASSWORD: root         MYSQL_DATABASE: dbname1         MYSQL_USER: dbuser         MYSQL_PASSWORD: dbpass  mysql2:     extends: mysql     container_name: sqlserver2     environment:         MYSQL_ROOT_PASSWORD: root         MYSQL_DATABASE: dbname2         MYSQL_USER: dbuser         MYSQL_PASSWORD: dbpass  app:     container_name: webdata     image: php:latest     volumes:         - ../php:/var/www/html     command: "true" 

The above returns the following:

Kronos:mybuild avanche$ ./run.sh  Creating sqlserver Creating webdata Creating sqlserver2  ERROR: for mysql2  driver failed programming external connectivity on endpoint sqlserver2 (6cae3dfe7997d3787a8d59a95c1b5164f7431041c1394128c14e5ae8efe647a8): Bind for 0.0.0.0:3306 failed: port is already allocated Traceback (most recent call last):   File "<string>", line 3, in <module>   File "compose/cli/main.py", line 63, in main AttributeError: 'ProjectError' object has no attribute 'msg' docker-compose returned -1 

Basically, I'm trying to get my whole stack setup in a single docker compose file, create 2 databases and import the respective sql dumps. Anyone have any suggestions?

like image 795
Avanche Avatar asked Aug 29 '16 10:08

Avanche


2 Answers

Multiple databases in a single Docker container

The answers elsewhere on this page set up a dedicated container for each database, but a single MySQL server is capable of hosting multiple databases. Whether you should is a different question, but if you want multiple databases in a single container, here's an example.

docker-compose.yml:

version: '3'  volumes:   db:     driver: local    services:     db:       image: mysql:5.7       command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci       volumes:         - ./docker/provision/mysql/init:/docker-entrypoint-initdb.d       environment:         MYSQL_ROOT_PASSWORD: local 

docker/provision/mysql/init/01-databases.sql:

# create databases CREATE DATABASE IF NOT EXISTS `primary`; CREATE DATABASE IF NOT EXISTS `secondary`;  # create root user and grant rights CREATE USER 'root'@'localhost' IDENTIFIED BY 'local'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; 

How does this work?

This works because the MySQL Docker project has an entrypoint script that will run through all files in the /docker-entrypoint-initdb.d folder, if it exists. This is useful for setting up databases and initializing their schema and data. In docker-compose, we're using volumes to map that virtual folder to a folder on the host system.

like image 192
mahemoff Avatar answered Sep 27 '22 22:09

mahemoff


You're trying to bind both database containers to the same port - 3306. Which is essentially impossible. You need to change the port-mapping for one of the databases, for example mysql keeps 3306:3306, and mysql2 should use 3307:3306.

like image 25
Scadge Avatar answered Sep 27 '22 22:09

Scadge