7
6

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でMySQLを構築する

Last updated at Posted at 2022-07-28

DokerでMySQLを使うことが多いので、設定方法などをメモします。
ソースコードはGitHub🐱でも公開しています。

🌱 環境

  • macOS Monterey 12.4
  • docker-compose 1.29.2

🗂 ディレクトリ構成

mysql
  ├── README.md
  ├── docker-compose.yml
  └── sql
      ├── data
      ├── tmp
      ├── init
      └── myconf
          └── my.cnf

🐳 手順

① docker-compose.ymlファイルを用意

ルートディレクトリにdocker-compose-ymlを作成し以下をコピペします。

docker-compose.yml
version: "3.1"
services:
  my-mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    container_name: my-mysql
    volumes:
      # 永続化用のマウント先
      - ./sql/data:/var/lib/mysql
      # 初期データ
      # - ./sql/init/:/docker-entrypoint-initdb.d
      # my.cnf
      - ./sql/myconf/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: user
      MYSQL_ROOT_PASSWORD: pass
    ports:
      - "3306:3306"

解説

  • version: docker-composeのバージョンです。
  • my-mysql: このサービスの名前です。適当でOKです。
  • command: 認証方法を設定しています。
  • container_name: コンテナ名です。
  • volumes:
    • ./sql/data: コンテナを停止してもデータが消えないように/var/lib/mysqlのデータを./sql/dataで保存するように設定しています。
    • ./sql/init/: 初期データがあればここにおきます(今回はないのでコメントアウトです)。
    • ./sql/myconf/my.cnf: mysqlの設定ファイルの置き場所です。
  • environment
    • MYSQL_USER: 作成するユーザ名を設定します
    • MYSQL_PASSWORD: 作成するユーザのパスワードを設定します
    • MYSQL_ROOT_PASSWORD: ルートユーザのパスワードを設定します

② my.cnfを用意

myconfにmy.cnfを入れて以下をコピペします。

myconf/my.cnf
[mysqld]
default-time-zone='+9:00'
character-set-server=utf8mb4

[client]
default-character-set = utf8mb4

日本時間のタイムゾーンと、日本語を表示するための文字コードを設定しています。

③ Dockerコンテナ起動

docker compose up -d

少し待って、
Creating my-mysql ... done
と表示されたらOKです。

docker psで確認してみます。

docker ps

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
x0x00x0000x0   mysql:8.0   "docker-entrypoint.s…"   29 minutes ago   Up 29 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   my-mysql

コンテナ内に入ってみます。

docker exec -it my-mysql bash

root@x0x00x0000x0:/#

入れていそうです。
lsしてみます。

bin   docker-entrypoint-initdb.d  home	 media	proc  sbin  tmp
boot  entrypoint.sh		  lib	 mnt	root  srv   usr
dev   etc			  lib64  opt	run   sys   var

問題なさそうです。
抜ける時はexitを叩けばOKです。

④ データベースの作成

データベースを作ります。
Dockerコンテナ内のMySQLに入ります。

docker exec -it my-mysql mysql -uroot -ppass

create databaseをします。

create database mydb

showで確認してみます。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               | <- ある
| mysql              |
| performance_schema |
| sys                |
+--------------------+

できてますね。

ついでにdocker-compose.ymlで設定したユーザも確認してみます。

mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| user             | %         | <- いる
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

ちゃんといますのでOKです。

⑤ SQL ファイルの取り込み

tmp配下に以下のファイルを作成します。

sample.sql
CREATE TABLE mydb.users (
  id int,
  name varchar(10)
);

SQL ファイルをコンテナにコピーし、

docker cp sql/tmp/sample.sql <CONTAINER ID(docker psで確認可能)>:/usr/local/etc

docker コンテナに入り、

docker exec -it <CONTAINER ID> bash

SQL を取り込みます。

mysql -uroot -ppass mydb < /usr/local/etc/sample.sql

確認するとテーブルが作成されているのがわかります。

mysql -uroot -ppass mydb

mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

以上

📔 参考

参考にさせていただきました

7
6
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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?