やりたいこと
- ローカルPCでMySQLが使えるようになる
- 普通にインストールしたMySQLではなく、Dockerコンテナ上にMySQLを立てる
- ローカルPCからmysqlコマンドでDockerコンテナ上のMySQLに接続できる
- rootユーザー以外のユーザーも作成する
- コンテナ起動時に初期データ投入はしない
- docker-composeは利用しない
- my.cnfを初期設定する
事前準備
Dockerがインストールされていること。
dockerコマンドが利用可能であればOK。
$ docker version
手順
概要
- Dockerfileを作成する
- Dockerイメージを作成する
- DockerイメージからDockerコンテナを起動する
- Docker上のMySQLにログインする
- 必要であれば初期データの投入を行う
1. Dockerfileを作成する
以下のDockerfileを作成する。
ベースイメージからパスワードの設定とポート公開の設定を行うだけ。
# ベースイメージを設定する(バージョンは任意)
# https://hub.docker.com/_/mysql?tab=tags から選択する
FROM mysql:5.7
# 通常mysqlは3306ポートなので、コンテナの公開ポートを同じ値で指定する
# EXPOSEはDockerが公開するポートを指定する命令
EXPOSE 3306
# 初期パスワードを設定する
ENV MYSQL_ROOT_PASSWORD="my-secret-pw"
# ここから下は任意の項目
# データベース名
ENV MYSQL_DATABASE="employee"
# ユーザー名
ENV MYSQL_USER="test_user"
# パスワード
ENV MYSQL_PASSWORD="test_pw"
2. Dockerイメージを作成する
作成したDockerfileが存在するディレクトリで下記コマンドを実行する。
以下のコマンドでは、「mysql-sandbox」という名前のイメージで、タグは「1.0」としてイメージを作成している。
$ docker build -t mysql-sandbox:1.0 .
- buildはDockerイメージを作成するコマンド
-t
:イメージの名前とタグを指定する- 最後のピリオドはカレンとディレクトリのDockerfileを使う命令なので忘れずに
3. 作成したDockerイメージをもとにコンテナを作成&起動する
「mysql-container」という名前でDockerコンテナを作成&起動する。
$ docker container run -it --name "mysql-container" -p 127.0.0.1:3306:3306 -d mysql-sandbox:1.0
container run
:Dockerコンテナを作成しつつ起動する-p
:ポートの割り当てを行うオプション- 127.0.0.1(ローカルPC)の3306ポート→Dockerコンテナの3306ポートに接続する
-it
:コンテナに入るためのオプション-d
:コンテナを生成し、バックグラウンドで実行する
docker container ls
コマンドでDockerコンテナが起動していることを確認できる。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
628516f8fddc mysql-sandbox:1.0 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 127.0.0.1:3306->3306/tcp, 33060/tcp mysql-container
コンテナ名が表示されていれば起動している。
4. Docker上のMySQLにログインする
起動時に127.0.0.1の3306ポートと、Dockerコンテナの3306ポートを接続したので、
127.0.0.1のホストを指定してmysqlコマンドでログインすれば良い。
$ mysql -h 127.0.0.1 -u test_user -ptest_pw
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.38 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
5. (必要であれば)データ投入を行う
大抵の場合初期データが欲しいと思うので、SQLファイルに記述しておき、mysqlコマンドを使って読み込ませる。
# test_databaseというデータベースに、カレントディレクトリにある「schema.sql」を読み込ませる
$ mysql -h 127.0.0.1 -u test_user -p test_database < ./schema.sql
この際、schema.sql
には以下の要領でクエリを記載しておくと
間違えて重複実行してもエラーにならないし、テーブルの初期化も簡単になる。
-- テーブルが既に存在していたら一旦消して
DROP TABLE IF EXISTS sample_table;
-- 改めて新しいテーブルを作成する
CREATE TABLE sample_table (
-- 略
);
初期データの投入はコンテナ作成と同時にやる方法もあるが、
初期化をしたい時にコンテナの再起動を行わなければならず面倒なのでこの方法にした。
まとめ
- 3306ポートを公開するようにDockerイメージを作成
- コンテナ作成、起動時は端末のポートとDockerコンテナのポートを接続して起動
- あとは普通にmysqlコマンドを使ってログイン、データの投入などを行う