はじめに

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

webdbは監視対象のコンテナ、それぞれnginx, mysqlをベースにしている。
container_nameをつけておかないと、後々プロセスを調べる際に面倒なのでつけておく。

monitorの下記部分で doodを実現している。

1
2
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

試す

上記ファイルを同じ階層において ビルド+起動

1
docker compose up -d

起動後、monitorコンテナに入る。

1
docker compose exec monitor bash

docker psを実行

monitorコンテナに入った後に実行

1
docker ps
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
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
docker top 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
docker ps
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のプロセスのみであれば上記で事足りるので、要件に合わせて使い分けたい。