初心者のためのDockerガイド　~mysqlコンテナを作ろう~

# お知らせ
こんにちは、愛知工業大学システム工学研究会です。
この記事は、2019-10-07に書かれた記事です。
間違った内容や古い内容が紛れていますが、過去の記事を残す一環として記事を書きます。
よろしくおねがいします。

ざっくりdockerがどんなものか知ってもらえれば幸いです。<figure class=\"wp-block-image\"></figure>Dockerとは、コンテナ技術を利用した仮想環境を構築...
===

ざっくりdockerがどんなものか知ってもらえれば幸いです。

## Dockerとは？

<figure class="wp-block-image">![](https://i.imgur.com/ygHmAZH.jpg)</figure>

Dockerとは、コンテナ技術を利用した仮想環境を構築、実行、管理するためプラットホームです。コンテナと呼ばれるコードや依存関係をまとめたものを、ホストOSのカーネルを利用して、隔離、制限させることで擬似的に独立した実行環境を構築することができます。

仮想マシンと似てますが、仮想マシンは実行環境ごとにゲストOSを動かします。

一方、コンテナはホストOSで実行するためより軽量で高速に実行停止することができます。

またDockerは、Dockerイメージを他者に渡すことができるのでチーム内の開発環境の共有が楽になります。

## 実行環境

macos 10.12.6

## Dockerをインストール

実際にDockerを入れてみましょう！

2通り出しておきます。

他の方法じゃなくても問題ないです。

### Homebrewからインストール

Homebrewとは、macOS用のパッケージ管理ツールです。

これを使えばアプリケーション、ソフトウェアを楽に管理できます。

ホームページは、下のurlから。

https://brew.sh/index_ja

Homebrewをインストールするため以下のコマンドをターミナルで打ってください。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

以下のコマンドでDockerインストールできます。

`$ brew cask install docker`

### ディスクトップからインストール

mac版は下のURLから

https://hub.docker.com/editions/community/docker-ce-desktop-mac

## Dockerを使おう

### Dockerのバージョンを見てみましょう

`$ docker -v`を打ってみましょう

`Docker version 18.06.1-ce, build e68fc7a`

上記のようにバージョンが表示されます

### Dockerイメージを入手しよう

Dockerイメージとは、コンテナを動かすのに必要な設定ファイルをまとめたものです。

Dockerコンテナは、このDockerイメージがないと起動しません。

このイメージを共有することで、様々なマシンで同じコンテナを動作させることができます。

イメージはDockerHubで配布されてます。

イメージを取得するには`docker pull`コマンドを使います。

このコマンドの構文は次の通りです。

`docker pull [option] image名[:タグ名]`

タグ名とは、イメージのバージョンです。

今回は最新のMysqlベースのイメージをdockerhubからもらいましょう。

以下のコマンドを叩いてください。

`$ docker image pull mysql:latest`

また全タグを入手したい時は、`$ docker image pull -a mysql`

### Dockerイメージの一覧表示

入手したイメージ一覧が見たいときは以下のコマンドから

`$ docker image ls [option] [リポジトリ名]`

リポジトリ名に確認したいイメージ名を入れると、そのイメージのみ出力されます。

今回は、mysqlイメージが入ってるか確認したいので以下のコマンドを打ってください。

`$ docker image ls mysql`

以下のようにリスト形式で出力されます。

```
REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 656186fff20d 3 weeks ago 372MB
```

リストの各項目一覧です。

<figure class="wp-block-table">

| 項目 | 内容 |
| --- | --- |
| REPOSITORY | イメージ名 |
| TAG | イメージのタグ名 |
| IMAGE ID | イメージID
イメージ特有の番号 |
| CREATED | 作成日 |
| SIZE | イメージのサイズ、容量 |

</figure>

主なオプション一覧

<figure class="wp-block-table">

| オプション | 内容 |
| --- | --- |
| -a | 全てのイメージを表示 |
| --digests | ダイジェストを表示する |
| --no-trunc | 結果を全て表示 |
| -q | イメージのIDのみ出力 |

</figure>

### Dockerイメージを削除する

作成したイメージを削除するには、以下のコマンドから

`$ docker image rm [option] イメージ名`

主なオプション一覧

<figure class="wp-block-table">

| オプション | 内容 |
| --- | --- |
| -f | 強制的にイメージを削除する |
| --no-prun | 中間イメージを削除しない |

</figure>

### Dockerコンテナを動かそう

Mysqlイメージを入手したのでコンテナを動かしましょう！

コンテナを動作するコマンドは以下の通り

`docker run [option] image名:バージョン [COMMAND]`

主なオプション一覧

<figure class="wp-block-table">

| option | 内容 |
| --- | --- |
| -i | コンテナの STDIN にアタッチ |
| -t | 疑似ターミナル (pseudo-TTY) を割り当て |
| -d | バックグラウンド実行 |
| -e | 環境変数の設定 |
| --name | コンテナ名の設定 |
| -p | ポート指定　ホストマシンのポート番号:コンテナ内のポート番号 |

</figure>

実際に以下のコマンドを叩いてください

```
$ docker run -it -d\ -e MYSQL_ROOT_PASSWORD=mysql \ --name "mysqltest" \ -p 43306:3306 mysql:latest
```

"-d"をつけずに実行しても可

停止させたかったら"ctrl + c"すれば止まるはず

エラーが出なかったら、次は以下のコマンドを打ってください

`$ mysql -h 127.0.0.1 --port 43306 -uroot -pmysql`

これでmysqlにログインできます

下記と似たような画面になったら成功！！

```
mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.25 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
```

`exit`で脱出できます

### 動いてるDockerコンテナを確認しよう

どんなコンテナが動いてるか確認しよう

コンテナを動作するコマンドは以下の通り

`docker ps [OPTIONS]`

主なオプション一覧

<figure class="wp-block-table">

| 命令 | 内容 |
| --- | --- |
| -a | 全てのコンテナを表示
停止してるコンテナも表示 |
| -f | Goテンプレートを使用したきれいな印刷コンテナ |
| -l | 最新に作成されたコンテナを表示します（すべての状態を含みます） |
| -s | 合計ファイルサイズを表示する |

</figure>

実際に以下のコマンドを叩いてください

`docker ps`

下記のような一覧が出るはずです。

```
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3be4ac05b26b mysql:latest "docker-entrypoint.s…" 2 days ago Up 4 seconds 33060/tcp, 0.0.0.0:43306->3306/tcp mysqltest
```

リストの各項目一覧です。

<figure class="wp-block-table">

| 項目 | 内容 |
| --- | --- |
| CONTAINER ID | コンテナID |
| IMAGE | コンテナのベースイメージ |
| COMMAND | コンテナ内で実行しているコマンド |
| CREATED | コンテナ作成日 |
| STATUS | コンテナの状況 |
| PORTS | 割り当てられたポート番号
見方：ホスト側から見たときののポート番号->コンテナ内のポート番号 |
| NAMES | コンテナ名 |

</figure>

### Dockerコンテナを一時停止しよう

コンテナを一時停止するコマンドは以下の通り

`docker pause コンテナ名 [コンテナ名(複数指定する場合)]`

実際に実行

`docker pause mysqltest`

コンテナ名、コンテナIDどちらでも止めれます

`docker ps`で確認するとSTATUSが`Up 2 hours (Paused)`と同じようになってるはずです。

### Dockerコンテナを再開しよう

再開するには以下のコマンドを打ちます

`docker unpause コンテナ名 [コンテナ名(複数指定する場合)]`

実際に実行

`docker unpause mysqltest`

こちらもコンテナ名、コンテナIDどちらでも止めれます。

### Dockerコンテナを停止しよう

`docker stop [OPTIONS] コンテナ名 [コンテナ名(複数指定する場合)]`

終わったらちゃんとコンテナ止めましょう！

実際に以下のコマンドを打ってください

`$ docker stop mysqltest`

止まってるか確認できたら次へ行きましょう

### Dockerコンテナを削除しよう

もう使わなくなったコンテナは消していきましょう。

コンテナを削除するコマンドは以下の通り

`docker rm [option] コンテナ名`

主なオプション一覧

<figure class="wp-block-table">

| オプション | 内容 |
| --- | --- |
| -f | 強制的にコンテナを削除する |
| -l | 指定されたリンクを削除する |
| -v | コンテナに関連付けられているボリュームを削除します |

</figure>

実際に以下のコマンドを打ってください

`$ docker rm mysqltest`

消えてなかったら`-f`使いましょう

### Dockerfileを使ったコンテナ作り

Dockerfileとは、コンテナのインフラ構成を記述したファイルのことです。

`docker build`を使いDockerfileを元にコンテナを作ることができます。

他人に渡せば、同じコンテナが使えます。

Dockerfileの基本書式は、`命令　引数`を連ねるだけ。命令は大文字、小文字どちらでも動きます

よく使うDockerfileの命令の一覧

<figure class="wp-block-table">

| 命令 | 内容 |
| --- | --- |
| FROM | ベースとなるイメージの指定 |
| RUN | 引数に書かれたコマンドの実行 |
| ENV | 環境変数の設定 |
| ADD | ファイル、ディレクトリの追加 |
| 詳しくはリファレンスを見てください。 |
| http://docs.docker.jp/engine/reference/builder.html#expose |

</figure>

実際にDockerfileを作りましょう！

適当なディレクトリに`Dockerfile`を作って内容を下からコピペしてください。

```
FROM mysql:latest ENV MYSQL_ROOT_PASSWORD mysql
```

Dockerfileができたら以下のコマンド実行してください。

`$ docker build -t mysqltest2:1.0`

コンテナが作られてるはずなので`$ docker image ls`で確認してください

できてたらコンテナを起動しましょう。

```
$ docker container run -it -d\ -p 43306:3306 mysqltest2:1.0
```

## 参考文献

* プログラマのためのDocker教科書-第2版-インフラの基礎知識-コードによる環境構築の自動化
    https://www.amazon.co.jp/dp/4798153222/
* https://brew.sh/index_ja
* https://hub.docker.com/_/mysql?ref=login
* http://docs.docker.jp/engine/reference/builder.html#expose