Dockerのコマンド

# これは何？
Dockerのコマンドを列挙する。

# コマンド
### Dockerfileサンプル
```yml
FROM ros:kinetic
# install ros tutorials packages
RUN apt-get update && apt-get install -y
RUN apt-get install -y ros-kinetic-ros-tutorials \
 ros-kinetic-common-tutorials \
 emacs \
 && rm -rf /var/lib/apt/lists/
```
#### コンテナbuild
```shell
$ docker build --tag ros:ros-tutorials .;
```

Dockerfileを指定する。

```shell
$ docker build --tag ros:ros-tutorials -f Dockerfile_hoge;
```


#### コンテナ起動
```shell
$ docker run -it [IMAGE ID];
```

PortをExpose(`-p 8080:80`)、バックグラウンドで起動(`-d`)

```shell
$ docker run --name some-nginx -d -p 8080:8080 [IMAGE名]
```

#### コンテナの停止
起動しているコンテナ上で `exit`  

```shell
$ docker stop [IMAGE ID];
```

#### 全コンテナの停止
```shell
$ docker stop $(docker ps -a -q)

# 全コンテナ削除（！！危険！！）
$ docker rm $(docker ps -a -q)
```


#### 停止しているコンテナをリストする
```shell
$ docker ps -a;
```

停止したコンテナIDか名前を確認し、起動後コンテナに入る（コマンドに復帰）

```shell
$ docker start [コンテナID or 名前];
$ docker attach [コンテナID or 名前];
```

shellに入る

```shell
$ docker exec -i -t [コンテナ名] bash
```

### コンテナとのファイルのやりとり

#### to コンテナ
```shell
$ docker cp /tmp/hoge2 container_test1:/tmp/hoge2
```

### from コンテナ

```shell
# docker cp [オプション] コンテナ:パス ローカル・パス|-
$ docker cp container_test1:/tmp/hoge2 /tmp/hoge2
```


## 容量不足と言われたら
### cleanup (Remove unused volumes using "rm", "prune" and Remove Network)
```shell
$ docker volume rm $(docker volume ls -qf dangling=true);
$ docker volume prune -f;
$ docker network prune -f;
```

### List dangling volumes
```shell
$ docker volume ls -qf dangling=true;
```

### List all volumes
```shell
$ docker volume ls;
```

### Delete all of images
```shell
$ for id in $(docker images | grep '^<none>' | awk '{print $3}'); do docker rmi  ${id}; done;
$ docker rmi $(docker images -q);
```

### Remove containers
```shell
$ docker rm $(docker ps -aq);
```

### Clean up dangling images 
```shell
$ docker image prune; # [-af if you want to force remove all images]
```

### ザザっと消す
※ 必要なイメージ、コンテナも削除される可能性もあるので注意が必要
```shelldocker system prune
$ docker volume prune
$ docker image prune -a
$ docker builder prune
```

## docker-composeのサンプル
```yml
version: '2'
services:
  master:
    build: .
    container_name: master
    command:
      - roscore

  talker:
    build: .
    container_name: talker
    environment:
      - "ROS_HOSTNAME=talker"
      - "ROS_MASTER_URI=http://master:11311"
    command: rosrun roscpp_tutorials talker

  listener:
    build: .
    container_name: listener
    environment:
      - "ROS_HOSTNAME=listener"
      - "ROS_MASTER_URI=http://master:11311"
    command: rosrun roscpp_tutorials listener
```
### 実行
```bash
$ docker-compose up;
```

Dockerfileの変更を反映する。

```bash
$ docker-compose up --build;
```

削除。

```bash
$ docker-compose rm -v
```

# Reference
- [Docker上でROSチュートリアルをやってみた - Qiita](https://qiita.com/yuki-shark/items/3e54af7140b755223c3e)
- [Docker + ROS(kinetic)でチュートリアル - Qiita](https://qiita.com/Leonardo-mbc/items/cfd38a4fae8667593cf1)
- [Dockerコマンドメモ - Qiita](https://qiita.com/curseoff/items/a9e64ad01d673abb6866)
- [自律ロボット開発にROSを使うべきいくつかの理由 - MyEnigma](https://myenigma.hatenablog.com/entry/20130208/1360324464)
- [ROS x Dockerのお勉強 - 空飛ぶロボットのつくりかた](http://robonchu.hatenablog.com/entry/2017/12/17/192649)
- [Stop / remove all Docker containers (Example)](https://coderwall.com/p/ewk0mq/stop-remove-all-docker-containers)
- [Docker-Compose の変数定義について - SIerだけど技術やりたいブログ](https://www.kimullaa.com/entry/2019/12/01/132115)
- [Dockerに占領されたディスク領域を解放する方法](https://zenn.dev/motoishimotoi/articles/e5b8a5f29a9e45)