メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
公式の MySQL Docker イメージを使うと、完全に設定された MySQL サーバーをコンテナで実行できます。初期化、ユーザー作成、およびデータディレクトリのセットアップを、環境変数を通して自動で処理します。

クイックスタート

ホストマシンから接続します。
または、コンテナ内で接続します。

環境変数

MYSQL_USER と MYSQL_PASSWORD は一緒に設定する必要があります。作成されたユーザーは MYSQL_DATABASE への完全なアクセス権を受け取ります。

ボリュームによる永続データ

ボリュームがないと、コンテナを削除したときにすべてのデータが失われます。データディレクトリを永続化するには、ボリュームをマウントします。
名前付きボリューム(mysql-data)は、コンテナの再起動と削除をまたいで永続します。代わりにホストのディレクトリを使うには次のようにします。
データディレクトリは MySQL のデータとログを所有します。実行中の 2 つの MySQL コンテナの間でボリュームを共有しないでください。

イメージとボリューム戦略の選択

ほとんどのワークロードでは、名前付きボリュームが正しいデフォルトです。バインドマウントは、ホストからデータディレクトリを直接確認または編集する必要があるときに役立ちますが、macOS と Windows ではパフォーマンスのコストが問題になります。

Docker Compose

複数のサービスを持つ開発環境では、Docker Compose が標準的なアプローチです。
healthcheck と depends_on: condition: service_healthy の組み合わせにより、MySQL が単に起動しただけでなく、接続を受け付ける準備ができるまで、アプリケーションコンテナは起動しません。

カスタム設定

カスタムの my.cnf をマウントして渡します。
または、コマンド引数でオプションを直接設定します。

初期化スクリプト

コンテナは、初回起動時(データディレクトリが空のとき)に、/docker-entrypoint-initdb.d/ に置かれた .sql または .sh ファイルを実行します。
SQL ファイルは root として実行されます。シェルスクリプトはコンテナ環境で実行されます。これらのスクリプトは最初の初期化時にだけ実行され、その後のコンテナ起動時には実行されません。

アプリケーションからの接続

Docker Compose のネットワーク内では、コンテナはサービス名で MySQL に接続します。
ホストマシンからは、127.0.0.1 経由で接続します(localhost ではありません。MySQL のソケットはホストでは使えません)。

Docker で MySQL を実行すべき場合

本番での考慮事項

いくつかの注意点を守れば、Docker は本番の MySQL でもうまく動きます。
  • データの永続化: 名前付きボリュームまたはバインドマウントを使います。MySQL のデータをコンテナ層に置いたままにしないでください。
  • メモリ制限: MySQL がホストのメモリを使い果たさないように Docker で --memory を設定し、innodb_buffer_pool_size をそれに合わせて調整します。
  • バックアップ: mysqldump はコンテナ内で動きます: docker exec mysql-dev mysqldump -u root -p myapp > backup.sql
  • ログ: Docker では MySQL のログは stdout/stderr に出ます。docker logs mysql-dev を使うか、ロギングドライバーを設定します。
  • アップグレード: 新しいイメージタグを pull し、古いコンテナを停止し、同じボリュームで新しいコンテナを起動します。新しいバージョンでの初回起動時に、MySQL のアップグレード処理が自動で実行されます。

よくある質問

ホストから mysql -h localhost で接続できないのはなぜですか?

Linux と macOS では、localhost を指定すると MySQL クライアントは Unix ソケット経由で接続しようとしますが、ホストではそのソケットは使えません。127.0.0.1 を明示的に使ってください: mysql -h 127.0.0.1 -P 3306。

Docker で MySQL のデータを永続化するにはどうすればよいですか?

コンテナの起動時に名前付きボリュームを /var/lib/mysql にマウントします: -v mysql-data:/var/lib/mysql。これがないと、すべてのデータはコンテナの書き込み可能な層に保存され、docker rm を実行すると失われます。名前付きボリュームはコンテナの削除後も残り、Docker が管理します。docker volume ls で一覧にし、docker volume inspect mysql-data で保存場所を確認できます。Docker Compose では、トップレベルの volumes: キーの下でボリュームを宣言し、サービスの volumes: リストでそれを参照します(上の Docker Compose セクションの例がこのパターンを示しています)。

Docker Compose のコンテナは MySQL にどう接続しますか?

同じ Compose プロジェクト内のコンテナは、デフォルトのネットワークを共有します。アプリケーションコンテナは、サービス名をホスト名として MySQL に接続します。データベースのサービス名が db なら、接続文字列は host=db port=3306 です。コンテナ間でポートを公開する必要はありません。ポートマッピング(-p 3306:3306)は、ホストマシンからの接続にだけ必要です。MySQL の準備ができる前にアプリケーションが起動しないように、MySQL サービスの healthcheck とともに depends_on: condition: service_healthy を使ってください。

実行中のコンテナに対して SQL ファイルを実行するにはどうすればよいですか?

トラブルシューティング

このページのすべての内容は、villagesql/server イメージでも動きます。VillageSQL は拡張機能を備えた MySQL のドロップイン代替であるため、上の compose ファイル、ボリューム、およびヘルスチェックは、イメージ名を 1 か所変えるだけでそのまま使えます。Docker で試す。

関連項目