さわっておぼえるDocker入門🐳#2（コンテナの様子をみる）

# はじめに

Dockerコンテナを実際に動かして確認しながら、動いているコンテナの様子をざっくり眺めていきます。

前回はコンテナを作ったり壊したりしました -> [さわっておぼえるDocker入門🐳#1](https://qiita.com/ShinKano/items/421d9f46962114ddf0ac) 

# 目的

**Dockerを触りながら、コンテナの様子を確認したり、コンテナ内のシェルを使用できるようになる**

今回は、下記の操作を行います。

- コンテナのメタデータを確認
- コンテナのステータスを確認
- コンテナのシェルにアクセス
- ubuntuコンテナにパッケージをインストール
- コンテナのプロセスを確認

# 環境

- macOS Mojave 10.14.6
- Docker engine 19.03.5


# まずはDockerのインストール

https://www.docker.com/


# コンテナをアレコレしてみる


## まずはコンテナを起動させてみる

以下のコマンドは、nginxのコンテナを起動します。

- `-d`オプションによって、バックグラウンドでコンテナが起動します。
- `--name`オプションによって、`nginx`と名付けました。

```bash
docker container run -d --name nginx nginx
```

さらに、MySQLのコンテナも起動します。

MySQLサーバーには、rootパスワードが必要なので`-e`オプションを使用してランダムなパスワードを設定しています。
`-e`はenvironmentオプションです。

```bash
docker container run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
```

これで、nginxとmysqlの2つのコンテナが起動しました。


## `container inspect`

指定したコンテナのメタデータを取得します。

以下のコマンドを実行すると、mysqlコンテナのメタデータがJSON形式で表示されます。つまりコンフィグです。

このメタデータを確認することで、どんな設定でこのコンテナが作られているのかを知ることができます。

```bash
docker container inspect mysql
```


## `container stats`

メタデータではなく、現在の様子を知りたい場合は以下のように`stats`コマンドを使用します。

コマンドを実行することで、CPU使用率やRAMの占有率など、リアルタイムのデータが表示されます。

```bash
docker container stats mysql
```


## コンテナ内のシェルにアクセスする

立ち上げたコンテナの中で作業するには、シェルにアクセスする必要があるかもしれません。

その場合は`-it`オプションを使用します。SSHは必要ありません。

`bash`を指定しbashシェルが使えるようにします。

```bash
docker container run -it --name proxy nginx bash
# root@96d294dee3b4:/# 
```

これで、コンテナ内でファイルをいじったり、パッケージをインストールしたりすることができます。


### コンテナの「コマンド」が変化していることを確認する

コンテナの一覧を確認してみると`-it`オプション付きで立ち上げたコンテナは、
`COMMAND`の値が変化しています。

```
docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                 NAMES
96d294dee3b4        nginx               "bash"                   4 minutes ago       Exited (0) 12 seconds ago                         proxy
d43f74bd3fea        mysql               "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes               3306/tcp, 33060/tcp   mysql
40a021da02c9        nginx               "nginx -g 'daemon of…"   22 minutes ago      Up 22 minutes               80/tcp                nginx
```

シェルを使用するために、デフォルトで使用するプログラムを「bash」に指定したので、`COMMAND`が書き換わっています。

したがって、シェルから`exit`した場合には、コンテナは停止状態になります。
コマンドで指定したプログラムが停止した時には、コンテナは停止するからです。




## Ubuntuを起動してみる

以下のコマンドでubuntuイメージからコンテナを起動し、シェルにアクセスします。


```bash
docker container run -it --name ubuntu ubuntu
```

ubuntuは`apt`というパッケージマネージャを使用してパッケージのダウンロードを行うことができます

まずはパッケージリストを更新します。

```bash
apt-get update
```

さらに、`curl`という Httpリクエストを行うパッケージをインストールしてみます。

```bash
apt-get install -y curl
```

試しにGoogle.comにHttpリクエストを送信してみると、
レスポンスがちゃんと返ってきます。

```bash
curl google.com
# <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
# <TITLE>301 Moved</TITLE></HEAD><BODY>
# <H1>301 Moved</H1>
# The document has moved
# <A HREF="http://www.google.com/">here</A>.
# </BODY></HTML>
```

## ubuntuコンテナを停止する

先ほどと同じく`exit`することで自動的にコンテナも停止します。

```
docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                 NAMES
9a881f1a18c6        ubuntu              "/bin/bash"              12 minutes ago      Exited (0) 2 seconds ago                          ubuntu
96d294dee3b4        nginx               "bash"                   23 minutes ago      Exited (0) 19 minutes ago                         proxy
d43f74bd3fea        mysql               "docker-entrypoint.s…"   39 minutes ago      Up 39 minutes               3306/tcp, 33060/tcp   mysql
40a021da02c9        nginx               "nginx -g 'daemon of…"   41 minutes ago      Up 41 minutes               80/tcp                nginx
```

ubuntuの`COMMAND`をみると、デフォルトで起動するプログラムが`bash`であることを確認できます。
そのため、特に何も設定しなくてもbashが起動しました。
さらにbashからexitすることで、コンテナも停止しました。


## コンテナを再起動する

もう一度このコンテナに入りたい場合は、`container start`を使用します。
`container run`だと、新しいコンテナが起動してしまうので、先ほどダウンロードしたcurlはありません。

`run`の時は`-it`だったところが`-ai`になっていることに注意です。

```bash
docker container start -ai ubuntu
```

## バックグラウンド起動中のコンテナに入る

では、バックグランドで起動しているコンテナ内のシェルにアクセスしたい場合はどうすれば良いでしょうか。

`container exec`コマンドを使用します。
今回は先ほどバックグラウンドで起動したmysqlコンテナを使用します。
bashシェルを指定することを忘れないでください。

```bash
docker container exec -it mysql bash
```

## コンテナのプロセスを確認する

この時、mysqlコンテナ内ではどのようなプロセスが動いているのでしょうか。
`ps aux`コマンドを使用することで、起動中のプロセス一覧を確認できます。

まずはmysqlコンテナが`ps`コマンドを使用できるよう、必要なパッケージを更新&インストールします。

最初にパッケージの更新。

```
apt-get update
```

続いて、パッケージをインストールします。


```bash
apy-get install -y procps
```

これで`ps`コマンドが利用可能です。

早速、mysqlコンテナのプロセスを確認してみます。

```bash
ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql        1  0.9 20.0 2135592 408776 ?      Ssl  13:26   0:32 mysqld
root       197  0.0  0.1   3868  3244 pts/0    Ss   14:15   0:00 bash
root       602  0.0  0.1   7640  2724 pts/0    R+   14:20   0:00 ps aux
```

- まず一番上、mysqlのデーモンがバックグランドで起動中です。
- 次に真ん中、これは今使っているbashのプロセスです。
- 最後に、たった今打ち込んだ`ps aux`のプロセスが表示されています。

今回は、`exit`してもコンテナは停止しません。
なぜなら、mysqlのデーモンがバックグラウンドで動いているからです。


# まとめ

- コンテナのメタデータを確認
- コンテナのステータスを確認
- コンテナのシェルにアクセス
- ubuntuコンテナにパッケージをインストール
- コンテナのプロセスを確認

上記を実際に動かして確認しながら、動いているコンテナの様子をざっくり眺めました。🐳