(最終更新月:2023年11月)
✔以下のような方に向けて書かれています
「docker composeでMySQLってどう使うの?」
「docker composeにおけるMySQLのセットアップ方法を知りたい」
「docker composeの具体的な使い方を見て学びたい」
✔当記事で紹介すること
- docker composeとMySQLの基本的な機能
- docker composeでMySQLをインストール及び設定する方法
- docker composeでMySQLを使用する具体的な使用例
当記事では、docker composeでMySQLを扱う基礎から始め、その設定方法や応用のテクニック、さまざまな具体例まで詳細に説明しています。
ぜひ最後までご覧ください。
はじめに:DockerとMySQLの基本
こちらでは、「Docker」と「MySQL」の基本概念について説明していきます。
これらのツールの基本的な知識を持つことで、現代のアプリケーション開発環境の構築やデータベース操作がスムーズに行えるでしょう。
- Dockerとは?
- MySQLとは?
Dockerとは?
Dockerは、アプリケーションとその依存関係をコンテナという単位でパッケージ化し、一貫した環境での実行を可能にするプラットフォームです。
これにより、「ローカル環境では動作したのに本番環境で動かない」という問題を避けられます。
MySQLとは?
MySQLは、オープンソースの関係型データベース管理システム(RDBMS)のひとつです。
高いパフォーマンスと信頼性を持ち、世界中で多くのWebアプリケーションやシステムに利用されています。
必要なツール:DockerとDocker Composeの導入
DockerとMySQLを組み合わせて動作させるためには、DockerとDocker Composeの導入が必要です。
これらのツールのインストール方法を次に説明します。
- Dockerのインストール方法
- Docker Composeのインストール方法
Dockerのインストール方法
各OSにおけるインストール方法は以下の記事でご覧ください。
例えばDebian系のLinuxでインストールするには以下のコマンドです。
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker Composeのインストール方法
Docker Composeは、複数のコンテナを定義・管理するツールです。
以下のコマンドでインストールできます。
sudo apt-get install docker-compose-plugin
プロジェクトの準備:docker-compose.ymlの作成
Docker Composeの構成を定義するdocker-compose.yml
ファイルを作成します。
このファイルには、MySQLコンテナの設定などが記述されます。
version: '3.1' # docker-composeのバージョン
services:
db: # サービス名(任意に変更可能)
image: mysql:5.7 # 使用するMySQLのイメージとバージョン
restart: always
environment:
MYSQL_ROOT_PASSWORD: example # rootユーザのパスワード
MYSQL_DATABASE: exampledb # 作成するデータベース名
MYSQL_USER: exampleuser # 作成するユーザ名
MYSQL_PASSWORD: examplepass # 上記ユーザのパスワード
ports:
- "3306:3306" # ホストとコンテナのポートマッピング
volumes:
- my-db:/var/lib/mysql # データの永続化のためのボリューム
volumes:
my-db: # ボリュームの定義
MySQL環境の構築手順
DockerとDocker Composeを使用してMySQLの環境を構築する手順を詳しく解説します。
- Docker Composeを使ったMySQLの起動
- 初期設定スクリプトの作成
Docker Composeを使ったMySQLの起動
docker-compose.yml
にMySQLの設定を記述した後、以下のコマンドでMySQLを起動します。
docker-compose up -d
初期設定スクリプトの作成
MySQLの初期設定をおこなうスクリプトを作成します。
これにより、テーブルの作成やユーザーの追加などの操作が自動化されます。
init.sqlの例
-- データベースの作成
CREATE DATABASE IF NOT EXISTS exampledb;
-- 使用するデータベースを選択
USE exampledb;
-- テーブルの作成
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- ユーザーの作成と権限の付与
CREATE USER 'exampleuser'@'%' IDENTIFIED BY 'examplepass';
GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'%';
FLUSH PRIVILEGES;
docker-compose.ymlでinit.sqlを実行するよう指定
version: '3.1'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
ports:
- "3306:3306"
volumes:
- my-db:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
my-db:
MySQLの操作方法
Dockerで起動したMySQLへの接続や操作方法を解説します。
- MySQLクライアントによる接続と操作
- SQLの作成:サンプルテーブルと設定ファイル
MySQLクライアントによる接続と操作
MySQLコンテナ内部に入り、MySQLクライアントを使用してデータベースを操作する方法を解説します。
docker exec -it [MySQLコンテナのID or NAME] mysql -u root -p
このコマンドでMySQLクライアントに接続します。
パスワードを聞かれたら、設定したパスワードを入力してください。
SQLの作成:サンプルテーブルと設定ファイル
MySQLにデータベースやテーブルを作成する際の基本的なSQLを示します。
CREATE DATABASE sampledb;
USE sampledb;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255)
);
上記のSQLは、sampledb
というデータベースと、その中にusers
というテーブルを作成します。
確認と実行
DockerでMySQL環境を起動した後の確認手順と実行方法を説明します。
- Dockerの起動と起動確認
- DBの初期化と確認
Dockerの起動と起動確認
Dockerコンテナの起動状態を確認するには、以下のコマンドを使用します。
docker ps
このコマンドで、現在稼働中のDockerコンテナの一覧が表示されます。
DBの初期化と確認
先ほど作成した初期設定スクリプトを使用してデータベースを初期化します。
その後、正しくテーブルが作成されているかを確認します。
SHOW TABLES;
よくある問題と解決策
DockerとMySQLの組み合わせでよく遭遇する問題と、それらの問題を解決するための方法を解説します。
例として、ポートの競合やコンテナのネットワーク設定などのトピックを取り扱います。
ポートの競合
DockerコンテナでMySQLを実行する際、ホストマシンのポートが既に別のプロセスによって使用されている場合、ポートの競合が発生します。
これは、MySQLがデフォルトで3306ポートを使用するため、特に一般的な問題です。
解決策として、ポート番号の変更がおすすめ。
docker-compose.yml
ファイルで、MySQLコンテナのポートマッピングを変更します。
例えば、3306の代わりに3336を使用できます。
ports:
- "3336:3306"
使用中のポートの確認として、ホストマシンでnetstat
コマンド(Windowsの場合はnetstat -an | find "3306"
、Linuxの場合はnetstat -tulnp | grep 3306
)を使用して、どのプロセスがポートを使用しているかを確認し、必要に応じてそのプロセスを終了します。
コンテナのネットワーク設定
Dockerコンテナが適切なネットワーク設定を持たない場合、外部からMySQLサービスにアクセスできない、または他のコンテナと通信できないという問題が生じます。
ネットワークモードの調整がひとつの解決策です。
コンテナをDockerのデフォルトネットワークから別のネットワークに接続することで、他のサービスとの連携を改善できます。
例えば、docker-compose.yml
において、コンテナにカスタムネットワークを割り当てましょう。
services:
db:
# ...他の設定...
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
特定のコンテナがMySQLデータベースにアクセスする必要がある場合は、links
オプションを使用して、それらのコンテナ間の直接的な接続を確立できます。
データの永続化
Dockerコンテナは一時的なものであり、コンテナを削除するとその中のデータも失われます。
これは、データベースにとって特に大きな問題です。
ボリュームの使用として、Dockerボリュームを使用してデータの永続化を確保します。
docker-compose.yml
でボリュームを定義し、MySQLのデータディレクトリにマウントします。
volumes:
- my-db:/var/lib/mysql
ローカルのボリュームの代わりに、外部のデータストレージ(例えば、クラウドベースのストレージサービス)を使用することも選択肢です。
これらの問題と解決策は、Dockerを使用する際の一般的なトピックをカバーしており、MySQLに限らず多くのデータベースや他のサービスにも適用可能です。
まとめ
当記事では、DockerとMySQLの基本的な操作と組み合わせについて学習してきました。
dockerは立ち上げても簡単にやり直せるとても便利なツール。
当記事の内容をぜひ試しながら、使い方を身につけていきましょう。