よく使うDockerコマンド

#**はじめに**
[株式会社サイシード](http://sciseed.jp)のインターンシップにて、**Docker**を導入しました。
**Docker**を使用する上でよく使うコマンドをまとめました。
本稿が少しでもみなさまの参考になれば幸いです。

#####**実行環境**

・windows7
・vagrant（Ubuntu）


#**よく使うDockerコマンド一覧**

####**１．Docker hubからイメージを検索**

```txt:Ubuntu
　　$ sudo docker search イメージ名 | more
```

```txt:Ubuntu
　　# 例
　　$ sudo docker search centos:latest | more
```
　
####**２．イメージ一覧**

```txt:Ubuntu
　　$ sudo docker images
```
　
####**３．イメージの取得**

```txt:Ubuntu
　　$ sudo docker pull イメージ名
```

```txt:Ubuntu
　　# 例
　　$ sudo docker pull centos:latest
```
　
####**４．イメージの削除**

**（１）特定のイメージを削除**
```txt:Ubuntu
　　$ sudo docker rmi イメージ名またはイメージID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker rmi centos:latest
```

**（２）タグがついていないイメージをすべて削除**　
```txt:Ubuntu
　　$ sudo docker rmi $(sudo docker images -f 'dangling=true' -q)
```

####**５．イメージの詳細を確認**

```txt:Ubuntu
　　$ sudo docker inspect イメージ名またはイメージID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker inspect centos:latest
```
　
####**６．コンテナからイメージを作成**

```txt:Ubuntu
　　$ sudo docker commit コンテナ名またはコンテナID DockerHubユーザー名/任意のイメージ名
```

```txt:Ubuntu
　　# 例
　　$ sudo docker commit centos_container_test tera_shin/centos_test
```
　
####**７．コンテナ一覧**
　**（１）起動中のコンテナを表示**

```txt:Ubuntu
　　$ sudo docker ps
```
　
　**（２）停止中のコンテナを含め、すべてのコンテナを表示**

```txt:Ubuntu
　　$ sudo docker ps -a
```
　
####**８．コンテナを作成、起動**

　**（１）コンテナを作成して起動**
　　`-d`オプションをつけると、バックグラウンドで実行する。
　　`--name`は指定しなければ、自動的に名前をつけてくれる。

```txt:Ubuntu
　　$ sudo docker run -i -t -d -p ホスト(Ubuntu)側のポート:コンテナ側のポート --name 任意のコンテナ名 元にするイメージ名またはイメージID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker run -i -t -d -p 8080:3000 --name centos_container_test tera_shin/centos_test:latest
```
　
　**（２）コンテナを起動（作成は行わず、既存のものを起動する）**

```txt:Ubuntu
　　$ sudo docker start コンテナ名またはコンテナID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker start centos_container_test
```
　
　**（３）コンテナを作成（起動はしない）**

```txt:Ubuntu
　　$ sudo docker create -p ホスト(Ubuntu)側のポート:コンテナ側のポート --name 任意のコンテナ名 元にするイメージ名またはイメージID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker create -p 8080:3000 --name centos_container_test tera_shin/centos_test:latest
```
　
####**９．コンテナの中に入る**
　コンテナの中に入るには、コンテナが起動している必要がある。
　起動したいコンテナが停止中のときは、あらかじめ起動しておく。

　**（１）コンテナを作成して起動後、コンテナの中に入る**
　　`-i`、`-t`オプションをつけて（`-i`、`-t`オプションは省略して`-it`とも書ける）、`/bin/bash`を実行する。
　　`-d`オプションをつけなければ、フォアグラウンドでの実行となり、コンテナを抜けると、
　　コンテナは停止する。
　　コンテナを停止させずにコンテナから抜けたい時は、`Ctrl + P + Q`　を入力する。 

　　また、`/bin/bash`の部分を書き換えると、`/bin/bash`だけでなく、
　　任意のコマンドをコンテナの中で実行できる。

```txt:Ubuntu
　　$ sudo docker run -i -t -p ホスト(Ubuntu)側のポート:コンテナ側のポート --name 任意のコンテナ名 元にするイメージ名またはイメージID /bin/bash
```

```txt:Ubuntu
　　# 例
　　$ sudo docker run -i -t -p 8080:3000 --name centos_container_test tera_shin/centos_test:latest /bin/bash
```
　
　**（２）コンテナの中に入る（方法１）**
　　**exec**コマンドを用いる。
　　execコマンドは、`bash`以外にも任意のコマンドをコンテナ内で実行させることができる。
　　このコマンドでコンテナに入った場合、コンテナから抜けてもコンテナは停止しない。

```txt:Ubuntu
　　$ sudo docker exec -i -t コンテナ名またはコンテナID bash
```

```txt:Ubuntu
　　# 例
　　$ sudo docker exec -i -t centos_container_test bash  
```
　
　**（３）コンテナの中に入る（方法２）**
　　**attach**コマンドを用いる。
　　（２）とは異なり、バックグラウンドで実行しているコンテナをフォアグラウンドにして、
　　コンテナの中で/bin/bashを実行する。
　　このコマンドでコンテナに入った場合、コンテナから抜けるとコンテナは停止する。
    （execを使った場合は、/bin/bashなど、実行したプロセスが停止するだけで、
　　コンテナ自体は停止しない。）

```txt:Ubuntu
　　$ sudo docker attach コンテナ名またはコンテナID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker attach centos_container_test
```
　
####**１０．コンテナから抜ける**

　**（１）コンテナから抜ける（方法１）**

```txt:コンテナ
　　$ exit
```
　
　**（２）コンテナから抜ける（方法２）**
　　`Ctrl + P + Q`　を入力する。
　　（１）の方法とは異なり、フォアグラウンドで起動していても、コンテナを停止させずに
　　コンテナから抜けることができる。
　
####**１１．ホスト側のディレクトリをコンテナ内にマウント**
　　Dockerにおけるホスト側とコンテナ側での**同期を行う仕組み**。
　　マウントしたディレクトリは、コンテナを停止すると消える。
　　作成、起動後、コンテナに入る必要がないなら、`-i`、`-t`、`/bin/bash`をつけなくても良い。
　　ただし、**マウントはコンテナの作成時にしか設定することができない。**

　　マウントしているコンテナのディレクトリは`VOLUME`として設定され、コンテナのイメージ化の際、
　　イメージには含まれない。
　　`VOLUME`に設定するディレクトリは、Dockerfileでも指定でき、`VOLUME`を利用することで、
　　開発環境とアプリケーションを分離することができる。
　　

```txt:Ubuntu
　　$ sudo docker run -i -t --name 任意のコンテナ名 -v $(pwd)/マウントしたいディレクトリ:マウント先のパス イメージの名前:イメージのタグ /bin/bash
```

　　`$(pwd)`は**ホスト側の今いるディレクトリのパス**、`$(pwd)`を用いず、**絶対パス**で指定してもよい。
　　`マウント先のパス`は、必ず**絶対パス**で指定する。
　　マウント先のディレクトリが存在しない場合は、自動的に作成される。
　　ただし、コンテナを停止すると、そのディレクトリも含めて消える。

```txt:Ubuntu
　　# 例
　　$ sudo docker run -it -p 8080:80 -p 8888:53000 -v $(pwd)/app:/home/docker/app tera_shin/centos_test:latest /bin/bash
```
　
####**１２．コンテナを停止**

　**（１）コンテナを指定して停止**

```txt:Ubuntu
　　$ sudo docker stop コンテナ名またはコンテナID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker stop centos_container_test
```
　
　**（２）全コンテナの停止**

```txt:Ubuntu
　　$ sudo docker kill $(sudo docker ps -a -q)
```
　
####**１３．コンテナを削除**
　　コンテナを削除する場合は、あらかじめコンテナを停止しておく。

　**（１）コンテナを指定して削除**

```txt:Ubuntu
　　$ sudo docker rm コンテナ名またはコンテナID
```

```txt:Ubuntu
　　# 例
　　$ sudo docker rm centos_container_test
```
　
　**（２）全コンテナを削除**

```txt:Ubuntu
　　$ sudo docker rm $(sudo docker ps -a -q)

　　#強制削除
　　$ sudo docker rm -f $(sudo docker ps -a -q)
```
　
　**（３）全コンテナを停止、削除**

```txt:Ubuntu
　　$ sudo docker ps -a -q | xargs docker kill | xargs docker rm
```
　
####**１４．コンテナ内でのコマンド実行**
　　起動しているコンテナに入る時にも使用した`exec`コマンドを用いる。

```txt:Ubuntu
　　#フォアグラウンドで実行
　　$ sudo docker exec コンテナ名またはコンテナID コンテナ内で実行したいコマンド

　　#バックグラウンドで実行
　　$ sudo docker exec -d コンテナ名またはコンテナID コンテナ内で実行したいコマンド
```

```txt:Ubuntu
　　# 例
　　$ sudo docker exec centos_container_test touch hello.txt 
```
　
####**１５．Dockerfileの実行**

```txt:Ubuntu
　　$ sudo docker build -t Dockerhubのユーザー名/任意のイメージ名 Dockerfileのディレクトリ（今いるディレクトリなら".（ピリオド）"）
```

```txt:Ubuntu
　　# 例
　　$ sudo docker build -t tera_shin/centos_test:latest .
```
　
####**１６．docker-composeでコンテナを立ち上げる**
　docker-composeをインストールし、使用できるようにしておく。
　docker-compose.ymlが存在するディレクトリで実行する。

　**（１）コンテナの立ち上げと起動**

```txt:Ubuntu
　$ sudo docker-compose up
```
　
　**（２）コンテナの立ち上げのみ**
　　立ち上げたコンテナ内であらかじめコマンドなどを実行したい時に用いる。

```txt:Ubuntu
　$ sudo docker-compose build
```

```txt:Ubuntu
　　# 例
　　$ sudo docker-compose build
　　$ sudo docker-compose run web rails db:create
　　$ sudo docker-compose run web rails db:migrate
　　$ sudo docker-compose up
```