自分用めも

初心者ちっくなプログラムネタを中心に、自分用の覚え書きをメモっていくための場所です。

DockerでのMySQL環境構築メモ

コロナ禍はいつ終わるのか…一般的にワクチンが出来るのは臨床試験込みで3~7年だそうで、緊急事態で動いているとはいえ、先は長いかもしれません。
とはいえ今の仕事はコンプライアンス上すっとリモートというわけにも行かず、そろそろ出社になりそう。
リモートワーク中に何か作ろうと思ったんですが、結局何も出来ない予感。。。
せめてなにかに手を出そうと思って、前々から完全移行しようと思っていたDockerに手を出してみました。



環境

各バージョン

VirtualBox 6.1.6 r137129 (Qt5.6.2) Windowsで動く仮想環境。
VMWareから乗り換え。圧倒的に軽いです。
ubuntu 18.04.4 LTS (Bionic Beaver) 構築時点での最新はv20だが、
Docker側が未対応の為v18を使用
Docker 19.03.8, build afacb8b7f0
docker-compose 1.25.5, build 8a1c60f6
MySQL 8.0.20

ディレクトリ構成(ホスト側)

今回はユーザのhome下にDockerのデータ用のディレクトリ(及びファイル)を作成します。

/home/ubt_user/docker_files
    |docker-compose.yml
    |mysql/
        |data/
        |initdb.d/
            |db_backup.sql
        |my.cnf

db_backup.sqlは、mysqldumpでダンプしたSQLファイルを想定しています。
initdb.dディレクトリ下のSQLファイルは自動実行されます。
無ければ無いでok。

例示するユーザ

ubt_user = ubuntu上の作業ユーザ。sudoで作業する。
my_user = mysqlのユーザ。

構築準備

1. Docker、docker-composeのインストール

Install Docker Engine on Ubuntu | Docker Documentation
Install Docker Compose | Docker Documentation

ubuntuなのでaptで管理します。

# aptの最新化
sudo apt update
sudo apt upgrade

# Dockerインストールに必要な事前モジュール、公式リポジトリ追加(公式リファレンス参照)
sudo apt -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Dockerインストール
sudo apt -y install docker-ce

# Docker Composeインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. docker-compose.yml(docker-composeの設定ファイル)準備

Docker Hub
/home/ubt_user/docker_files/docker-compose.yml

version: '3'
services:
  # MySQL - https://hub.docker.com/_/mysql
  db:
    image: mysql:8.0.20
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: ********
      MYSQL_DATABASE: my_database
      MYSQL_USER: my_user
      MYSQL_PASSWORD: ********
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      # MySQLのワークディレクトリ
      - /home/ubt_user/docker_files/mysql/data:/var/lib/mysql
      # ユーザ設定ファイル
      - /home/ubt_user/docker_files/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      # Docker構築時に一度だけ実行される設定ファイル群
      - /home/ubt_user/docker_files/mysql/initdb.d:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
environment

公式のMySQLイメージのリファレンスに記載されている変数を設定しています。
ここに記載したMYSQL_USERは、MYSQL_DATABASEの全権限がGRANTされるとのこと。

command

mysqldにて、文字コードを初期設定しています。
ただしここで設定されるのはサーバ系の値だけで、他にクライアント向けのデフォルト設定をします。詳しくは後述。

volumes

ホストOSのpath:Docker内のpathの形で、マウントするpathを記載します。
基本的にDockerのコンテナ内は不変とするため、動的なファイルが出力されるpathは全て外(ホスト側)に出す形でマウントしています。
とかいいつつ、今回syslogとかは外に出してません。

3. my.cnf準備

/home/ubt_user/docker_files/mysql/my.cnf

[mysql]
default-character-set=utf8

全2行です。
クライアント系の文字コードを設定します。
これはmysqldでは指定できないらしい。
他にも設定がある場合はここに。

構築、起動

# docker-compose.ymlがあるディレクトリをカレントにして実行
cd ~/docker_files/
sudo docker-compose up -d

# コンテナの起動ログ確認(コンテナ名はdocker-compose.ymlで指定した識別子)
sudo docker logs mysql_container

コンテナが起動してから、initスクリプトの実行が終わるまでにタイムラグがあります。
なので、ちょっと間を置いてログを確認したほうがいいかもしれません。

トライアンドエラー時に必要になりそうなコマンドのメモ
# コンテナ一覧、停止、削除
sudo docker ps -a
sudo docker stop mysql_container
sudo docker rm mysql_container

# イメージ一覧、削除(削除は一覧で表示されたIDを指定)
sudo docker images -a
sudo docker rmi 94dff5fab37f

コンテナの構築に失敗した際、ローカルイメージはコピー元なので関係ないとは思うのですが、削除すると状況が変わる場合があるらしい。

確認(CLI

# コンテナにログイン
sudo docker exec -it mysql_container bash

コンテナ内に入らないと、そもそもmysqlコマンドがありません。

# コンテナ内
mysql -umy_user -p

mysql> SHOW databases;
mysql> USE my_database;
mysql> SHOW tables;
mysql> SHOW VARIABLES LIKE 'char%';

確認(GUI

ここでは個人的に愛用しているWindows用のSQLフロントエンド、A5:SQLの例を貼ります。
f:id:bel_h:20200517141702p:plain
f:id:bel_h:20200517141526p:plain
f:id:bel_h:20200517141555p:plain
問題なくクエリ結果が得られました。
f:id:bel_h:20200517141845p:plain



以上。
一個できれば、応用で他のも出来るはず…。