Dockerfileやdocker-compose.yml、その他のファイル修正時のdocker-composeコマンド集 

#はじめに
Dockerfileやdocker-compose.yml、その他のファイルのコードを修正した際、どのようにコンテナを起動すればよいか分からなかったため、まとめてみました。

#Dockerのイメージとコンテナの違い
`イメージ: 実行環境の構成を保存した情報`
`コンテナ: image を実際に動かした実行環境`

以下のポイントも抑える必要があります。
・コンテナ を動かすには、ベースとなる イメージ が必ず必要なこと
・コンテナ を破棄しても イメージ が残っている場合があること
・リポジトリ内のソースコードは、 イメージ 内に含まれている場合と コンテナ 上に含まれている場合があること

#Docker起動までの流れ
`イメージ構築→コンテナ構築→コンテナ起動`


|コマンド|イメージ構築 |コンテナ構築|コンテナ起動|
|---|---|---|---|
|build|	○ |×	|×|
|up	|△(--build必要) |	○	|○|
|start|	× |	×|	○|
|run|	○ （単独） |	○ （単独）	|○ （単独）|

#イメージ構築→コンテナ構築→コンテナ起動

```php
# フォアグラウンドで起動
docker-compose up --build

# バックグラウンドで起動
docker-compose up --build -d
```

#イメージ構築のみ

```php
docker-compose build -d
```

#Dockerfile更新の反映する場合
`イメージ構築→コンテナ構築→コンテナ起動`が必要

Dockerは一度ビルドするとキャッシュというのが作成され、2回め移行のビルド処理がはやくなります。
ただし、`Dockerfileを更新する場合`、--no-cache オプションを付けないと、Dockerはキャッシュを使ってimageを構築してしまうので、更新したDockerfileを見てくれず新しいimageが作られません。

```php
# イメージ再構築
docker-compose build --no-cache

# コンテナ構築・起動（バックグラウンド）

docker-compose up -d
```
Dockerfile更新時は、イメージから作り直す必要があります。


#docker-compose.yml更新の反映する場合
###docker-compose.yml の記載内容のうち `build` `section`を編集した場合
`イメージ構築→コンテナ構築→コンテナ起動`が必要

```php
# イメージ再構築
docker-compose build 

# コンテナ構築・起動（バックグラウンド）

docker-compose up -d
```
###docker-compose.yml の記載内容のうち `build` `section`以外を編集した場合
`コンテナ構築→コンテナ起動`が必要

```php
docker-compose up -d
```

#Dockerfileとdocker-compose.yml以外のファイル更新を反映する場合
###Dockerfile 内で `ADD` や `COPY` によって、反映したいファイルがイメージに取り込まれている場合
Dockerfileの中でローカルのソースコードを読み込む処理がある場合は、イメージの再構築が必要です。
 （イメージ内でソースコードを抱えているため、ローカル側のソースコードの修正が反映しないので、作り直す必要がある）

`イメージ構築→コンテナ構築→コンテナ起動`が必要

```php
# イメージ再構築
docker-compose build --no-cache

# コンテナ構築・起動（バックグラウンド）

docker-compose up -d
```
###反映したいファイルがイメージに取り込まれていない場合
`即反映される`場合と、`コンテナ構築→コンテナ起動`が必要なパターンがあります

```php
# コンテナ構築・起動（バックグラウンド）

docker-compose up -d
```
ローカルのボリュームとコンテナのボリュームをマウントしてる場合は、即反映されるため、特にすることはありません。

#単独のサービスのイメージ構築→コンテナ構築→コンテナ起動

```php
docker-compose run サービス名

# コンテナを起動後、指定したコマンドを実行する
docker-compose run コンテナ名 rails new
```

#イメージの一覧を確認

```php
docker images
# REPOSITORY   TAG   IMAGE   ID   CREATED   SIZE
```
#コンテナの一覧を確認

```php
#起動中のコンテナ一覧
docker ps

#　停止中も含める
docker ps -a
# CONTAINER ID   IMAGE   COMMAND   CREATED   STATUS   PORTS   NAMES
```

#起動中のコンテナ内でコマンド実行

```php
#　起動中のコンテナのシェルへ接続
docker exec -it コンテナID(orNAMES) /bin/bash
[root@xxxxxxx /]# 
```
#ログ確認

```php
docker-compose logs

# 最新5行からtailする
docker-compose logs -f --tail="5"

# 最新5行からタイムスタンプ付きでtailする
docker-compose logs -f --tail="5" -t
```

#コンテナの開始と停止

```php
# 開始
docker-compose start

# 再起動
docker-compose restart

# 停止
docker-compose stop
```

#後片付け

```php
# 停止と削除（コンテナ・ネットワーク）
docker-compose down

# 停止と削除（コンテナ・ネットワーク・イメージ）
docker-compose down --rmi all

# 停止と削除（コンテナ・ネットワーク・ボリューム）
docker-compose down -v

# 全てを無に返す
docker-compose down --rmi all --volumes
```

#イメージ名の削除

```php
#コンテナが停止中のイメージのみ削除できる
docker rmi イメージID(orNAMES)
```

#コンテナの削除

```php
#停止中のコンテナのみ
docker rm コンテナID(orNAMES)

#起動中のコンテナも削除できる
docker rm -f コンテナID(orNAMES)
```



#参考記事
・[docker-compose `up` とか `build` とか `start` とかの違いを理解できていなかったのでまとめてみた](https://qiita.com/tegnike/items/bcdcee0320e11a928d46)
・[Docker利用時のソースコードの変更反映](https://qiita.com/tearoom6/items/326895f0a35774d70729)