ダッシュで奪取

自分用のメモ

【Docker】MySQLコンテナの中に、テーブルを作成したい

仕事で Docker を使っているのですが、自分で好きなようにコンテナ立てられたら楽しいだろうな〜と思ったので…まずは馴染みのある SQL で遊ぶことにしました。

この記事のゴール
  • MySQLのコンテナを立てて、適当なテーブルを作る

  • ↑ のテーブルに、適当なレコードを登録する

  • コンテナを閉じても、登録したレコードが残るようにする

環境
  • Docker version:2.2.0.5

目次

  1. コンテナを立てる
  2. テーブルを作って、レコードを登録してみる
  3. コンテナを閉じても、レコードが残るようにする
  4. 参考URL

1. コンテナを立てる

./docker-compose.yml
version: '3.7'
services:
  mysql:
    image: mysql:8
    security_opt:
      - seccomp:unconfined
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: 'Asia/Tokyo'
    volumes:
      - ./etc/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 3306:3306
  • security_opt

    • コンテナへのアクセス権を設定する?

    • 今回は練習用のため不要 → seccomp:unconfined で未設定にする

    • あまり資料が見つからなかった 今度ちゃんと調べる

  • volumes

    • コンテナの外にあるファイルを、コンテナの中から使えるようにする

    • ローカルにある ./etc/my.cnf を、コンテナの /etc/mysql/conf.d/my.cnf として使う

./etc/my.cnf

文字コードなどを設定

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
default-authentication-plugin=mysql_native_password

[client]
default-character-set=utf8mb4

起動してみる → できた!

$ docker-compose up -d --build

Creating network "mysql_default" with the default driver
Creating mysql_mysql_1 ... done

2. テーブルを作って、レコードを登録してみる

コンテナの中に入る

$ docker-compose exec mysql bash

root@なんとか:/# 

MySQL起動

# mysql -u root -p

Enter password:
mysql> 

hoge データベースを作る

mysql> create database hoge;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| hoge               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

pokemons テーブルを作る

mysql> use hoge
Database changed

mysql> CREATE TABLE pokemons ( id int auto_increment primary key, name varchar(30));
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+----------------+
| Tables_in_hoge |
+----------------+
| pokemons       |
+----------------+

mysql> desc pokemons;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

pokemons テーブルに、レコードを登録する

mysql> INSERT INTO pokemons (name) values('pikachu');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM pokemons;
+----+---------+
| id | name    |
+----+---------+
|  1 | pikachu |
+----+---------+

できた ヤッター!

3. コンテナを閉じても、レコードが残るようにする

今の状態だと、 docker-compose down した時にデータベースごと消えてしまうので、それが残るようにします。

./docker-compose.yml
version: '3.7'
services:
  mysql:
    image: mysql:8
    security_opt:
      - seccomp:unconfined
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: 'Asia/Tokyo'
    volumes:
      - ./etc/my.cnf:/etc/mysql/conf.d/my.cnf
      - db-data:/var/lib/mysql
    ports:
      - 3306:3306
volumes:
  db-data:

※下記の箇所を追加

12行目

- db-data:/var/lib/mysql

15〜16行目

volumes:
  db-data:
  • ローカルに「db-data」という領域(ボリューム)を作ってMySQLのデータが保存されている場所 var/lib/mysql と紐付ける

  • ボリュームは明示的に削除しない限り残っているので、結果としてコンテナを削除してもデータが消えなくなる

テーブルにレコードを登録してから docker-compose downdocker-compose up -d --build で、中身が残っていることを確認!

4. 参考URL