DockerによるMySQLお勉強環境の簡単立ち上げ

# docker-composeを使ったMySQLお勉強環境の構築

- Dockerを使ってデータベースのお勉強環境を簡単に立ち上げる方法を確率することが目的
- 基本上からコピペで作成できます
- Jupyter Notebookにまとめているので、要望あればgithubに公開します

## 事前準備

```bash:command
mkdir -p mysql
mkdir -p mysql/db
```

## docker-compose.yml 作成


```bash:command
PORT_HOST="13306"
PORT_CONTAINER="3306"
PASSWORD="mypass"
```


```bash:command
cat << ETX > docker-compose.yml
version: '3'
services:
  mysql:
    build: ./mysql/      #Dockerfileからビルドすることを示す
    ports:
      - "${PORT_HOST}:${PORT_CONTAINER}"     #ホストの33060番ポートとコンテナの3306番ポートをマッピング
    volumes:
      - ./mysql/db:/docker-entrypoint-initdb.d  #初期データ
    environment:
      - MYSQL_ROOT_PASSWORD=${PASSWORD}   #環境変数
ETX
cat docker-compose.yml
```


## Dockerfile


```bash:command
cat << ETX > mysql/Dockerfile
#Dockerfile

#使うDockerイメージ
FROM mysql

#ポートを開ける
EXPOSE ${PORT_HOST}

#MySQL設定ファイルをイメージ内にコピー
ADD ./my.cnf /etc/mysql/conf.d/my.cnf

#docker runに実行される
CMD ["mysqld"]
ETX
cat mysql/Dockerfile
```


```bash:command
cat << ETX > mysql/my.cnf
[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8
ETX
cat mysql/my.cnf
```

## world.sqlのインポート (サンプルデータであり何でも良い)

以下よりダウンロードしmysql/dbの中に保存する。

https://dev.mysql.com/doc/index-other.html


```bash:command
wget https://downloads.mysql.com/docs/world-db.tar.gz
tar xvzf world-db.tar.gz
mv world-db/world.sql mysql/db
ls -l mysql/db
```

    --2022-08-08 22:55:03--  https://downloads.mysql.com/docs/world-db.tar.gz
    downloads.mysql.com (downloads.mysql.com) をDNSに問いあわせています... 2600:140b:a800:ab3::2e31, 2600:140b:a800:a94::2e31, 23.206.10.112
    downloads.mysql.com (downloads.mysql.com)|2600:140b:a800:ab3::2e31|:443 に接続しています... 接続しました。
    HTTP による接続要求を送信しました、応答を待っています... 200 OK
    長さ: 92915 (91K) [application/x-gzip]
    `world-db.tar.gz' に保存中
    
    world-db.tar.gz     100%[===================>]  90.74K  --.-KB/s 時間 0.07s      
    
    2022-08-08 22:55:04 (1.20 MB/s) - `world-db.tar.gz' へ保存完了 [92915/92915]
    
    x world-db/
    x world-db/world.sql
    total 784
    -rw-r--r--  1 daisuke  staff  398635  8  1 07:05 world.sql



```bash:command
rm -rf world-db*
```

## mysqlのbuild


```bash:command
docker-compose build
```

    Building mysql
    [1A[1B[0G[?25l[+] Building 0.0s (0/1)                                                         
    [?25h[1A[0G[?25l[+] Building 0.1s (7/7) FINISHED                                                
    [34m => [internal] load build definition from Dockerfile                       0.0s
    [0m[34m => => transferring dockerfile: 271B                                       0.0s
    [0m[34m => [internal] load .dockerignore                                          0.0s
    [0m[34m => => transferring context: 2B                                            0.0s
    [0m[34m => [internal] load metadata for docker.io/library/mysql:latest            0.0s
    [0m[34m => [internal] load build context                                          0.0s
    [0m[34m => => transferring context: 141B                                          0.0s
    [0m[34m => [1/2] FROM docker.io/library/mysql                                     0.0s
    [0m[34m => CACHED [2/2] ADD ./my.cnf /etc/mysql/conf.d/my.cnf                     0.0s
    [0m[34m => exporting to image                                                     0.0s
    [0m[34m => => exporting layers                                                    0.0s
    [0m[34m => => writing image sha256:7ecdd05dff28b447c9586d1dcf7cacd652b94a015ae51  0.0s
    [0m[34m => => naming to docker.io/library/docker_mysql_mysql                      0.0s
    [0m[?25h

## コンテナーの起動 (-d でバックグラウンド実行)


```bash:command
docker-compose up -d
```

    Creating network "docker_mysql_default" with the default driver
    Creating docker_mysql_mysql_1 ... 
    [1Bting docker_mysql_mysql_1 ... [32mdone[0m


```bash:command
docker ps
```

    CONTAINER ID   IMAGE                COMMAND                  CREATED        STATUS                  PORTS                                           NAMES
    7ce334b9568d   docker_mysql_mysql   "docker-entrypoint.s…"   1 second ago   Up Less than a second   13306/tcp, 33060/tcp, 0.0.0.0:13306->3306/tcp   docker_mysql_mysql_1


## MySQL環境へのログイン

### CONTAINER_IDの取得


```bash:command
CONTAINER_ID=$(docker ps | grep docker_mysql_mysql | awk '{print $1}') && echo $CONTAINER_ID
```

    7ce334b9568d


### CONTAINERに直接ログインするとき


```bash:command
docker exec -it ${CONTAINER_ID} bash
```

```bash:container
mysql -u root -p mysql
```

以降は好きにテスト


### HOSTからアクセスするとき


```bash:command
mysql -u root -p -h localhost -P 13306 --protocol=tcp
```

以降は好きにテスト

## お片付け


```bash:command
docker-compose down
```

    Stopping docker_mysql_mysql_1 ... 
    [1BRemoving docker_mysql_mysql_1 ... mdone[0m
    [1BRemoving network docker_mysql_defaultne[0m



```bash:command
docker ps -a
```

    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


## 参考

- https://mmtomitomimm.blogspot.com/2018/04/docker-mysqldb.html
- https://qiita.com/TAMIYAN/items/ed9ec892d91e5af962c6
- https://poota.net/archives/685