1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

docker-composeでmysql8サーバーを立ち上げてみた。

Last updated at Posted at 2022-08-20

導入

今回も新しいことを発信しません。(えっへん)
どちらかというみなさんがやってきたことを自分なり再現、ブリコラージュした内容となります。
というよりも備忘録と手順書のような感じです。

記述きっかけは、新人用にSQLを気軽に遊びる用にするにはどうすればいいんだろうと思った際、環境構築は手頃にできるのとローカルを汚さず
手頃に構築できるdocker(dockerの知識はいりますが)を使ってやればいいじゃないと思い構築しました。
また、docker-composeファイルに環境変数をどうやって紐づけるのかという方法も解説しています。

導入時の環境

docker-compose 1.29.2
mysql: 8.0.30

ファイル準備

今回用意したファイルはgithub上にあるのでクローンしてみてください。
ここにおいてます。

git clone git@github.com:shitobe/mysql-docker-compose.git

ファイルの中身の概要

  • /db
    • /initdb.d
      • world.sql
    • my.cnf
  • /docker
    • .env
    • docker-compose.yml

docker-compose.ymlの説明

docker-compose.yml
version: '3'
services:
    mysql:
        image: mysql:8.0.30
        container_name: mysql_local
#        env_fileは環境変数を使う前に宣言した方がいいかも
        env_file:
            - .env
        environment:
            MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
            TZ: 'Asia/Tokyo'
        ports:
            - 3306:3306
        volumes:
            - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
            - ../db/initdb.d/:/docker-entrypoint-initdb.d/
#            永続化する際には、以下のように書くといいかも。
#            - "${MYSQL_DATA_PATH}:/var/lib/mysql"

image: mysql:8.0.30
公式のmysqlイメージを今回活用しています。ちょっと個人的には大きいイメージに感じますが、一番手っ取り早い。
より軽量にするには、alpineなどを活用するといい気がしますが、時短です。

container_name: mysql_local
コンテナネームは、各自で決めてください。私は、とりあえずlocalかわかればなんでもいい派

env_file: .env
同じディレクトリ内のenvを読み込んでいる。
envは以下にしているが任意に変更するとdocker-compose時に自動で紐づいてdockerコンテナを作成できる。

.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATA_PATH=~/data/

environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
TZ: 'Asia/Tokyo'
environmentに.envの環境変数を紐づけている。

ports:
- 3306:3306
ポートの構成は、host側のポートを叩くとコンテナ側のポートを紐づけてくれているというイメージでいいと思います。詳しくはこちらを参考にしています。

volumes:
- ./db/my.cnf:/etc/mysql/conf.d/my.cnf
- ../db/initdb.d/:/docker-entrypoint-initdb.d/
dbディレクトリ内にある、my.cnfとinitdb.dをコンテナ内にマウントさせている。
紐付けている状態なので、ローカル内でmy.cnfをいじると自動的にdocker内のファイルも更新するというイメージでお願いします。
また、環境変数を入れる場合は、
- "${MYSQL_DATA_PATH}:/var/lib/mysql"というふうに、ダブルクオートで括ると使えます。

my.cnfの説明

my.cnf
[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

すべてutf8mb4にしている。

initdb.dの説明

この中には、mysql公式にあるテストsqlデータが入っています。
MySQL公式サンプルデータ

これをinitdb.dに入れておくと自動でDBとして取り込んでくれます。

docker-compose up してみよう。

ここまで準備できたら、クローンしたディレクトリ内に入って以下のコマンドを打ってみよう。

docker-compose up -d
Creating mysql_local ... done

↑のようになれば、docker-composeは作られてさらにコンテナとして起動している。

実際に中身が観れるか確認してみよう。

では試しに接続してみよう。
ソフトは基本一緒だがtableplussにする。

ちなみに業務では、DataGripを使ってますけどね。

Sequel Proはdocker + mysql8は入れないっぽい。

以下TablePlusの操作例

1 TablePlusを起動しよう

「docker-composeでmysqlサーバーを立ち上げてみた。」を編集_-_Qiita.png

2 MySqlを選択して、Create

スクリーンショット_2022_08_20_13_36.png

3 以下の様に入力してください。Passwordはrootが入っています。

Connection____と_「docker-composeでmysqlサーバーを立ち上げてみた。」を編集_-_Qiita.png

4 テーブルが選択できていないので、アイコンをクリック

mysql-local_-MySQL_8_0_30_と_Connection__.png

5 worldテーブルを選択しよう。

mysql-local_-_MySQL_8_0_30.png

6 SQLを叩いてデータが取れるか確認してみよう。
  • SQLをクリック
  • SQLを入力してください。
SELECT *
FROM world.country
where name='Japan';
  • Run Currentをクリック
  • 成功すると1行表示表示されます。
    以下の画像のような形で表示されると思います。
    mysql-local___world_-MySQL_8_0_30_と_Connection__.png

終わり

こんな感じで表示できたら成功です。
SQLの部分は結構自由に書いて試してSQLに慣れてほしいです。
SQLは業務上使う機会は必ずあります。これに慣れてORMに適応できる様に、なればなかなかの即戦力になれると思います。
ORMだけでも楽しい世界です。自分も苦しみ楽しみ成長したいと思っています。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?