Public

DockerでMySQLコンテナを立ち上げる方法と便利な使い方

Docker MySQL
t-salad t-salad committed f2d8c33

はじめに

Dockerを利用すると、簡単にコンテナ上でMySQLの環境を構築できます。これにより、開発環境の構築が迅速になり、バージョン管理や依存関係の問題を回避できます。本記事では、DockerでMySQLコンテナを立ち上げる基本手順から、設定やデータの永続化の方法について解説します。

スポンサーリンク

DockerでMySQLコンテナを立ち上げる

手順1:Dockerイメージのダウンロード

まず、MySQLのDockerイメージをダウンロードします。公式のMySQLイメージを使用する場合、以下のコマンドを実行します。

docker pull mysql:latest

「latest」を指定すると、最新バージョンのMySQLイメージがダウンロードされます。特定のバージョンを使用したい場合は、例えば「mysql:5.7」のように指定します。

手順2:MySQLコンテナの起動

次に、ダウンロードしたMySQLイメージを元にコンテナを起動します。起動時には、環境変数としてMYSQL_ROOT_PASSWORDを設定する必要があります。

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

上記のコマンドでは、以下の設定を行っています。

  • --name:コンテナ名を「mysql-container」と指定。
  • -e MYSQL_ROOT_PASSWORD:MySQLのrootユーザーのパスワードを設定。
  • -d:バックグラウンドでコンテナを起動。

コンテナが正常に起動すれば、docker psで実行中のコンテナを確認できます。

MySQLコンテナに接続する

手順3:コンテナ内のMySQLにアクセスする

MySQLコンテナに直接ログインして操作するには、以下のコマンドを使います。

docker exec -it mysql-container mysql -u root -p

パスワードの入力が求められるので、コンテナ起動時に設定したMYSQL_ROOT_PASSWORD(例では「my-secret-pw」)を入力します。

データの永続化

MySQLのデータを永続化しないと、コンテナを停止・削除した際にデータが消えてしまいます。これを防ぐため、ホストマシンにボリュームを設定してデータを永続化します。

手順4:ボリュームを使った永続化設定

以下のコマンドで、/var/lib/mysqlをホストマシンのディレクトリにマウントすることで、データの永続化を行います。

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -v ~/mysql_data:/var/lib/mysql -d mysql:latest

ここでは、ホストマシンの~/mysql_dataディレクトリにMySQLのデータが保存されます。これにより、コンテナが削除されてもデータは残ります。

スポンサーリンク

MySQLの設定をカスタマイズする

MySQLの設定ファイル(my.cnf)をカスタマイズするには、設定ファイルをホストマシンに用意し、コンテナにマウントします。

手順5:設定ファイルを利用したカスタマイズ

  1. ホストマシンにmy.cnfを作成し、必要な設定を記載します。
  2. コンテナ起動時に、以下のように設定ファイルをマウントします。
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -v ~/mysql_data:/var/lib/mysql -v ~/my.cnf:/etc/mysql/my.cnf -d mysql:latest

これで、コンテナ内のMySQLは指定した設定に従って起動します。

複数のMySQLコンテナを起動する

異なるバージョンのMySQLを同時にテストしたい場合など、複数のMySQLコンテナを起動することも可能です。それぞれのコンテナに異なる名前を付け、ポートを指定します。

手順6:異なるバージョンで複数コンテナを起動

例えば、MySQL 5.7とMySQL 8.0を別々のコンテナで起動するには以下のようにします。

# MySQL 5.7
docker run --name mysql57-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql:5.7

# MySQL 8.0
docker run --name mysql80-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3307:3306 -d mysql:8.0
  • MySQL 5.7のコンテナは、ホストの3306ポートでアクセス可能。
  • MySQL 8.0のコンテナは、ホストの3307ポートでアクセス可能。

異なるポート番号を指定することで、同一マシン上で異なるバージョンのMySQLを動作させられます。

よくあるエラーと解決法

DockerでMySQLを運用していると、いくつか典型的なエラーに遭遇します。代表的なものと対処法をまとめます。

1. Access denied for user 'root'@'localhost'

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

パスワードの入力ミスのほか、以前に作成したボリュームに古い認証情報が残っていることが原因になっているケースが多いです。MYSQL_ROOT_PASSWORDを変更しても、既存のボリューム内には初回起動時のパスワードがそのまま保存されています。

  • ホスト名を明示して接続する: mysql -h 127.0.0.1 -u root -p
  • パスワードを変更したい場合は、ボリュームを削除してコンテナを再作成する(データも初期化されるので注意)

2. Authentication plugin 'caching_sha2_password' cannot be loaded

Authentication plugin 'caching_sha2_password' cannot be loaded

MySQL 8系ではデフォルトの認証方式がcaching_sha2_passwordになっていますが、古いバージョンのクライアントライブラリ(PHPのmysqli、一部の言語向けMySQLドライバなど)がこれに対応しておらず発生します。

コンテナ起動時に認証方式を従来のmysql_native_passwordに指定することで回避できます。

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest --default-authentication-plugin=mysql_native_password

既に起動済みのコンテナであれば、コンテナ内でユーザーごとに変更することも可能です。

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'my-secret-pw';

3. コンテナが起動直後に落ちる(--initialize specified but the data directory has files in it)

mysqld: [ERROR] --initialize specified but the data directory has files in it.

異なるMySQLバージョン間で同じボリュームを使い回した場合や、初期化が途中で失敗して中途半端なデータが残っている場合に発生します。docker ps -aでコンテナがすぐにExited状態になっていないか確認しましょう。

該当のボリュームディレクトリを削除(または新しい名前のボリュームを使用)し、コンテナを作り直すことで解決します。

docker rm -f mysql-container
rm -rf ~/mysql_data
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -v ~/mysql_data:/var/lib/mysql -d mysql:latest

まとめ

Dockerを活用すると、MySQL環境を短時間で構築でき、異なるバージョンの管理やデータの永続化も簡単に行えます。ここで紹介した手順をもとに、開発やテスト環境でMySQLを効率的に運用してみてください。

Docker: コンテナー アプリケーション開発の加速
Docker は、開発者がコンテナー アプリケーションを構築、共有、実行できるように設計されたプラットフォームです。面倒なセットアップは私たちが行うので、あなたはコードに集中できます。
スポンサーリンク
スポンサーリンク
★ この記事をXでシェア はてなブックマーク
関連記事