Docker コマンド逆引き（基礎）

## 検索
##### Docker hub から Docker イメージの検索 search
jenkins のイメージを検索してみる。

```
$ docker search jenkins
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
jenkins                                Official Jenkins Docker image                   3946                [OK]                
jenkins/jenkins                        The leading open source automation server       1103                                    
jenkinsci/jenkins                      Jenkins Continuous Integration and Deliver...   343                                     
jenkinsci/blueocean                    https://jenkins.io/projects/blueocean           282                                     
jenkinsci/jnlp-slave                   A Jenkins slave using JNLP to establish co...   96                                      [OK]
jenkins/jnlp-slave                     a Jenkins agent (FKA "slave") using JNLP t...   54                                      [OK]
jenkinsci/slave                        Base Jenkins slave docker image                 45                                      [OK]
jenkinsci/ssh-slave                    A Jenkins SSH Slave docker image                34                                      [OK]
```

Official のイメージのみを検索する。

```
$ docker search jenkins --filter "is-official=true"
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
jenkins                                Official Jenkins Docker image                   3946                [OK]
```


##### ローカル上にある Docker イメージの表示 images
```
$ docker images
jenkins                    latest              194289d0fefd        9 months ago        809MB
centos                     centos6             609c1f9b5406        10 months ago       195MB
redis                      latest              1fb7b6c8c0d0        13 months ago       107MB
```

##### 実行中のコンテナの表示 ps
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
6445db2e5bd1        zookeeper           "/docker-entrypoin..."   13 months ago       Up About an hour    2181/tcp, 2888/tcp, 3888/tcp   zookeeper-00
```

##### コンテナの詳細情報の表示 inspect
```
$ docker inspect [CONTAINER_ID]
[
    {
        "Id": "f7be7e43043ea5939c307191fdaecc2cd9eaee55082a9a5a64c6d1b10f9ebe07",
        "Created": "2018-07-10T13:51:19.313846932Z",
        "Path": "/cmd.sh",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
...

```

##### 実行中のコンテナ内で操作されたファイル一覧表示 diff
```
$ docker diff [CONTAINER_NAME]
```

##### コンテナ内で出力されたSTDOUTとSTDERRを表示 logs
```
$ docker logs [CONTAINER_NAME]

# -f でリアルタイム更新
$ docker logs -f [CONTAINER_NAME]

# -t でタイムスタンプ表示
$ docker logs -t [CONTAINER_NAME]
```

## ネットワーク

##### IPアドレスの表示(旧シンタックス) inspect --format
```
$ docker inspect --format '{{.NetworkSettings.IPAddress}}' [CONTAINER_ID]
172.28.0.2
```

##### IPアドレスの表示(新シンタックス) inspect -f
```
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [CONTAINER_ID]
172.28.0.2
```

##### Docker ネットワーク一覧の表示 network ls
```
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
292caef72faf        10_pl_nw            bridge              local
d76c9b040907        2433_default        bridge              local
```

## ビルド
##### Dockerfile からイメージをビルド build
```
$ docker build -t [IMAGE_NAME] [Dockerfile path]
```

##### Docker Hub へイメージを push
コンテナレジストリにログインしてから

```
$ docker login
```
push します。[REPOSITORY]:[TAG] は docker images で確認。

```
$ docker push [REPOSITORY]:[TAG]
```

##### 既存 Dockerコンテナからイメージをコミット(ビルド) commit

```
$ docker commit [CONTAINER_NAME] [IMAGE_NAME]
# 例) my_container コンテナを元に、my_image 名でコミットする。
$ docker commit my_container blueskyareahm/my_image:latest
```

##### Dockerイメージ名を変更する tag

```
$ docker tag [変更したいIMAGE_ID] [変更後のIMAGE_NAME]
# 例) a2e19ac0d514 という IMAGE_ID のイメージの名前を updated_image という名前にする。
$ docker tag a2e19ac0d514 updated_image


# 実際は名前を変更したというより、別名で新しく作成されているため、元のイメージも残っている。不要であれば削除すること。
$ docker rmi a2e19ac0d514
```

## 実行
##### イメージからコンテナを生成し、実行する run
echo "Hello docker!"を表示してみる。

```
$ docker run centos:centos6 echo "Hello docker!"
```

##### コンテナにログイン(bashを使う) -it
```
$ docker run -it centos:centos6 /bin/bash
```

##### コンテナをバックグラウンドで「デタッチド」（detached ）モードで実行する -d
```
$ docker run -d [IMAGE_NAME]
```

##### 実行中のコンテナにログインする exec -it
```
$ docker exec -it [CONTAINER_NAME] /bin/bash
```

##### コンテナに任意のホスト名を付与する -h
```
$ docker run -h my-host-name
```

##### コンテナに任意のコンテナ名を付与する --name
```
$ docker run --name my-container-name
```

##### コンテナにホストのディレクトリをマウントする -v
```
$ docker run -v [host absolute path]:[container absolute path] [IMAGE_NAME] /bin/bash
```

##### 停止中のコンテナの起動 start
```
$ docker start [CONTAINER_NAME]
```

##### 実行中のコンテナの停止 stop
```
$ docker stop [CONTAINER_NAME]
```

##### 実行中のコンテナの再起動 restart
```
$ docker restart [CONTAINER_NAME]
```

##### dockerデーモンもしくは、マシン再起動時にコンテナを自動起動 --restart=always
```
$ docker run --restart=always centos:centos6
```
##### コンテナの自動起動設定を解除する update --restart=no
```
$ docker update --restart=no [CONTAINER_NAME]
```
##### ホストからコンテナにファイルをコピー cp
```
$ docker cp [file] [CONTAINER_NAME]:[container absolute path]
Ex) docker cp my.txt [CONTAINER_NAME]:/tmp/my.txt
```
##### Docker イメージを tar ファイルに保存 save
```
$ docker save -o [FILE_NAME].tar [IMAGE_NAME]
Ex) docker save -o my_image.tar my_img:latest
```
##### tar ファイルにした Docker イメージをロード load
```
$ docker load -i [FILE_NAME].tar
Ex) docker load -i my_image.tar
```

## 管理
##### コンテナが使用中のリソースなど表示 stats
```
$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
23d2b1ac475c        practical_euclid    33.43%              3.259GiB / 7.79GiB   41.83%              3.6MB / 8.54MB      1.85GB / 145MB      868
```

##### コンテナのログの保存場所を表示 inspect
```
$ docker inspect [CONTAINER_NAME] | grep log
"LogPath": "/var/lib/docker/containers/9b38f592fd572a7f9793c6d4645d49c9de3bf08bab2ecad97879d4255946d678/9b38f592fd572a7f9793c6d4645d49c9de3bf08bab2ecad97879d4255946d678-json.log"

# ログのサイズが大きくなってきたので空にしたいとき
$ sudo truncate -s 0 [LogPath]
```

##### Docker 環境のシステム情報を表示 info
```
$ docker info
Containers: 10
 Running: 4
 Paused: 0
 Stopped: 6
(省略)
```

## 削除
##### コンテナの削除 rm
```
$ docker rm [CONTAINER_NAME]
```

##### 全てのコンテナの削除 rm
```
$ docker rm $(docker ps -a -q)
```

##### イメージの削除 rmi
```
$ docker rmi [IMAGE_NAME]
```

##### none イメージの削除 prune
```
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:769e4daa71b2d3e4842f27efb9967c4c21ef51773b0c071290d101be99dc5cde
deleted: sha256:75a74c88393f0b419763ea0cbb3de58c8de02cf526dca6e19f92785e451d98d6
deleted: sha256:653af94a24b9f0e0d732ecef11228eedba7b83358b217358182982f6d6665789
```