はじめに
Dockerコンテナ側から別のコンテナのプロセスを確認したいということがあったのでメモ書き。
環境
1
2
3
| Windows 11 Professional
WSL2 Ubuntu 24.04 LTS
Docker Desktop 4.33.1 (161083)
|
シーケンス図
sequenceDiagram
participant monitor as Monitorコンテナ
participant web as Webコンテナ (nginx)
participant db as DBコンテナ (MySQL)
monitor->>web: `docker top`でWebコンテナを確認
web-->>monitor: Webコンテナのプロセス情報を返す
monitor->>db: `docker top`でDBコンテナを確認
db-->>monitor: DBコンテナのプロセス情報を返す
構築
Dockefile
1
2
3
4
5
6
| FROM debian:bookworm-slim
RUN apt update && \
apt install -y docker.io docker-compose
ENTRYPOINT ["sh"]
|
dood
(Docker-outside-of-Docker)として利用するコンテナ。
このコンテナの起動を利用して、他のDockerコンテナのプロセスを確認する。
compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| services:
web:
container_name: web
image: nginx:1.27.0
ports:
- "8080:80"
depends_on:
- db
db:
container_name: db
image: mysql:8.4.2
restart: always
environment:
MYSQL_ROOT_PASSWORD: secret
monitor:
container_name: monitor
build:
context: .
stdin_open: true
tty: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
|
web
とdb
は監視対象のコンテナ、それぞれnginx
, mysql
をベースにしている。
container_name
をつけておかないと、後々プロセスを調べる際に面倒なのでつけておく。
monitor
の下記部分で dood
を実現している。
1
2
| volumes:
- /var/run/docker.sock:/var/run/docker.sock
|
試す
上記ファイルを同じ階層において ビルド+起動
起動後、monitor
コンテナに入る。
1
| docker compose exec monitor bash
|
docker psを実行
monitor
コンテナに入った後に実行
1
2
3
4
5
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf647f476606 nginx:1.27.0 "/docker-entrypoint.…" 17 minutes ago Up 17 minutes 0.0.0.0:8080->80/tcp web
6fde4a841ddd dood-test-monitor "sh" 17 minutes ago Up 17 minutes monitor
2fa070a9c981 mysql:8.4.2 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 3306/tcp, 33060/tcp db
52f9a442a31c vsc-blog-hugo-af8adb49b770e8aaf8721666bd08776d881c75ac215e040756eefdfb91959673-features-uid "/bin/sh -c 'echo Co…" 2 days ago Up 10 minutes suspicious_wozniak
|
docker topを実行
webコンテナ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| root@6fde4a841ddd:/# docker top web
UID PID PPID C STIME TTY TIME CMD
root 9695 9671 0 09:04 ? 00:00:00 nginx: master process nginx -g daemon off;
statd 9807 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9808 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9809 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9810 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9811 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9812 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9813 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9814 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9815 9695 0 09:04 ? 00:00:00 nginx: worker process
statd 9816 9695 0 09:04 ? 00:00:00 nginx: worker process
...
...
|
長いので省略
dbコンテナ
1
2
3
| root@6fde4a841ddd:/# docker top db
UID PID PPID C STIME TTY TIME CMD
999 9569 9526 0 09:04 ? 00:00:03 mysqld
|
上記のように、各コンテナのプロセスが取得できている。
doodでない場合はどうなるか
1
2
| volumes:
- /var/run/docker.sock:/var/run/docker.sock
|
の部分を削除してビルド+起動してみる。
monitor
コンテナに入って下記を実行する。
1
2
| root@0864c6576179:/# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
|
ということで上記のようになる。
これは、コンテナ内のdocker.sock
を利用しての docker
が起動していないのでこの結果となる。
参考
おわりに
粒度が異なるが、Dockerコンテナ側からホスト側のプロセスを確認する とは異なる方法でプロセスを確認してみた。
docker
のプロセスのみであれば上記で事足りるので、要件に合わせて使い分けたい。