Docker for Mac 勉強メモ〜コマンド集〜

#1.はじめに
ひょんなことからデータサイエンティストへ弟子入りし、プログラミングの世界に導かれやってきました、都会で頑張る田舎者です。文系大学卒の元OLです。

今、Dockerを猛勉強中ですので、備忘録も兼ねて猛勉強した内容をちょこちょこと投稿していきたいと思います。

【関連】
→[超新人プログラマー(見習)がまず手にした本と参考にしたWEBサイト〜Docker編〜](https://qiita.com/petadimensionlab/items/4963adf9fb882c05fc5e)
→[Docker for Mac 勉強メモ〜インストール〜](https://qiita.com/petadimensionlab/items/76bb169723e57bdc0133)

#2.コマンドメモ
猛勉強の末、覚えたつもりでも覚えられないコマンド達を随時投稿（編集）していきます！もちろん覚えたコマンドも！
頑張れ自分の脳みそ！！

##・イメージを探す　【docker search】
```docker search [検索ワード]```でDocker Hubで公開されてるイメージを検索出来ます。

```terminal:command
$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   4214                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              108                                     [OK]
```
##・イメージのダウンロード　【docker pull】
```docker pull [イメージ名]:[タグ]```でDocker Hubよりイメージをダウンロード。
[タグ]を省いた場合、最新（latest）バージョンがダウンロード。
　

```terminal:command
$ docker pull centos:7
7: Pulling from library/centos
469cfcc7a4b3: Pull complete 
Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16
Status: Downloaded newer image for centos:7
```
##・イメージの確認　【docker images】
```docker images```でダウンロードしたDockerイメージの一覧を確認。

```terminal:command
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   e934aafc2206        2 weeks ago         199MB
```
コマンド実行結果の内容は以下の通り。

| 項目 | 意味 |
|:--|---|
| REPOSITORY | イメージの名前 |
| TAG | イメージのタグ名 |
| IMAGE ID | イメージID |
| CREATED | 作成日 |
| SIZE | サイズ |

##・イメージの削除　【docker rmi】
```docker rmi [イメージ名:タグorイメージID]```で削除。
※イメージIDは被っていなければ頭３字ぐらいの入力でもOK。

```terminal:command
#私はイメージID派です。
$ docker rmi e93
Untagged: centos:7
Untagged: centos@sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16
Deleted: sha256:e934aafc22064b7322c0250f1e32e5ce93b2d19b356f4537f5864bd102e8531f
Deleted: sha256:43e653f84b79ba52711b0f726ff5a7fd1162ae9df4be76ca1de8370b8bbf9bb0
```
き、消えない・・・！って時は強制終了オプション```-f```を入れる。→```docker rmi -f [イメージ名：タグorイメージID]```

```terminal:command
$ docker rmi e38
Error response from daemon: conflict: unable to delete e38bc07ac18e (must be forced) - image is being used by stopped container 7fd3715ac5ff
#↑停止したコンテナによってイメージが使用されてるので強制終了してね。ってことなので・・・
$ docker rmi -f e38
Untagged: hello-world:latest
Untagged: hello-world@sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Deleted: sha256:e38bc07ac18ee64e6d59cf2eafcdddf9cec2364dfe129fe0af75f1b0194e0c96
```
いっぱい消したい。めんどい。って時は、```docker rmi [イメージ名：タグorイメージID] [イメージ名：タグorイメージID] [イメージ名：タグorイメージID] ・・・```のようにたくさん並べましょう。

```terminal:command
$ docker rmi c9d e38 e93
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:9ee3b83bcaa383e5e3b657f042f4034c92cdd50c03f73166c145c9ceaea9ba7c
Deleted: sha256:c9d990395902a9e219684af847a63d793ccf72cf2aadeece1b576566c5662400
＜省略＞
```
全部いらん！って時は一括削除しましょう！

```terminal:command
$ docker rmi -f `docker images -a -q`
Untagged: jupyter/datascience-notebook:latest
Untagged: jupyter/datascience-notebook@sha256:6472486f72f4554ddd138c67dae31cb99f435cc151704bd9201cc36ef1235e54
Deleted: sha256:9ec5220dbb2abebebc8cd7e06c88774012fada5a98c340df322eb25937d5b80a
＜省略＞
```

##・コンテナの起動 【docker run】
```docker run [オプション] [イメージ名]:[タグ][引数]```でお好みのイメージでコンテナを生成し起動します。

```terminal:command
$ docker run -it --name "test01" centos /bin/bash
[root@e89730ac5e30 /]# exit
```
centosイメージをコンテナにして起動しました。詳細は下記の表にて！

|コマンド| 意味 |
|:--|:--|
|docker run   |コンテナ生成・起動   |
|-it   |コンソールに結果を出力するオプション   |
|--name "test01"   |コンテナ名を命名するためのオプション<br>省くと勝手に命名されます   |
|centos   |使用したイメージ(タグなしなので、latest)<br>イメージがない場合ここでダウンロードしてくれます   |
|/bin/bash   |コンテナ内のシェルを実行<br>`exit`でシェル終了   |

[オプション]がなにやらいっぱいあるみたいで・・・覚えらんない！！
とりあえず今の私でも使えそうなやつだけ。

| オプション | 意味 |
|:--|:--|
|-it |コンソールに結果を出力するオプション |
|--name "コンテナ名"|コンテナ名を命名するためのオプション|
|-d   |バックグラウンドで実行する<br>デタッチ・モード   |
|-p　[ホストのポート番号]:[コンテナのポート番号]   |ホストとコンテナのポートをマッチする   |
|--rm   |実行後に自動でコンテナを削除する   |
|-v [/ホストディレクトリ]:[/コンテナディレクトリ]   |ホストとコンテナのディレクトリ共有<br>コンテナ側で書込み不可にする場合は、コンテナディレクトリの後に[:ro] を追記 |
| （追記があればまた記入）  |・・・   |

使用例として、[jupyter/datascience-notebookのイメージ](https://hub.docker.com/r/jupyter/datascience-notebook/)を用いてコンテナ作成・起動してみました！

```terminal:command
$ docker run -it --name "test001" --rm -v /Users/（pcの名前）/hostdir0001:/home/jovyan/work/condir0001 -p 8888:8888 jupyter/datascience-notebook
```

上記の説明として、、、

|コマンド| 意味 |
|:--|:--|
|jupyter/datascience-notebook   |Jupyterのイメージを、   |
|--name "test001"   |test001という名前を付けて、  |
|-p 8888:8888   |ポート8888番につないで、  |
|-v /Users/（pcの名前）/hostdir0001  |ホストPC(Mac)のディレクトリ”hostdir0001”と、   |
|:/home/jovyan/work/condir0001   |コンテナのディレクトリ”condir0001”を共有して、   |
|docker run |コンテナ生成・起動したよ！ |
|-it |ほんで、コンソールで表示できるようにして、 |
|--rm |コンテナを終了したら自動で消えるようにしたよ！ |
って事です。

ちなみに、コンソール上でに表示されたURLをブラウザで開いたら・・・
ほら、JupyterNotnotebookが開けました！
![jupyterwork.png](https://qiita-image-store.s3.amazonaws.com/0/241094/fa27108d-0deb-e29b-ab3e-79896be7f28b.png)
「work」をクリックすると・・・
ほら、「condir0001」がありました！
![jupytercondir.png](https://qiita-image-store.s3.amazonaws.com/0/241094/8e9dcfb0-c0e9-842e-67b5-332005dcee4b.png)
「hostdir0001」に”test”という名のファイルを置いてみたら・・・
ほら、「condir0001」に入ったーーー！！
![jupytertest.png](https://qiita-image-store.s3.amazonaws.com/0/241094/a5e3f203-ecae-fb9a-569c-2503674938e2.png)
終了する時はコンソール上で「control+c」

##・コンテナの確認 【docker ps】
`docker ps`で起動しているコンテナを確認。

```terminal:command
$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
8bc907e216d5        jupyter/datascience-notebook   "tini -- start-noteb…"   8 seconds ago       Up 35 seconds       0.0.0.0:8888->8888/tcp   test001
```
コマンド実行結果の内容は以下の通り。（分かりやすいのはハショリます）

| 項目 | 意味 |
|:--|---|
| COMMAND | 実行されているコマンド |
| STATUS | コンテナの状態|
| PORTS | 割り当てられたポート |

停止中も起動中も全て確認する場合は、`docker ps -a`を実行！

```terminal:command
$ docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                     PORTS               NAMES
8bc907e216d5        jupyter/datascience-notebook   "tini -- start-noteb…"   15 minutes ago      Exited (0) 7 minutes ago                       test001
b08e94156227        centos:7                       "/bin/bash"              4 days ago          Up 19 seconds                                  hardcore_chaplygin
```

##・コンテナの停止 【docker stop】
`docker stop [コンテナ名orコンテナID]`起動中のコンテナを停止。

```terminal:command
$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b08e94156227        centos:7            "/bin/bash"         4 days ago          Up About a minute                       hardcore_chaplygin
$ docker stop b08
b08
```
##・コンテナの強制終了 【docker kill】
き、消えない・・・！って時は強制終了で`docker kill [コンテナ名orコンテナID]`

```terminal:command
$ docker kill b08
b08
```
##・コンテナの起動 【docker start】
`docker start [オプション] [コンテナ名orコンテナID]`で停止中のコンテナを起動。

```terminal:command
$ docker start -i b08 
[root@b08e94156227 /]#exit
```
標準入力を開くオプション`-i`を使用。
終了する時は`exit`と入力。

##・コンテナの再起動 【docker restart】
`docker restart [コンテナ名orコンテナID]`で再起動。

```terminal:command
$ docker restart b08
b08
```
使い道がよく分からん。。。startだけでよいではないのかね？（初心者的見解）

##・コンテナの削除 【docker rm】
`docker rm [コンテナ名orコンテナID]`で削除。
まずは、`docker ps -a`でコンテナを確認して不要なコンテナを削除しましょう！

```terminal:command
$ docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                     PORTS               NAMES
8bc907e216d5        jupyter/datascience-notebook   "tini -- start-noteb…"   16 minutes ago      Exited (0) 9 minutes ago                       test001
b08e94156227        centos:7                       "/bin/bash"              4 days ago          Exited (0) 3 seconds ago                       hardcore_chaplygin
＜省略＞
$ docker rm 8bc
8bc
```
イメージと同様に同時削除、強制終了”`-f`”もOK！

```terminal:command
$ docker rm -f b08 6a
b08
6a
```
あーー！！もう全部いらん！！って時は、イメージ同様に一括削除でスッキリ！（起動中も停止中も全て強制削除）

```terminal:command
$ docker rm -f `docker ps -a -q`
ea7b380afc0e
e89730ac5e30
・
・
＜省略＞
```
#３.参考URL・本
・[絶対に挫折しない！オープンソースソフトウェア「Docker」入門編 #03](https://liginc.co.jp/358145)
→docker runコマンドのオプションについて参考にさせていただきました！

・[Dockerでよく使うコマンドまとめ](http://morizyun.github.io/docker/about-docker-command.html)
・[dockerコマンドチートシート](https://qiita.com/kite_999/items/e26d58b08e247134f7fe)
→コマンド集です！

---
以上です！
今の段階で最低限必要なコマンドについて勉強した事をまとめました！