たとえば、docker-compose.ymlでmem_limitを使ったらcgroupでメモリの最大使用量を設定してますが、それはホスト側ではどこで設定されてるかの確認です。確認に使った環境はfedora 28です。dockerはsystemdで起動してます。
こんな感じでapp1は15MB、app2は20MBとしてメモリの上限をセットします。
version: '2'
services:
app1:
build:
context: .
dockerfile: Dockerfile
cap_add:
- IPC_LOCK
mem_limit: 15m
app2:
build:
context: .
dockerfile: Dockerfile
cap_add:
- IPC_LOCK
mem_limit: 20m
そうするとコンテナ内はこんなふうに設定が見えます。想定通りですね。
app1のcgroup設定状況
masami@fedora:~/mem-limit-test$ sudo docker-compose run app1 /bin/bash
[root@fe7c57f1de53 /]# cat /sys/fs/cgroup/memory/tasks
1
15
[root@fe7c57f1de53 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
15728640
[root@fe7c57f1de53 /]#
app2のcgroup設定状況
masami@fedora:~/mem-limit-test$ sudo docker-compose run app2 /bin/bash
[root@e7b9f2845ed8 /]# cat /sys/fs/cgroup/memory/tasks
1
14
[root@e7b9f2845ed8 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
20971520
[root@e7b9f2845ed8 /]#
ホスト側では/sys/fs/cgroup/memory/system.sliceにdockerコンテナのディレクトリがあります。これの
.scopeで終わっているのが起動してるdockerコンテナのディレクトリです。
docker-containerd.service NetworkManager.service
docker-e7b9f2845ed8c361f8166b9890121538b2c46a8ca54c6f30fb6922b96fde1b11.scope notify_on_release
docker-fe7c57f1de535c56204625d860fb7648ad3d2f9f1d5a9922afa10c1c658e2f64.scope polkit.service
app1のmemory.limit_in_bytes。
[root@fedora docker-fe7c57f1de535c56204625d860fb7648ad3d2f9f1d5a9922afa10c1c658e2f64.scope]# cat tasks
13636
[root@fedora docker-fe7c57f1de535c56204625d860fb7648ad3d2f9f1d5a9922afa10c1c658e2f64.scope]# cat memory.limit_in_bytes
15728640
app2のmemory.limit_in_bytes。
[root@fedora docker-e7b9f2845ed8c361f8166b9890121538b2c46a8ca54c6f30fb6922b96fde1b11.scope]# cat tasks
13930
[root@fedora docker-e7b9f2845ed8c361f8166b9890121538b2c46a8ca54c6f30fb6922b96fde1b11.scope]# cat memory.limit_in_bytes
20971520
このようにホスト側ではsystemc.sliceディレクトリの下にあるdockerコンテナのcgroupのディレクトリで設定内容を確認できます。
dockerコンテナのプロセスツリーを確認した様子。
├─sshd,668 -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc-oMACs=hma
│ ├─sshd,1220 ...
│ │ └─sshd,1227 ...
│ │ └─bash,1228
│ │ └─sudo,13884 docker-compose run app2 /bin/bash
│ │ └─docker-compose,13888 /usr/bin/docker-compose run app2 /bin/bash
│ │ └─docker-current,13892 start --attach --interactive e7b9f2845ed8c361f8166b9890121538b2c46a8ca54c6f30fb6922b96fde1b11
│ │ ├─{docker-current},13894
│ │ ├─{docker-current},13895
│ │ ├─{docker-current},13896
│ │ ├─{docker-current},13897
│ │ ├─{docker-current},13901
│ │ ├─{docker-current},13902
│ │ ├─{docker-current},13903
│ │ ├─{docker-current},17062
│ │ └─{docker-current},17063
│ ├─sshd,2988 ...
│ │ └─sshd,2991 ...
│ │ └─bash,2992
│ │ └─pstree,3150 -ap
│ ├─sshd,12209 ...
│ │ └─sshd,12219 ...
│ │ └─bash,12220
│ ├─sshd,12874 ...
│ │ └─sshd,12877 ...
│ │ └─bash,12878
│ │ └─sudo,13586 docker-compose run app1 /bin/bash
│ │ └─docker-compose,13591 /usr/bin/docker-compose run app1 /bin/bash
│ │ └─docker-current,13605 start --attach --interactive fe7c57f1de535c56204625d860fb7648ad3d2f9f1d5a9922afa10c1c658e2f64
│ │ ├─{docker-current},13606
│ │ ├─{docker-current},13607
│ │ ├─{docker-current},13608
│ │ ├─{docker-current},13609
│ │ ├─{docker-current},13610
│ │ ├─{docker-current},13611
│ │ ├─{docker-current},13616
│ │ ├─{docker-current},25177
│ │ └─{docker-current},25178
.scopeファイルの名前にあるhash値はpstreeとかpsでプロセスの情報を見たときに確認できます。
masami@fedora:~$ ps -p 13605 -w 300
PID TTY STAT TIME COMMAND
13605 pts/6 Sl+ 0:00 /usr/bin/docker-current start --attach --interactive fe7c57f1de535c56204625d860fb7648ad3d2f9f1d5a9922afa10c1c658e2f64