はじめに
Dockerコンテナ側から別のコンテナのプロセスを確認したいということがあったのでメモ書き。
環境
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
FROM debian:bookworm-slim
RUN apt update && \
apt install -y docker.io docker-compose
ENTRYPOINT ["sh"]
dood
(Docker-outside-of-Docker)として利用するコンテナ。
このコンテナの起動を利用して、他のDockerコンテナのプロセスを確認する。
compose.yml
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
を実現している。
volumes:
- /var/run/docker.sock:/var/run/docker.sock
試す
上記ファイルを同じ階層において ビルド+起動
docker compose up -d
起動後、monitor
コンテナに入る。
docker compose exec monitor bash
docker psを実行
monitor
コンテナに入った後に実行
docker ps
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コンテナ
docker top web
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コンテナ
docker top db
root@6fde4a841ddd:/# docker top db
UID PID PPID C STIME TTY TIME CMD
999 9569 9526 0 09:04 ? 00:00:03 mysqld
上記のように、各コンテナのプロセスが取得できている。
doodでない場合はどうなるか
volumes:
- /var/run/docker.sock:/var/run/docker.sock
の部分を削除してビルド+起動してみる。
monitor
コンテナに入って下記を実行する。
docker ps
root@0864c6576179:/# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ということで上記のようになる。
これは、コンテナ内のdocker.sock
を利用しての docker
が起動していないのでこの結果となる。
参考
nginx | dockerhub
https://hub.docker.com/_/nginxmysql | dockerhub
https://hub.docker.com/_/mysqldebian | dockerhub
https://hub.docker.com/_/debianDooD(docker outside of docker)環境でdocker composeができない場合の対処法
https://zenn.dev/salmonbsl/articles/dood-docker-compose-volume-directoryDocker コンテナ内から Docker コマンドを使う
https://kuttsun.blogspot.com/2022/05/docker-docker.htmlとりあえずでDockerイメージにAlpine Linuxを選択するのはやめましょうという話
https://engineering.nifty.co.jp/blog/26586
おわりに
粒度が異なるが、Dockerコンテナ側からホスト側のプロセスを確認する とは異なる方法でプロセスを確認してみた。
docker
のプロセスのみであれば上記で事足りるので、要件に合わせて使い分けたい。