MySQL 8.0 リファレンスマニュアル


2.5.6.2 Docker での MySQL Server のデプロイに関するその他のトピック

注記

次のほとんどのサンプルコマンドでは、(docker pull コマンドや docker run コマンドなどを使用して) 指定する必要がある場合、mysql/mysql-server が Docker イメージリポジトリとして使用されます。イメージが別のリポジトリからのものである場合は、次のように変更 My Oracle Support からダウンロードされた mysql/enterprise-server for MySQL Enterprise Edition イメージ。

Docker 用に最適化された MySQL インストール

MySQL 用の Docker イメージはコードサイズ用に最適化されています。つまり、Docker コンテナで MySQL インスタンスを実行する大部分のユーザーに関連することが予想される重要なコンポーネントのみが含まれています。 MySQL Docker のインストールは、次の点で共通の non-Docker のインストールとは異なります:

  • 含まれるバイナリは、次のものに制限されます:

    • /usr/bin/my_print_defaults

    • /usr/bin/mysql

    • /usr/bin/mysql_config

    • /usr/bin/mysql_install_db

    • /usr/bin/mysql_tzinfo_to_sql

    • /usr/bin/mysql_upgrade

    • /usr/bin/mysqladmin

    • /usr/bin/mysqlcheck

    • /usr/bin/mysqldump

    • /usr/bin/mysqlpump

    • /usr/bin/mysqlbackup ( MySQL Enterprise Edition 8.0 の場合のみ)

    • /usr/sbin/mysqld

  • すべてのバイナリが削除され、デバッグ情報は含まれません。

MySQL Server の構成

MySQL Docker コンテナを起動するときに、docker run コマンドを使用して構成オプションをサーバーに渡すことができます。 例:

docker run --name mysql1 -d mysql/mysql-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_col

このコマンドは、utf8mb4 をデフォルトの文字セットとして、utf8mb4_col をデータベースのデフォルトの照合順序として使用して、MySQL Server を起動します。

MySQL Server を構成する別の方法は、構成ファイルを準備し、コンテナ内のサーバー構成ファイルの場所にマウントすることです。 詳細は、データおよび構成の変更の永続化 を参照してください。

データおよび構成の変更の永続化

Docker コンテナは原則的に一時的なものであり、コンテナが削除または破損した場合、データまたは構成は失われることが予想されます (ディスカッション「ここ」を参照)。 ただし、「Docker ボリューム」には、Docker コンテナ内で作成されたデータを永続化するメカニズムが用意されています。 初期化時に、MySQL Server コンテナはサーバーデータディレクトリの Docker ボリュームを作成します。 コンテナで docker inspect コマンドを実行するための JSON 出力には Mount キーがあり、その値によってデータディレクトリボリュームに関する情報が提供されます:

shell> docker inspect mysql1
...
 "Mounts": [
            {
                "Type": "volume",
                "Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
                "Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...

出力には、データがホストに永続化されるソースフォルダ/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data が、コンテナ内のサーバーデータディレクトリである/var/lib/mysql にマウントされていることが示されています。

データを保持する別の方法は、コンテナの作成時に --mount オプションを使用してホストディレクトリを bind-mount に保存することです。 同じ方法を使用して、サーバーの構成を永続化できます。 次のコマンドは、MySQL Server コンテナを作成し、データディレクトリとサーバー構成ファイルの両方をバインドマウントします:

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d mysql/mysql-server:tag

このコマンドは、path-on-host-machine/my.cnf/etc/my.cnf (コンテナ内のサーバー構成ファイル) にマウントし、path-on-host-machine/datadir/var/lib/mysql (コンテナ内のデータディレクトリ) にマウントします。 バインドマウントが機能するには、次の条件を満たす必要があります:

  • 構成ファイル path-on-host-machine/my.cnf がすでに存在し、ユーザー mysql を使用してサーバーを起動するための仕様が含まれている必要があります:

    [mysqld]
    user=mysql

    ファイルに他のサーバー構成オプションを含めることもできます。

  • データディレクトリ path-on-host-machine/datadir がすでに存在している必要があります。 サーバーの初期化を実行するには、ディレクトリが空である必要があります。 データが事前移入されたディレクトリをマウントしてサーバーを起動することもできますが、データを作成したサーバーと同じ構成で Docker コンテナを起動する必要があり、コンテナの起動時に必要なホストファイルまたはディレクトリがマウントされていることを確認する必要があります。

追加の初期化スクリプトの実行

作成直後にデータベースで実行する .sh または .sql スクリプトがある場合は、それらをホストディレクトリに配置してから、そのディレクトリをコンテナ内の/docker-entrypoint-initdb.d/にマウントできます。 例:

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d mysql/mysql-server:tag
別の Docker コンテナ内のアプリケーションから MySQL への接続

Docker ネットワークを設定すると、別の Docker コンテナ内のクライアントアプリケーションがサーバーコンテナ内の MySQL Server にアクセスできるように、複数の Docker コンテナが相互に通信できるようになります。 まず、Docker ネットワークを作成します:

docker network create my-custom-net

次に、サーバーおよびクライアントコンテナを作成して起動するときに、--network オプションを使用して、作成したネットワークに配置します。 例:

docker run --name=mysql1 --network=my-custom-net -d mysql/mysql-server
docker run --name=myapp1 --network=my-custom-net -d myapp

その後、Docker は指定されたコンテナ名に対して DNS を自動的に設定するため、myapp1 コンテナは mysql1 ホスト名を使用して mysql1 コンテナに接続できます (逆も同様です)。 次の例では、myapp1 コンテナ内から mysql クライアントを実行して、独自のコンテナ内のホスト mysql1 に接続します:

docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password

コンテナのその他のネットワーク技術については、Docker ドキュメントの「Docker コンテナネットワーキング」のセクションを参照してください。

サーバーエラーログ

サーバーコンテナを使用して MySQL Server を初めて起動したときに、次のいずれかの条件に該当する場合、server error log は生成されません:

  • ホストからのサーバー構成ファイルがマウントされていますが、ファイルにシステム変数 log_error が含まれていません (サーバー構成ファイルのバインドおよびマウントに関する データおよび構成の変更の永続化 を参照)。

  • ホストからのサーバー構成ファイルはマウントされていませんが、Docker 環境変数 MYSQL_LOG_CONSOLEtrue (MySQL 8.0 サーバーコンテナの変数のデフォルト状態) です。 その後、MySQL Server エラーログは stderr にリダイレクトされるため、エラーログは Docker コンテナログに記録され、docker logs mysqld-container コマンドを使用して表示できます。

いずれかの条件に該当する場合に MySQL Server でエラーログを生成するには、configure the server--log-error オプションを使用して、コンテナ内の特定の場所にエラーログを生成します。 エラーログを永続化するには、データおよび構成の変更の永続化 の説明に従って、コンテナ内のエラーログの場所にホストファイルをマウントします。 ただし、コンテナ内の MySQL Server に、マウントされたホストファイルへの書込みアクセス権があることを確認する必要があります。

Docker での MySQL Enterprise Backup の使用

MySQL Enterprise Backup は、MySQL Enterprise Edition で使用可能な MySQL Server の商用ライセンスバックアップユーティリティです。MySQL Enterprise Backup は MySQL Enterprise Edition の Docker インストールに含まれています。

次の例では、Docker コンテナで MySQL Server がすでに実行されていることを前提としています (Docker で MySQL Server インスタンスを起動する方法については、セクション2.5.6.1「Docker を使用した MySQL Server デプロイメントの基本ステップ」 を参照してください)。 MySQL Enterprise Backup で MySQL Server をバックアップするには、サーバーデータディレクトリにアクセスできる必要があります。 これは、たとえば、サーバーの起動時に bind-mounting a host directory on the data directory of the MySQL Server によって実現できます:

docker run --name=mysqlserver \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
-d mysql/enterprise-server:8.0

このコマンドを使用すると、MySQL Server は MySQL Enterprise Edition の Docker イメージで起動され、ホストディレクトリ/path-on-host-machine/datadir/はサーバーコンテナ内のサーバーデータディレクトリ (/var/lib/mysql) にマウントされます。 また、サーバーの起動後、MySQL Enterprise Backup がサーバーにアクセスするために必要な権限も設定されていることを前提としています (詳細は、Grant MySQL Privileges to Backup Administrator を参照)。 次のステップを使用して、MySQL Server インスタンスをバックアップおよびリストアします。

Docker とともに MySQL Enterprise Backup を使用して、Docker コンテナで実行されている MySQL Server インスタンスをバックアップするには:

  1. MySQL Server コンテナが実行されているのと同じホストで、MySQL Enterprise Edition のイメージを使用して別のコンテナを起動し、MySQL Enterprise Backup コマンド backup-to-image を使用してバックアップを実行します。 最後のステップで作成したバインドマウントを使用して、サーバーデータディレクトリへのアクセスを提供します。 また、ホストディレクトリ (この例では/path-on-host-machine/backups/) をコンテナ内のバックアップの記憶域フォルダ (この例では/data/backups) にマウントして、作成中のバックアップを永続化します。 次に、My Oracle Support からダウンロードした Docker イメージを使用して MySQL Enterprise Backup を起動する、このステップのサンプルコマンドを示します:

    shell> docker run \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    --mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
    --rm mysql/enterprise-server:8.0 \
    mysqlbackup -umysqlbackup -ppassword --backup-dir=/tmp/backup-tmp --with-timestamp \
    --backup-image=/data/backups/db.mbi backup-to-image
    
    [Entrypoint] MySQL Docker Image 8.0.11-1.1.5
    MySQL Enterprise Backup version 8.0.11 Linux-4.1.12-61.1.16.el7uek.x86_64-x86_64 [2018-04-08  07:06:45]
    Copyright (c) 2003, 2018, Oracle and/or its affiliates. All Rights Reserved.
    
    180921 17:27:25 MAIN    INFO: A thread created with Id '140594390935680'
    180921 17:27:25 MAIN    INFO: Starting with following command line ...
    ...
    
    -------------------------------------------------------------
       Parameters Summary
    -------------------------------------------------------------
       Start LSN                  : 29615616
       End LSN                    : 29651854
    -------------------------------------------------------------
    
    mysqlbackup completed OK!

    mysqlbackup による出力の終わりをチェックして、バックアップが正常に完了していることを確認することが重要です。

  2. バックアップジョブが終了するとコンテナは終了し、開始に使用した --rm オプションを使用すると、コンテナは終了後に削除されます。 イメージバックアップが作成され、バックアップを格納する最後のステップでマウントされたホストディレクトリにあります:

    shell> ls /tmp/backups
    db.mbi

MySQL Enterprise Backup と Docker を使用して Docker コンテナ内の MySQL Server インスタンスをリストアするには:

  1. MySQL Server コンテナを停止します。これにより、内部で実行されている MySQL Server も停止されます:

    docker stop mysqlserver
  2. ホストで、MySQL Server データディレクトリの bind マウント内のすべての内容を削除します:

    rm -rf /path-on-host-machine/datadir/*
  3. MySQL Enterprise Edition のイメージを使用してコンテナを起動し、MySQL Enterprise Backup コマンド copy-back-and-apply-log を使用してリストアを実行します。 サーバーをバックアップしたときと同様に、バックアップのサーバーデータディレクトリとストレージフォルダをバインド/マウントします:

    shell> docker run \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    --mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
    --rm mysql/enterprise-server:8.0 \
    mysqlbackup --backup-dir=/tmp/backup-tmp --with-timestamp \
    --datadir=/var/lib/mysql --backup-image=/data/backups/db.mbi copy-back-and-apply-log
    
    [Entrypoint] MySQL Docker Image 8.0.11-1.1.5
    MySQL Enterprise Backup version 8.0.11 Linux-4.1.12-61.1.16.el7uek.x86_64-x86_64 [2018-04-08  07:06:45]
    Copyright (c) 2003, 2018, Oracle and/or its affiliates. All Rights Reserved.
    
    180921 22:06:52 MAIN    INFO: A thread created with Id '139768047519872'
    180921 22:06:52 MAIN    INFO: Starting with following command line ...
    ...
    180921 22:06:52 PCR1    INFO: We were able to parse ibbackup_logfile up to
              lsn 29680612.
    180921 22:06:52 PCR1    INFO: Last MySQL binlog file position 0 155, file name binlog.000003
    180921 22:06:52 PCR1    INFO: The first data file is '/var/lib/mysql/ibdata1'
                                  and the new created log files are at '/var/lib/mysql'
    180921 22:06:52 MAIN    INFO: No Keyring file to process.
    180921 22:06:52 MAIN    INFO: Apply-log operation completed successfully.
    180921 22:06:52 MAIN    INFO: Full Backup has been restored successfully.
    
    mysqlbackup completed OK! with 3 warnings

    バックアップジョブが終了するとコンテナは終了し、開始時に --rm オプションを使用すると、コンテナは終了後に削除されます。

  4. サーバーコンテナを再起動します。これにより、リストアされたサーバーも再起動されます:

    docker restart mysqlserver

    または、リストアされたデータディレクトリで新しい MySQL Server を起動します:

    docker run --name=mysqlserver2 \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    -d mysql/enterprise-server:8.0

    サーバーにログオンして、リストアされたデータでサーバーが実行されていることを確認します。

既知の問題
  • サーバーシステム変数 audit_log_file を使用して監査ログファイル名を構成する場合、それとともに loose option modifier を使用すると、Docker はサーバーを起動できません。

Docker の環境変数

MySQL Server コンテナを作成する場合、--env オプション (-e) を使用して、次の環境変数のいずれかまたは複数を指定することで、MySQL インスタンスを構成できます。

メモ
  • サーバーの初期化が試行されないため、マウントするデータディレクトリが空でない場合、次の変数は何の効果もありません (詳細は データおよび構成の変更の永続化 を参照)。 フォルダ内の既存のコンテンツ (古いサーバー設定を含む) は、コンテナの起動時に変更されません。

  • MYSQL_RANDOM_ROOT_PASSWORDMYSQL_ONETIME_PASSWORDMYSQL_ALLOW_EMPTY_PASSWORDMYSQL_LOG_CONSOLE などのブール変数は、長さがゼロ以外の文字列で設定することによって true になります。 したがって、0false または no などに設定しても、false にはなりませんが、実際には true になります。 これは、MySQL Server コンテナの既知の問題です。

  • MYSQL_RANDOM_ROOT_PASSWORD: この変数が true (MYSQL_ROOT_PASSWORD が設定されているか、MYSQL_ALLOW_EMPTY_PASSWORD が true に設定されていないかぎり、デフォルトの状態) の場合、Docker コンテナの起動時にサーバールートユーザーのランダムパスワードが生成されます。 パスワードはコンテナの stdout に出力され、コンテナのログを参照して確認できます (MySQL Server インスタンスの起動 を参照)。

  • MYSQL_ONETIME_PASSWORD: 変数が true (MYSQL_ROOT_PASSWORD が設定されているか、MYSQL_ALLOW_EMPTY_PASSWORD が true に設定されていないかぎり、デフォルトの状態) の場合、root ユーザーのパスワードは期限切れとして設定され、MySQL を通常どおり使用する前に変更する必要があります。

  • MYSQL_DATABASE: この変数を使用すると、イメージの起動時に作成するデータベースの名前を指定できます。 MYSQL_USER および MYSQL_PASSWORD でユーザー名とパスワードが指定されている場合、ユーザーが作成され、このデータベース (GRANT ALL に対応) へのスーパーユーザーアクセス権が付与されます。 指定されたデータベースは CREATE DATABASE IF NOT EXIST ステートメントによって作成されるため、データベースがすでに存在する場合、変数は無効です。

  • MYSQL_USER, MYSQL_PASSWORD: これらの変数は、ユーザーを作成してそのユーザーパスワードを設定するために組み合せて使用され、ユーザーには MYSQL_DATABASE 変数で指定されたデータベースに対するスーパーユーザー権限が付与されます。 ユーザーを作成するには、MYSQL_USERMYSQL_PASSWORD の両方が必要です。2 つの変数のいずれかが設定されていない場合、もう一方は無視されます。 両方の変数が設定されているが、MYSQL_DATABASE が設定されていない場合、ユーザーは権限なしで作成されます。

    注記

    このメカニズムを使用してルートスーパーユーザーを作成する必要はありません。このスーパーユーザーは、MYSQL_ALLOW_EMPTY_PASSWORD が true でないかぎり、MYSQL_ROOT_PASSWORD および MYSQL_RANDOM_ROOT_PASSWORD の説明で説明されているメカニズムのいずれかによってデフォルトでパスワードが設定されて作成されます。

  • MYSQL_ROOT_HOST: デフォルトでは、MySQL によって'root'@'localhost'アカウントが作成されます。 このアカウントは、コンテナ内から MySQL Server への接続 で説明されているように、コンテナ内からのみ接続できます。 他のホストからのルート接続を許可するには、この環境変数を設定します。 たとえば、デフォルトの Docker ゲートウェイ IP である値 172.17.0.1 では、コンテナを実行するホストマシンからの接続が許可されます。 このオプションで使用できるエントリは 1 つのみですが、ワイルドカード (MYSQL_ROOT_HOST=172.*.*.*MYSQL_ROOT_HOST=% など) を使用できます。

  • MYSQL_LOG_CONSOLE: 変数が true (MySQL 8.0 サーバーコンテナのデフォルト状態) の場合、MySQL Server エラーログは stderr にリダイレクトされるため、エラーログは Docker コンテナログに記録され、docker logs mysqld-container コマンドを使用して表示できます。

    注記

    ホストのサーバー構成ファイルがマウントされている場合、変数は無効です (構成ファイルのバインド時の データおよび構成の変更の永続化 を参照)。

  • MYSQL_ROOT_PASSWORD: この変数は、MySQL root アカウントに設定されるパスワードを指定します。

    警告

    コマンドラインでの MySQL root ユーザーパスワードの設定はセキュアではありません。 パスワードを明示的に指定するかわりに、パスワードファイルのコンテナファイルパスを使用して変数を設定し、コンテナファイルパスにパスワードを含むホストからファイルをマウントすることもできます。 パスワードファイルの場所がまだ公開されているため、これはそれでも安全ではありません。 MYSQL_RANDOM_ROOT_PASSWORDMYSQL_ONETIME_PASSWORD の両方のデフォルト設定を true にすることをお薦めします。

  • MYSQL_ALLOW_EMPTY_PASSWORD。 root ユーザーのパスワードを空白にしてコンテナを起動できるようにするには、true に設定します。

    警告

    この変数を true に設定すると、MySQL インスタンスを完全に保護せずに完全なスーパーユーザーアクセスを取得できるため、セキュアではありません。 MYSQL_RANDOM_ROOT_PASSWORDMYSQL_ONETIME_PASSWORD の両方のデフォルト設定を true にすることをお薦めします。


関連キーワード:  コンテナ, インストール, サーバー, Server, MYSQL, 起動, 構成, 設定, 作成, docker