Dockerコマンド よく使うやつ


## 関連
- [Kubernetesハンズオン目次](https://qiita.com/Esfahan/items/4fcf51622fed20dffb88)


## imageの作成
### pullでイメージを取得する場合
python2系のイメージをpullする

```
$ sudo docker pull python:2
```

## build系
Dockerfileを元にイメージを作成する

### Dockerfileを作成
python2系をインストールするだけのDockerfileを作成

```
FROM python:2
```

### Dockerfileからimageをbuildする


```
$ sudo docker build [ -t ｛イメージ名｝ [ :｛タグ名｝ ] ] ｛Dockerfileのあるディレクトリ｝
```

e.g.)

```
$ sudo docker build -t sample-project/python:1.0 ./sample-app
```

## run系
### コンテナを起動する

```
$ sudo docker run --name {コンテナ名} -it {image名} /bin/bash
```

e.g.)

```
$ sudo docker run --name python-sample -it sample-project/python:1.0 /bin/bash
```

### コンテナを起動、exitと同時にコンテナを削除する

```
$ sudo docker run --rm --name python-sample -it sample-project/python:1.0 /bin/bash
```

### バックグラウンドで実行する

```
$ sudo docker run --name python-sample -it -d sample-project/python:1.0 /bin/bash
```

### ホストOSの領域をマウントする

```
$ sudo docker run --name python-sample \
        -v /home/user/sample-app:/opt/sample-app \
        -it -d sample-project/python:1.0 /bin/bash
```


## ホストOSのssh keyをfowardingして、コンテナ内で使う方法
コンテナを起動する時に、$SSH_AUTH_SOCKをマウントする

```
$ sudo docker run --name python-sample \
        -v ${SSH_AUTH_SOCK}:/ssh-agent \
        -e SSH_AUTH_SOCK=/ssh-agent \
        -v /home/user/sample-app:/opt/sample-app \
        -it -d sample-project/python:1.0 /bin/bash
```

## 実行中のコンテナを確認する

```
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f689dd43a0d3        sample-project/python:1.0    "/bin/bash"         4 seconds ago       Up 4 seconds                            python-sample
```

## コンテナに入る

```
$ sudo docker exec -it f689dd43a0d3 bash
root@f689dd43a0d3:/#
```

## コンテナを指定してホストOS上でコマンドを実行する

```
$ docker exec -it f689dd43a0d3 python --version
Python 2.7.15
```

```
$ docker exec -it f689dd43a0d3 which pip
/usr/local/bin/pip
```

## コンテナを削除する

```
$ sudo docker rm -f f689dd43a0d3
```

## image一覧

```
$ sudo docker images
```

## imageを削除する

```
$ sudo docker rmi d69bc9d9b016
```

## コンテナ名からコンテナIDを取得

```
$ docker ps -aqf "name=container_name"
```

コンテナ名からコンテナIDを取得してコンテナに入る

```
$ sudo docker exec -it $(docker ps -aqf "name=container_name") /bin/bash
```

## コンテナが起動しない場合のdebug方法
下記コマンドでコンテナのログを確認する。

```
$ sudo docker logs {コンテナID}
```

### それでも原因がわからない場合はexitedしたコンテナに入って調べる
docker commitでexitedしたコンテナからイメージを作成する

```
$ sudo docker commit {exitedしたコンテナID} {コンテナ名を適当に付ける}
sha256:b951eaf534244788b79aba5fbe4186c8bc72ab1550a7fc700b950521761d8a6e
```

コンテナを起動する

```
$ sudo docker run --rm -it {適当につけたコンテナ名} sh
```
もしくは

```
$ sudo docker run --rm -it b951eaf534244788b79aba5fbe4186c8bc72ab1550a7fc700b950521761d8a6e sh
```

これでコンテナに入れるので、中で調査する

## コンテナのIPアドレスの確認方法

```
$ sudo docker inspect --format '{{ .NetworkSettings.Networks.renewal_default.IPAddress }}' \
    {コンテナIDorコンテナの名前}
```

## See full command of running/stopped container in Docker
`--no-trunc`をつければ全部見れる

```shell-sesison
$ sudo docker ps -a --no-trunc
```

or 

[See full command of running/stopped container in Docker](https://stackoverflow.com/questions/27380641/see-full-command-of-running-stopped-container-in-docker)

```shell-session
$ sudo docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(sudo docker ps -a -q)
```

## dockerのlog
ホストOS上の以下の場所にある。

/var/lib/docker/containers/(コンテナID)/(コンテナID)-json.log

コンテナIDが`36b5e0da6c72`の場合

```shell-session
$ sudo ls -l /var/lib/docker/containers/ | grep 36b5e0da6c72
drwx------ 4 root root 237 Jun 26 13:08 36b5e0da6c72d3e5597dbececd566725967f895ef790e00a51f7df9aaa9bfccb
```

```shell-session
$ sudo ls -l /var/lib/docker/containers/36b5e0da6c72d3e5597dbececd566725967f895ef790e00a51f7df9aaa9bfccb
total 24
-rw-r----- 1 root root    0 Jun 26 13:08 36b5e0da6c72d3e5597dbececd566725967f895ef790e00a51f7df9aaa9bfccb-json.log
drwx------ 2 root root    6 Jun 26 13:08 checkpoints
-rw------- 1 root root 2682 Jun 26 13:08 config.v2.json
-rw-r--r-- 1 root root 1421 Jun 26 13:08 hostconfig.json
-rw-r--r-- 1 root root   13 Jun 26 13:08 hostname
-rw-r--r-- 1 root root  177 Jun 26 13:08 hosts
drwx------ 3 root root   17 Jun 26 13:08 mounts
-rw-r--r-- 1 root root   85 Jun 26 13:08 resolv.conf
-rw-r--r-- 1 root root   71 Jun 26 13:08 resolv.conf.hash
```

## php-apacheコンテナの起動

```shell-session
$ docker run -itd \
        -p 7777:80 \
        -v $(pwd)/code:/var/www/html \
        --name php70-apache php:7.0-apache
```

## nginxのコンテナを作るとき
Dockerはプロセスがフォアグラウンドで実行されていないとコンテナがExitされる。
Nginxはデフォルトでデーモン実行、つまりバックグラウンド実行なのでコンテナが立ち上がらない。

以下のいずれかの方法で、nginxをフォアグラウンド実行にすることができる。

nginx.confに書き込む

```Dockerfile
RUN apt-get update && \
    apt-get install -y nginx && \
    echo "daemon off;" >> /etc/nginx/nginx.conf
```

起動コマンドにオプションを渡す

```Dockerfile
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
```

CentOS7

```Dockerfile
FROM centos:7

RUN yum -y update
RUN yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y --enablerepo=nginx nginx

RUN echo "This is a sample page." > /usr/share/nginx/html/index.html

EXPOSE 80
ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
```

起動

```shell-session
$ docker run --rm -p 8080:80 --name nginx-test -itd nginx-test /bin/bash
```

HostOSで実行。

```shell-session
$ curl localhost:8080
This is a sample page.
```

## Dockerfileでaliasを設定する

```Dockerfile:Dockerfile
From centos:7

RUN echo 'alias ll="ls -l"' >> ~/.bashrc
```

参考：[Docker nginxのコンテナすぐに終了してしまう現象](http://yinm.hatenadiary.jp/entry/2017/05/04/220439)

## Dockerのbridge IPアドレス固定
Dockerの既定ブリッジであるdocker0が、既存のIPアドレスと被ってしまったときの対応方法。
/etc/docker/daemon.jsonを作り、default-address-poolsに割り当てたいIPアドレスを指定する。

```json:/etc/docker/daemon.json
{
    "default-address-pools":[
        {
            "base":"192.168.0.1/16",
            "size":24
        }
    ]
}
```

```
$ sudo systemctl restart docker
```

docker0の確認

```
$ ip addr show dev docker0
```
 
bridgeの確認

```
$ sudo docker network inspect bridge
```

## コンテナのリソース監視

```
$ sudo docker stats $(sudo docker inspect -f {{.NAME}} $(sudo docker ps -q))

CONTAINER ID   NAME                        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
b14226d5a45a   process-exporter            0.00%     13.92MiB / 31.42GiB   0.04%     268kB / 3MB       0B / 0B       16
135c999028f1   redis-exporter              0.91%     15.11MiB / 31.42GiB   0.05%     5.41MB / 3.47MB   0B / 0B       17
5c4a92da9161   exporter_proxy              0.08%     7.93MiB / 31.42GiB    0.02%     22.2MB / 22.2MB   0B / 0B       21
34cd1b4f9d11   nginx-prometheus-exporter   0.00%     10.3MiB / 31.42GiB    0.03%     458kB / 493kB     0B / 0B       14
29ab382040ba   mtail                       0.00%     5.555MiB / 31.42GiB   0.02%     233kB / 519kB     0B / 6.14kB   27
8e23c7b07b3f   node-exporter               0.00%     15.27MiB / 31.42GiB   0.05%     343kB / 7.33MB    0B / 0B       20
b0b2de460757   postgres-exporter           0.00%     13.43MiB / 31.42GiB   0.04%     16.2MB / 8.31MB   0B / 0B       17
```

## Dockerが利用しているdisk容量の調査

### 全体の使用量

```
$ docker system df
```

### コンテナ、volumeごとの使用量

```
$ docker system df -v
```

## 関連
- [Kubernetesハンズオン目次](https://qiita.com/Esfahan/items/4fcf51622fed20dffb88)

## 参考
- [docker コマンド チートシート](https://qiita.com/voluntas/items/68c1fd04dd3d507d4083)
- [コンテナに入りたい？それ docker exec でできるよ](https://qiita.com/yosisa/items/a5670e4da3ff22e9411a)
- [コマンドライン起動系のPythonのプロジェクトをDockerコンテナに入れる個人的ベストプラクティス](https://qiita.com/mokemokechicken/items/d7384a4d8cdc344e7b4a)
- [Dockerコンテナからホストのssh-agentを介してSSHで接続する](https://medium.com/@r7kamura/docker-ssh-forwarding-c6c7842bc468)