Dockerコンテナ稼働時におけるホストのCPU・メモリの消費について

## 動機
コンテナの状態がホスト側にも影響するか確認したかった為、GUI上でコンテナ管理できるPortainerを使用しました。
コンテナにstressコマンドで負荷を掛けた場合、コンテナとリソースを共有しているホストOSにも影響が生じると考えました。

## 結論
コンテナに負荷を掛けた場合、ホスト側にも負荷が掛かっていることが確認できた。
またコンテナのリソース管理はPortainerが便利であった。

## 環境
Proxmox上にUbuntuを用意。
Ubuntuの上に各種コンテナをデプロイしている状態。
⇩私の理解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/32fe9b44-e938-74db-c6a8-ead785ed0ad2.png)

## 事前知識
- Portainerについて
GUI上でコンテナ管理ができるぐらいの知識。(具体的に何を確認できるのかまでは理解できていない。)
- Proxmoxについて
物理的なサーバー上で複数の仮想サーバーを動作可能なハイパーバイザー型の仮想化技術。
Dockerを学習する上で現在Proxmox上にUbuntuホストを用意している。

## 確認方法
1. Portainerコンテナの構築
2. Portainerにログイン
3. PortainerからNextCloudコンテナのリソースを確認
4. NextCloudコンテナへログイン
5. NextCloudコンテナでstressコマンドの実行
6. Portainerからコンテナの状態確認
7. Proxmox上からホストの状態確認

### 1. Portainerコンテナの構築
手順1:ボリュームの作成
```
docker volume create portainer_data
```

手順2:コンテナの作成
```
docker run -d \
  -p 9000:9000 \
  -p 8000:8000 \
  --name=portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer
```
※補足
「docker run -d \」…バックグラウンドでコンテナ作成＆実行
「-p 9000:9000」…ホストのポートとコンテナのポートを紐づけ。
「-p 8000:8000」…portainerコンテナ以外のDockerホストとの通信用に設定。
「--name=portainer \」…コンテナに「portainer」という名前を設定。
「--restart=always \」…システム再起動後、自動的に起動するよう設定。
「-v /var/run/docker.sock:/var/run/docker.sock \」…Dockerデーモンとの通信のためにDockerソケットをマウントするよう設定。
「-v portainer_data:/data \」…手順1で作成した「portainer_data」(ボリューム)を/dataにマウントするよう設定。(Portainerのデータはこのボリュームに保存される。)

### 2. Portainerコンテナにログイン
パスワードは12文字以上、3種類以上の文字種を使用しないといけなかった
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/f0c06acb-239f-3b93-c338-e96af9374bec.png)

### 3. PortainerからNextCloudコンテナのリソースを確認
- ダッシュボードから
以下項目が確認できるみたい…パッと理解できるのはContainersやImagesぐらい。
とりあえずContainersへ進む
・stack
・images
・Networks
・Containers
・Volumes
・CPUs
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/f4e44bc5-7903-5eda-ce74-fd18c1141bce.png)

- 「Stats」ボタンからメモリとCPUの使用率がリアルタイムで表示されるみたい。
…ということはコンテナにも仮想的にCPU、メモリなどのリソースが割り振られているってこと？
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/8d183e2a-0a69-3cb7-2d4b-563728b8f9b7.png)

### 4. NextCloudコンテナへログイン
```
docker exec -it  nextcloud /bin/bash
```
### 5. NextCloudコンテナでstressコマンドの実行
```
stress --cpu 2 --vm 2 --vm-bytes 1G
```
補足
2つのCPUコアに対して負荷をかけ、同時に2つの仮想メモリプロセスを生成し
それぞれに1GBのメモリを使用します。

### 6. Portainerからコンテナの状態確認
- stressコマンド実行前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/132652a5-f62d-f862-cf51-47a4c9718eaf.png)

- stressコマンド実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/b4bf4e08-eb36-9138-3001-0ec41d2c1e6c.png)

### 7. Proxmox上からホストの状態確認
- stressコマンド実行前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/b8726fac-790f-4b3b-25b9-883026fcd34f.png)

- stressコマンド実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632077/5131ea49-41e9-eb1f-f6d2-bc3fea08813b.png)

## まとめ
コンテナ上で負荷を掛けた状態では、ホスト側にも負荷が生じた。
stressコマンドでは各種リソースにどの程度負荷をかけるか調整可能なため、
例えばメモリに対して１GBの負荷をかけた場合、どの程度コンテナ側とホスト側でリソース状態が変化するのか見てみる…などもありだと思う。
今回の場合、「stress --cpu 2 --vm 2 --vm-bytes 1G」を実施した場合、
CPU…0.22％→99.95％
メモリ…75.39%→91.05%
まで上昇したことが分かる。