スポンサーリンク
概要
MacのDocker上でDockerComposeを使用してMySQL環境を構築して動せるまでのメモです。
以前PostgresSQLで似たような事をやっていて下記で紹介していますが、今回は色々と詰まって上手くいかなったのでメモとして残します。
スポンサーリンク
前提
Mac OS 11.2.1
Docker for Mac 3.1.0
スポンサーリンク
スポンサーリンク
手順
docker-compose.yml作成
任意のディレクトリを作成して下記のdocker-compose.ymlを作成する
パスワードやDB名の設定等は適宜変更してください。
なお、ホスト側は13306ポートをMySQLへ接続するためのポートとしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
version: "3" services: mysql: build: # my_sqlディレクトリのDockerfileを使用するように設定 context: ./my_sql dockerfile: Dockerfile container_name: mysql_db environment: MYSQL_ROOT_PASSWORD: rootpass # ルートユーザのパスワード MYSQL_DATABASE: test_database # DB名称 MYSQL_USER: user # ユーザアカウント MYSQL_PASSWORD: pass # パスワード TZ: "Asia/Tokyo" volumes: # ホスト側への永続化ボリュームのマッピング - ./my_sql/db/data:/var/lib/mysql - ./my_sql/db/my.cnf:/etc/mysql/conf.d/my.cnf - ./my_sql/db/sql:/docker-entrypoint-initdb.d ports: - 13306:3306 |
ディレクトリ等の作成
下記の用にdocker-compose.ymlファイルの直下にmy_sqlディレクトリを作成して中にDockerfileを作成します。
(Dockerfileの中身は後述)
合わせて永続化ボリュームにマッピングしたdbディレクトリとその配下にdata,sqlディレクトリを作成します。
mysqlの設定ファイルとなるmy.cnfファイルを作成します。
ディレクトリ構成
1 2 3 4 5 6 7 |
|- docker-compose.yml |- my_sql | |-Dockerfile |- db |-data |-sql |-my.cnf |
スポンサーリンク
Dockerfile作成
Dockerfileは下記のように記載する。
今回はバージョン5.7を使用しているが、任意のバージョンを設定する。
1 2 3 4 5 6 |
FROM mysql:5.7 # 設定ファイルをホストからコピーする ADD ./db/my.cnf /etc/mysql/conf.d/my.cnf RUN chmod 644 /etc/mysql/conf.d/my.cnf # MySQLをrootで実行する設定に書き換えて起動する RUN sed -e 's/^ *user *= *mysql$/user = root/' -i /etc/mysql/my.cnf |
my.cnfの作成
my.cnfは下記のように記載する。
デフォルトの文字コードがUFT-8では無いので指定する設定などを行なっている。
1 2 3 4 5 6 7 8 |
[mysqld] character-set-server=utf8mb4 # UTF8対応 collation-server=utf8mb4_unicode_ci explicit-defaults-for-timestamp=1 # テーブルにTimeStamp型のカラムをもつ場合、推奨 user=mysql # 実行ユーザの指定 [client] default-character-set=utf8mb4 # UTF8対応 |
ビルドと起動
下記のコマンドをdocker-compose.ymlファイルのディレクトリ内で実行する。
1 |
docker-compose build |
エラーが発生しなければ成功。
(後述するが、私はここで何度もエラーが出て解決に時間を要した。)
下記のコマンドを実行して実際にコンテナを立ち上げる。
1 |
docker-compose up -d |
下記のコマンドを実行してコンテナが立ち上がっているかを確認する。
1 |
docker-compose ps |
コンテナが立ち上がっていれば下記のように表示される。
1 2 3 |
Name Command State Ports ----------------------------------------------------------------------------------- mysql_db docker-entrypoint.sh mysqld Up 0.0.0.0:13306->3306/tcp, 33060/tcp |
止めたい場合は下記コマンドを実行する。
1 |
docker-compose stop |
スポンサーリンク
接続確認
実際に接続できるか確認を行う。
今回はクライアントとしてDBbeaverを使用する。
未インストールの場合、インストールを予め行う。
接続設定として下記に注意する。
1. 接続作はlocalhostでPortは13306(docker-compose.ymlで設定したポート。)
2. 接続databaseはtest_database(docker-compose.ymlで設定した値。)
3. 認証はuser,passを指定(docker-compose.ymlで設定した値。)
上記の設定は接続できればオーケー。
遭遇したエラー
上記の起動までに発生したエラーに関して。
その1
buildコマンド実行時に下記のようなエラーが発生した。
1 |
2021-02-28T03:00:15.566201Z 0 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root! |
rootユーザでmysqlを起動するのが禁止となっているようで、起動するユーザを別途指定する必要があるようです。
rootでもmy.cnfに実行するroot以外のユーザを指定する事で解決できました。
user=mysql # 実行ユーザの指定
参考
https://qiita.com/yosida001/items/f7acb893843c550e0074
スポンサーリンク
その2
buildコマンド実行時に下記のようなエラーが発生した。
1 2 |
2021-02-28T03:08:51.008126Z 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 2021-02-28T03:08:51.009299Z 0 [Note] Salting uuid generator variables, current_pid: 8, server_start_time: 1614481730, bytes_sent: 0, |
MAC OS環境でしか発生しないようですが、書き込み権限がなくなってしまって上手く書き込めていないため、rootユーザ起動にすることで対応しているようです。
Dockerfileにそのままrun mysqlせずに下記のように記載する事で症状が治りました。
# MySQLをrootで実行する設定に書き換えて起動する
RUN sed -e 's/^ *user *= *mysql$/user = root/' -i /etc/mysql/my.cnf
詳細は下記が参考になります。
https://qiita.com/kazuma1989/items/3dae0d9dc78675162cae