docker compose で MySQL と adminer を動かした

## why

* docker-compose up で 複数コンテナを動かせることとができたが、コマンドで省略されている
ネットワークなどが分からないので、run + 引数 で compose と同じものを動かして理解を深めたい

* docker-compose で DB のうごくアプリをって言われたがなんもわからん

>
まずは、データは置いといて、
docker-compose で MySQL のコンテナを立ち上げること
MySQL のコンテナの MySQL を操作できること
ここまでを実現するのがよいかなと

* こう言われたので docker-compose で MySQL のコンテナを立ち上げることにした

## MySQL とは？


https://hub.docker.com/_/mysql

Docker　Hub の説明を読む

>
MySQL is the world's most popular open source database. 
With its proven performance, reliability and ease-of-use, 

* MySQL は世界で最も有名な オープンソースの DB
* (よく使われて)証明されているパフォーマンスと信頼性、使い勝手で有名。

>
MySQL has become the leading database choice for web-based applications, 
covering the entire range from personal projects and websites, 
via e-commerce and information services, 

* EC や 情報サービスでよく使われる

all the way to high profile web properties including 
Facebook, Twitter, YouTube, Yahoo! and many more

* FB, Twitter, Youtube, Yahoo!, などで使われている

## compose up で MySQL 単体を動かす

* これはコピペで簡単だった

```yml:docker-compose.yml
version: "3.7"
services:
  db:
    image: mysql:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
```

* 最小限の DB だけの compose がこれ
    * 最新の MySQL
    * 環境ではパスワードを空にするをの許す

```
docker-compose up

db_1  | 2020-09-25T09:39:26.918399Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1  | 2020-09-25T09:39:26.944264Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.21'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - 
```

*  adminer などを入れてないので サーバーやブラウザでも触れないが、MySQL が立ち上がっている
*  localhost 3306 を開いても phpMyAdmin のような 管理画面に行けるわけではない。
*  (多分 DB サーバーのみ。Blitz などの App サーバーで使える)

## compose で MySQL と adminer を動かす

https://hub.docker.com/_/mysql

* ここの公式のコードを使用

```yml:
# Use root/example as user/password credentials
version: '3.8'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
```

* version を　3.1 から 3.8 に変更

```
 docker-compose up                                                    
Creating network "docker-mysql_default" with the default driver                                   
Creating docker-mysql_db_1      ... done                                                          
Creating docker-mysql_adminer_1 ... done                                                          
Attaching to docker-mysql_db_1, docker-mysql_adminer_1                                            
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0
.22-1debian10 started.                                                                            
adminer_1  | [Thu Oct 29 09:57:59 2020] PHP 7.4.11 Development Server (http://[::]:8080) started  
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'   
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0
.22-1debian10 started.                                                                            
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Initializing database files           
db_1       | 2020-10-29T09:57:59.482611Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 
8.0.22) initializing of server in progress as process 46                                          
db_1       | 2020-10-29T09:57:59.489105Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has
 started.                                                                                         
db_1       | 2020-10-29T09:57:59.904580Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has
 ended.                                                                                  
```

* 動いた。

![Screen Shot 2020-10-29 at 18.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/fd8dd14a-ac9c-53c3-e293-5916b0a3fe0b.png)

* Chrome で開くと立ち上がっているのを確認

```
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49608 Accepted
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49610 Accepted
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49608 [403]: GET /?pgsql=db&username=example&db=test&ns=public&table=test-test
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49608 Closing
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49610 [200]: GET /?file=favicon.ico&version=4.7.7
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49610 Closing
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49618 Accepted
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49616 Accepted
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49616 [200]: GET /
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49616 Closing
```

* 8080 にアクセスすると反応している



## docker-compose とは？

* docker run のオプションをかく物と仮定する

さくらの記事を参考に

https://knowledge.sakura.ad.jp/16862/

>
Docker Composeは、複数のコンテナで構成されるアプリケーションについて、
Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。

* run だけではなく build と stop もまとめて行えるコマンドらしい

>
これまでの連載の中でも、複数のコンテナを起動させる場面がありました。
その際、各コンテナを起動するために、それぞれ起動コマンドを実行する必要がありました。
また、コンテナを起動する際に、いろいろなオプションを利用していました。
>
コマンドや手順が複雑になると、他の環境で使う／使ってもらう場合に、ミスが発生しやすくなります。
他の環境でも同じ構成（同じDockerイメージ）で動かせるというDockerのメリットを生かすには、
起動手順なども簡単であってほしいですよね。
>
そこで活躍するのが、Docker Composeです。

* ミスが発生しないように起動手順などを簡単にするのが docker-compose らしい

-------

## run と compose の引数の対照

https://knowledge.sakura.ad.jp/16862/

この記事によると

>
設定内容: docker run コマンド, docker-compose.yml
コンテナ名: --name , container_name
環境変数: -e , environment
ポートフォワード: 	-p , ports
使用するDockerイメージ: コマンドの最後 , image

* この対応になっている。compose のこの欄を引数で手打ちすれば run でも使えるはず。

---

## Docker run で MySQL DB サーバーのみをうごかす

参考
dockerhub mysql 公式

`
https://hub.docker.com/_/mysql
`

```
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
```

>
.. where some-mysql is the name you want to assign to your container, 
my-secret-pw is the password to be set for the MySQL root user and 
tag is the tag specifying the MySQL version you want. See the list above for relevant tags.

* some-mysql はコンテナにアサインしたい名前
* my-secret-pw は mysql の root パスワード
* tag は 特別な mysql の version 

```
docker run \
--name run-mysql \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:latest

Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql

af7528e958b6: Pull complete 
Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808
Status: Downloaded newer image for mysql:latest
04191d9ecd9d6a97c661158ea20d837a07b35bd361397ae918ab3ee1a76548b2
```


* 作成されたみたいだ
* コンテナの名前の16進数が帰ってきた
* プロセスを確認してみる

```
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
04191d9ecd9d        mysql:latest        "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        3306/tcp, 33060/tcp   run-mysql
```

* run-mysql という名前の mysql:latest のコンテナが動いてる
* 多分この コマンドで DB サーバーが立ち上がった
* この後は App サーバーを立ち上げる


## 別のコンテナを接続

* これに並列して adminer のコンテナを動かして network で接続する
* 結論として不可能だった。compose でやることにする

### やることの説明

>
The following command 
starts another mysql container instance 
and runs the mysql command line client 
against your original mysql container, 
allowing you to execute SQL statements 
against your database instance:

これらのコマンドでは

* オリジナルの MySQL コンテナに対して
* また別の MySQL コンテナ インスタンスをスタートし
* MySQL コマンドライン クライアントを走らせる
* (今回で言うとオリジナルのMySQLコンテナのような)データベース インスタンス に対して
* SQL 文を実行できるようにする

「これ（コンテナに対して新しく MySQL コマンドライン クライアントのインスタンスを走らせる）
を使えば一般的なデータベースに接続できる（今 you が作ったオリジナルにも）」
という意味。

インスタンスは この2つ

* オリジナルの MySQL コンテナ (DBインスタンス)
* MySQL コマンドライン クライアント インスタンス

インスタンス が compose で言う services: の中身の解釈です

```
docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p
```

>
... where some-mysql is the name of your original mysql container 
(connected to the some-network Docker network).
>

* some-mysql はオリジナルコンテナの名前
* some-network という Docker ネットワーク

### 実行すると network がない

```
docker run -it \
--network run-mysql-network \
--rm mysql mysql \
-hrun-mysql \
-uexample-user -p \
```

* -network を`run-mysql-network` にして
* 終わったら削除することにして
* 動かすコンテナを `run-mysql` にして
* ユーザーの例を プレイヤーにして
* 起動。

```
docker: Error response from daemon: 
Could not attach to network run-mysql-network: 
rpc error: code = NotFound desc = network run-mysql-network not found.
```

* `run-my-network` に attach できない
* その名前のネットワークが見つからない
* 新しくこれで run-mysql-network というネットワークができたりはしないらしい

## ネットワークとは？

ネットワークの状況を見てみる

```
docker network ls
NETWORK ID          NAME                  DRIVER              SCOPE
9c5a8f439579        bridge                bridge              local
c782587be9fa        docker_gwbridge       bridge              local
ca04d2ac4141        host                  host                local
zp84rl1ybyb2        ingress               overlay             swarm
ccb78c451e9e        nextjs-blog_default   bridge              local
87eb957ef9f8        none                  null                local
```

* bridge, host, overlay, null, が動いてる。これらはなんだろう？

* Docker Network を調べる必要があることに気づいた、その公式に当たる

https://docs.docker.com/network/


* bridge が難しかった。 bridge を作るのはかなり時間がかかりそう
* 指示も最初から compose で動かせるようにだし、run での mysql と adminer の実行は諦めた