web-dev-qa-db-ja.com

複数のデータベースを使用したdocker-compose

SQLダンプからインポートされた2つのデータベースでdocker-compose.ymlを使用してdockerを実装する方法を見つけようとしています。

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"

上記は以下を返します:

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

基本的に、単一のdocker composeファイルでスタック設定全体を取得し、2つのデータベースを作成して、それぞれのSQLダンプをインポートしようとしています。誰か提案がありますか?

14
Avanche

両方のデータベースコンテナを同じポート(3306)にバインドしようとしています。これは本質的に不可能です。データベースの1つのポートマッピングを変更する必要があります。たとえば、mysql3306:3306を保持し、mysql23307:3306を使用する必要があります。

14
Scadge

これを検討する可能性のある他の人への更新として。

私はこれを解決して解決しました:

MYSQL_DATABASE: dbname 

from docker-compose.ymlおよび関連するデータベース作成ステートメントをdocker-entrypoint-initdb.dに渡されるsqlファイルに直接追加します。

その段階で、SQLコマンドはルートの下で実行されるため、使用するデータベースユーザーに関連する権限を付与するステートメントも追加する必要があります。

13
Avanche

単一のDockerコンテナー内の複数のデータベース

このページの他の部分の回答では、各データベース専用のコンテナを設定していますが、単一のMySQLサーバーで複数のデータベースをホストできます。 別の質問 が必要かどうか。ただし、単一のコンテナに複数のデータベースが必要な場合は、 例はこちら です。

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

これはどのように作動しますか?

これは、 MySQL Dockerプロジェクトエントリポイントスクリプト があり、/docker-entrypoint-initdb.dフォルダー(存在する場合)。これは、データベースをセットアップし、そのスキーマとデータを初期化するのに役立ちます。 docker-composeでは、volumesを使用して、その仮想フォルダーをホストシステム上のフォルダーにマップします。

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"
  • docker-compose upの後
  • Mysql1に接続する

    mysql -h localhost -uasdf -P 3307 -pasdf asdf --protocol=tcp -D asdf
    
  • Mysql2に接続する

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