LoginSignup
5
7

More than 5 years have passed since last update.

DockerにてMySQLをpullして起動 初回SQLの読み込み データの永続化

Posted at

Dockerをinstall後にMySQLイメージをpullして起動 初回SQLの読み込みにとデータの永続化までに行なったことのメモです。

Dockerのinstall

公式サイトよりGet Docker fot Macをクリックしてinstallします。

サンプル用のディレクトリ作成

Dockerのinstall後にサンプル用ディレクトリを作り移動します。

$ mkdir sample
$ cd sample
$ ls

現状lsしても何も表示されません。

MySQLイメージをpull

今回はdocker-composeにてpullなどを行います。
docker-compose.ymlというファイルを作成し以下の様に記載し$ docker-compose upで起動します。

sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: root
      MYSQL_PASSWORD: root

MYSQL_ROOT_PASSWORDなどはお好きな値を設定します。
MYSQL_DATABASEに設定した名前でデータベースが作成されます。

$ docker-compose up
Starting sample_db_1
Attaching to sample_db_1
...

起動する際に以下の様なエラーが出た場合はdocker-compose.ymlMYSQL_USER: 値を削除すると上手く起動します。
既に存在するユーザー名を設定した場合にエラーが出るようです。

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
...

変更後MYSQL_USER: 値を削除

sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: root

MySQLにログイン

$ docker-compose upしたまま、別のターミナルなどでログインしてみます。
$ docker psで起動しているコンテナのIDを取得してログインします。

$ docker ps
CONTAINER ID IMAGE
xxxxx     mysql:5.6 

$ docker exec -it xxxxx(CONTAINER IDの値) bash
root@xxxxx(CONTAINER IDの値):/# mysql -u root -p
Enter password: 設定したパスワードを入力

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

MYSQL_DATABASE:に設定したデータベースが作成されています。

初回SQLの読み込み

初回のみSQLを読み込みするようsqlディレクトリ以下にsample.sqlを追加しdocker-compose.ymlに設定を加えます。

sample/
  ├ sql/
  │  └ sample.sql
  └ docker-compose.yml
sample/sql/sample.sql
use test;
CREATE TABLE user (id int);

volumes:部分に- "./ディレクトリ:/docker-entrypoint-initdb.d"を指定します。
指定したディレクトリ以下にある.sqlなどを読み込んでくれます。
今回はsql以下にあるsample.sqlを読み込みます。

sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - "./sql:/docker-entrypoint-initdb.d"
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: root
$ docker-compose up
別ターミナルでMySQLにログイン
mysql> show tables from test;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+

データの永続化

今までの状態でテーブルにデータを追加したり削除しても、$ docker-compose downしてしまったらデータが消えてしまいます。

永続化するためにdocker-compose.ymlに設定を加えます。

sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - "./db:/var/lib/mysql"
      - "./sql:/docker-entrypoint-initdb.d"
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: root

"./ディレクトリ:/var/lib/mysql"を加えることでデータの永続化が出来ます。
今回の場合は

sample/
  ├ sql/
  │  └ sample.sql
  └ docker-compose.yml

の状態から設定したdbディレクトリが作成され以下にデータベースのtestなどのディレクトリが自動的に作成されます。

sample/
  ├ sql/
  │  └ sample.sql
    ├ db/
  │  └ mysql/
  │  └ performance_schema/
  │  └ test/
  └ docker-compose.yml
5
7
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
5
7