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