地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

pid名前空間を別コンテナで共有する

すでに実行中のコンテナがあるとしてそのコンテナにデバッグコマンドが一つも入ってないケースを想定。

この場合はコンテナに入ってパッケージマネージャを使用してデバッグツールを入れる方法もあるがそれすらもかなわない状況だったとする。

そんな時に使えるオプションが--pid=container:で実行中のコンテナと新たに起動したコンテナでpid namespaceを共有する方法。

サイドカーパターンの文脈に登場したりするテクニック

docs.docker.com

適当にnginxコンテナを走らせてみる

docker container run -d nginx

次にpidオプションを指定して先ほどあげたnginxコンテナのコンテナIDを指定してみる

docker container run -it --pid=container:bc3c1d8e8996 bash

psでプロセスを確認

bash-5.0# ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 nginx: master process nginx -g daemon off;
    6 101       0:00 nginx: worker process
    7 root      0:00 bash
   12 root      0:00 ps aux

あとはstraceでpidにアタッチするなりすればデバッグすることが可能になる。

procファイルシステムでnsを確認しても同一のものとなっていることが確認できる。

# コンテナごとのPIDを取得
[root@choco01 ~]# docker container inspect -format="{{ .State.Pid }}" bc3c1d8e8996
ormat=17050
[root@choco01 ~]# docker container inspect -format="{{ .State.Pid }}" 5e1d3acb0352
ormat=17646

# nsを覗いてみる
[root@choco01 ~]# ls -l /proc/17646/ns/pid
lrwxrwxrwx. 1 root root 0  323 23:11 /proc/17646/ns/pid -> pid:[4026532457]
[root@choco01 ~]# ls -l /proc/17050/ns/pid
lrwxrwxrwx. 1 root root 0  323 23:05 /proc/17050/ns/pid -> pid:[4026532457]

参考文献

Amazon CAPTCHA