web-dev-qa-db-fra.com

docker-compose avec plusieurs bases de données

J'essaie de comprendre comment implémenter docker en utilisant docker-compose.yml avec 2 bases de données importées à partir de vidages SQL.

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"

Ce qui précède renvoie les éléments suivants:

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

Fondamentalement, j'essaie d'obtenir toute la configuration de ma pile dans un seul fichier de composition de docker, de créer 2 bases de données et d'importer les vidages sql respectifs. Quelqu'un a des suggestions?

14
Avanche

Vous essayez de lier les deux conteneurs de base de données au même port - 3306. Ce qui est essentiellement impossible. Vous devez modifier le mappage de port pour l'une des bases de données, par exemple mysql conserve 3306:3306, et mysql2 devrait utiliser 3307:3306.

14
Scadge

Juste comme une mise à jour pour quiconque pourrait se pencher sur ce sujet.

J'ai résolu cela en supprimant:

MYSQL_DATABASE: dbname 

from docker-compose.yml et en ajoutant les instructions de création de base de données pertinentes directement au fichier sql transmis à docker-entrypoint-initdb.d.

À ce stade, les commandes sql sont exécutées sous root, vous devrez donc également ajouter une instruction pour accorder les autorisations appropriées à l'utilisateur de base de données que vous souhaitez utiliser.

13
Avanche

Plusieurs bases de données dans un seul conteneur Docker

Les réponses ailleurs sur cette page ont mis en place un conteneur dédié pour chaque base de données, mais un seul serveur MySQL est capable d'héberger plusieurs bases de données. Si vous devez c'est une question différente , mais si vous voulez plusieurs bases de données dans un seul conteneur, voici un exemple .

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'@'%';

Comment cela marche-t-il?

Cela fonctionne parce que le projet MySQL Docker a un script de point d'entrée qui traversera tous les fichiers du /docker-entrypoint-initdb.d dossier, s'il existe. Ceci est utile pour configurer des bases de données et initialiser leur schéma et leurs données. Dans Docker-compose, nous utilisons volumes pour mapper ce dossier virtuel à un dossier sur le système hôte.

12
mahemoff
version: '3'
services:
  mysql1:
    image: mysql:5.6.26
    environment:
     MYSQL_ROOT_PASSWORD: asdf
     MYSQL_USER: asdf
     MYSQL_Host: localhost
     MYSQL_PASSWORD: asdf
     MYSQL_DATABASE: asdf
    ports:
      - "3307:3306"
  mysql2:
    image: mysql:5.6.26
    environment:
     MYSQL_ROOT_PASSWORD: asdf
     MYSQL_USER: asdf
     MYSQL_Host: localhost
     MYSQL_PASSWORD: asdf
     MYSQL_DATABASE: asdf
    ports:
      - "3308:3306"
  • Après docker-compose up
  • Connectez-vous à mysql1

    mysql -h localhost -uasdf -P 3307 -pasdf asdf --protocol=tcp -D asdf
    
  • Connectez-vous à mysql2

    mysql -h localhost -uasdf -P 3308 -pasdf asdf --protocol=tcp -D asdf
    
5
david_adler