Docker コマンドまとめ

## よく使うコマンド

```bash

# 稼働中のコンテナに入る
$ docker-compose exec hoge_app bash

# stop
$ docker-compose stop

# docker-compose管理下のコンテナを削除し、紐づくボリュームも削除
$ docker-compose rm -v

# キャッシュを使わずにビルド
$ docker-compose build --no-cache

# コンテナを一括削除
$ docker rm `docker ps -a -q`

# 全てのボリュームを削除
$ docker volume rm $(docker volume ls -qf dangling=true)

# イメージ一覧
$ docker images -a

# イメージ一括削除
$ docker rmi `docker images -aq`
$ docker rmi -f `docker images -aq`

# docker images で REPOSITORY が <none> になっているものを削除（クライアントとデーモンAPIの両方がv1.25以降）
$ docker image prune

# docker images で REPOSITORY が <none> になっているものを削除（上記以下のバージョン）
$ docker rmi $(docker images | awk '/^<none>/ { print $3 }')

# ホストからコンテナへファイルをコピー
# docker cp <コピーするファイルのパス> <コンテナ名or ID>:<コンテナ保存先パス>
$ docker cp file.rc continername:/host/dir/ 

# コンテナからホストへファイルをコピー
# docker cp  <コンテナ名or ID>:<コピーするファイルのパス> <ホスト保存先パス>
$ docker cp  continer_name:/var/www/html/ /User/meta/hoge 
```

## コンテナの生成・起動

`$ docker run [オプション] [イメージ名:タグ名] [引数]`

| オプション    | 説明                       | 例                                              |
|---------------|----------------------------|-------------------------------------------------------|
| --name         | コンテナ名を指定           | docker run --name "test" centos                       |
| -d            | バッググラウンド実行       | docker run -d centos                                  |
| -it           | コンソールに結果を出力     | docker run -it --name "test" centos /bin/cal          |
| -p host:cont  | ポートフォワーディング     | docker run -d -p 8080:80 httpd                        |
| --add-host    | ホスト名とIPを指定         | docker run -it --add-host=test.com:192.168.1.1 centos |
| --dns         | DNSサーバを指定            | docker run --dns=192.168.1.1 httpd |
| --mac-address | MACアドレスを指定          | docker run -it --mac-address="92:d0..." centos |
| --cpu-shares  | CPU配分 (全体で1024)       | docker run --cpu-shares=512 centos                    |
| --memory      | メモリの上限               | docker run --memory=512m centos                       |
| -v            | ディレクトリの共有         | docker run -v /c/Users/src:/var/www/html httpd        |
| -e            | 環境変数を設定             | docker run -it -e foo=bar centos /bin/bash            |
| --env-file    | 環境変数リストから設定 | docker run -it --env-file=env_list centos /bin/bash   |
| -w            | 作業ディレクトリを指定     | docker run -it -w=/tmp/work centos /bin/bash          |

## 稼働中のコンテナ操作

| 説明                 | コマンド                                                  | 例(コンテナID=CID)                    |
|----------------------|-----------------------------------------------------------|-----------------------------------------|
| コンテナ一覧     | docker ps [オプション]                                    | docker ps                               |
| コンテナ確認       | docker stats コンテナID                                 | docker stats CID               |
| コンテナ起動       | docker start [オプション] コンテナID                      | docker start CID               |
| コンテナ停止       | docker stop [オプション] コンテナID                       | docker stop CID                |
| コンテナ再起動     | docker restart [オプション] コンテナID                    | docker restart CID             |
| コンテナ削除       | docker rm [オプション] コンテナID                         | docker rm CID                  |
| コンテナ中断       | docker pause コンテナID                                   | docker pause CID               |
| コンテナ再開       | docker unpause コンテナID                                 | docker unpause CID             |
| コンテナ接続       | docker attach コンテナID                                  | docker attach CID              |
| コンテナログ       | docker logs [オプション] コンテナID                         | docker logs CID              |
| プロセス実行         | docker exec [オプション] コンテナID コマンド [引数]       | docker exec -it CID /bin/cal   |
| プロセス確認         | docker top コンテナID                                     | docker top CID                 |
| ポート確認           | docker port コンテナID                                    | docker port CID                |
| コンテナ名変更       | docker rename 現在名 新しいコンテナ名                     | docker rename now new                   |
| イメージ差分         | docker diff コンテナID                                    | docker diff CID                |
| ファイルコピー       | docker cp コンテナID:ファイル パス                    | docker cp CID:/var/www/a.txt /Users/ryo/       |
| イメージの作成       | docker commit [オプション] コンテナID イメージ名[:タグ名] | docker commit CID my_image:1.0 |
| イメージを.tarへ出力        | docker export コンテナID                                  | docker export CID              |
| .tarからイメージ作成 | docker import パスorURL - イメージ名[:タグ名]             | cat src.tar｜docker import - web:1.0   |
| イメージ保存       | docker save [オプション] 保存ファイル名 [イメージ名]      | docker save -o src.tar web              |
| イメージロード     | docker load [オプション]                                  | docker load -i sec.tar                  |

補足
・ コンテナIDはコンテナ名でも可
・ `docker ps`は稼働中のコンテナ一覧。 `docker ps -a`は停止中を含めた全コンテナ一覧



## イメージ操作
| 説明         | コマンド                                   | 例(イメージID=IID)             |
|--------------|--------------------------------------------|-----------------------------|
| pull | docker pull [オプション] イメージ名[:タグ] | docker pull centos:7        |
| 一覧 | docker images [オプション] [リポジトリ名]  | docker images -a            |
| 詳細 | docker inspect [オプション] [イメージID]   | docker inspect IID |
| 検索 | docker search [オプション] [キーワード]    | docker search nginx         |
| 削除 | docker rmi [オプション] イメージ名         | docker rmi nginx            |
| ログ | docker logs [オプション] イメージ名         | docker logs nginx            |
| タグ変更 | docker tag [イメージID] [リポジトリ名]:[タグ]  | docker tag IID hello-world:new_tag  |



## Docker Compose

| 説明               | コマンド                                              | 例                              |
|--------------------|-------------------------------------------------------|---------------------------------|
| コンテナ生成・起動 | docker-compose up [オプション] [サービス]             | docker-compose up -d            |
| 生成コンテナ数     | docker-compose scale [サービス=数]                    | docker-compose scale web=10     |
| コンテナ一覧       | docker-compose ps [オプション]                        | docker-compose ps               |
| コンテナログ       | docker-compose logs [オプション] [サービス]           | docker-compose logs             |
| 立ち上げ＋コマンド実行       | docker-compose run [オプション] [サービス] [コマンド] | docker-compose run web /bin/cal |
|
| コマンド実行     | docker-compose exec [オプション]              | docker-compose exec web bash  |
|
| 全コンテナ起動     | docker-compose start [サービス]                       | docker-compose start            |
| 全コンテナ再起動   | docker-compose restart [オプション] [サービス]        | docker-compose restart          |
| 全コンテナ強制停止 | docker-compose kill [オプション] [サービス]           | docker-compose kill             |
| 全コンテナ削除     | docker-compose rm [オプション] [サービス]             | docker-compose rm               |
| 全コンテナをビルド     | docker-compose build [オプション]              | docker-compose build --no-cache  
|



## DockerFile

説明 | コマンド | 例
|--------------|--------------------------------------|----------------------------------|
元となるイメージ |FROM | `FROM name/web:ver1.0`
作成者 | MAINTAINER | `MAINTAINER name`
環境変数 | ENV | ENV KEY=VALUE
指定のコマンドの実行 | RUN | `RUN yum -y install httpd`
イメージにファイル追加 | ADD | `ADD index.html /var/www/html/index.html`
イメージにファイルコピー | COPY | `COPY index.html /var/www/html/index.html`
ポート番号を指定 | EXPOSE | EXPOSE 3306
コンテナ起動時に実行するコマンド | CMD | CMD ["service","httpd","start"]
カレントディレクトリを指定 | WORKDIR | WORKDIR /var/www/html
ボリューム指定 | VOLUME | VOLUME /var/log/httpd


- DockerFileは`命令 オプション`形式の行の羅列で構成される
- `#`でコメント
- Dockerfileは`build`サブコマンドでのビルド時に利用される
- Dockerのビルドは、コマンド単位をステップとして実行する
  - 各ステップはコンテナのスナップショットをキャッシュする
  - Dockerfileを部分変更した場合は、その差分のみが実行される


## Docker Hub

| 説明         | コマンド                             | 例                         |
|--------------|--------------------------------------|----------------------------------|
| ログイン     | docker login [オプション] [サーバー] | docker login -u "name" -p "pass" |
| ログアウト   | docker logout [サーバ名]             | docker logout                    |
| アップロード | docker push ユーザ名/イメージ名[:タグ名]      | docker push user/my_image:v1.0        |

```bash:terminal
# Dockerhubへログイン
docker login -u "name" -p "pass"

# カレントディレクトリのDockerfileからイメージを作成 
# docker build -t ユーザー名/イメージ名:タグ名 .
docker build -t wmetaw/mylinux:1.0 .

# Dockerhubへpush
docker push wmetaw/mylinux:1.0
```

# 削除系
```
docker container prune #停止コンテナ全削除
docker rm -f `docker ps -a -q` #全コンテナ一括削除
docker image prune #未使用イメージ一括削除
docker rmi `docker images -f "dangling=true" -q` #タグ無しイメージ一括削除
docker volume prune # 未使用ボリューム一括削除
docker network prune #未使用ネットワーク一括削除
docker system prune --volumes #docker system pruneではボリュームまでは削除してくれない
```
【小技】

```
# 古いコンテナを一括削除
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
```

#起動中のDockerコンテナのシェルに入る
```
$ docker-compose ps
              Name                             Command               State           Ports
---------------------------------------------------------------------------------------------------
dockerphpmysqlapache_db_1           docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
dockerphpmysqlapache_phpmyadmin_1   /run.sh phpmyadmin               Up      0.0.0.0:8080->80/tcp
dockerphpmysqlapache_www_1          docker-php-entrypoint apac ...   Up      0.0.0.0:8001->80/tcp

$ docker-compose exec php bash
root@34a04a7a46a2:/var/www/html# ls
index.php
```

#Dockerの終了
```
$ docker-compose kill -s SIGINT
```

#docker-compose upと docker-compose buildの違い
up -> Dockerfile or imageで指定したイメージがダウンロード済みならダウンロードせずに実行，なければダウンロードして実行
build -> Dockerfile or imageで指定したイメージをpull 

##環境変数の渡し方
https://qiita.com/KEINOS/items/518610bc2fdf5999acf2

#References
Docer Documentation
https://docs.docker.com
Docker Composeの日本語リファレンス
http://docs.docker.jp/compose/toc.html
Docker Compose - CLI リファレンス
https://qiita.com/zembutsu/items/eca797efaed39ec7b906
Docker Compose - docker-compose.yml リファレンス
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
docker-compose コマンドまとめ
https://qiita.com/wasanx25/items/d47caf37b79e855af95f