docker デーモンが停止していたり、別の仕組みで起動したコンテナだったりすると、docker exec は使えません。
こういった状況で頼りになるのが
nsenter コマンドです。この記事では、nsenter の基本構文から、PID・ネット・マウント各名前空間への入り方、コンテナデバッグへの応用まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した手順を解説します。
この記事のポイント
・nsenter -t PID でプロセスの名前空間に外から入れる
・--net --pid --mnt でどの名前空間に入るか指定できる
・docker exec が使えない場面でのコンテナ調査に有効
・/proc/PID/ns/ でプロセスの名前空間リンクを確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Linuxの名前空間(namespace)とは何か
名前空間は、プロセスが「見える世界」を分離する仕組みです。コンテナ技術(Docker・Podman など)はこの名前空間を活用して、プロセス・ネットワーク・ファイルシステムを他と分離しています。
【注意】nsenter は root 権限が必要です。一般ユーザーで実行すると「Permission denied」が発生します。sudo を付けるか、root ユーザーで実行してください。
主な名前空間の種類は次のとおりです。
・PID 名前空間:プロセス ID を分離する。コンテナ内は PID 1 から始まる
・NET 名前空間:ネットワークインターフェース・ルーティングテーブルを分離する
・MNT 名前空間:マウントポイントを分離する
・UTS 名前空間:ホスト名・ドメイン名を分離する
・IPC 名前空間:共有メモリ・セマフォを分離する
・USER 名前空間:UID・GID マッピングを分離する
nsenter はこれらの名前空間に「外から入る」ためのコマンドです。ホストの root 権限があれば、実行中のコンテナやプロセスの名前空間に割り込んでコマンドを実行できます。
nsenterの基本的な使い方
1. インストール確認
nsenter は util-linux パッケージに含まれており、RHEL 9 / Ubuntu 24.04 では標準でインストール済みです。# バージョン確認 $ nsenter --version nsenter from util-linux 2.37.4
2. 対象プロセスのPIDを確認する
nsenter を使うには、対象プロセスの PID が必要です。# プロセス名で PID を調べる(例: nginx) $ pgrep nginx 12345 12346 # または ps コマンドで確認 $ ps aux | grep nginx | grep -v grep nginx 12345 0.0 0.1 54320 4112 ? S 10:00 0:00 nginx: worker process
3. NET名前空間に入る(最頻出)
コンテナ内のネットワーク設定を確認したい場面が最も多いです。-t でターゲット PID を指定し、--net でネット名前空間に入ります。# PID 12345 の NET 名前空間でコマンドを実行 $ sudo nsenter -t 12345 --net ip addr show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0@if23: mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
ip addr では見えない、コンテナ専用のインターフェース(eth0)が確認できます。4. 複数の名前空間を同時指定する
--net --pid --mnt のように複数指定すると、その名前空間の組み合わせに入れます。# NET + PID + MNT の名前空間すべてに入り、bash を起動 $ sudo nsenter -t 12345 --net --pid --mnt /bin/bash [root@container /]# ps aux PID USER COMMAND 1 root /usr/sbin/nginx -g daemon off; 12 root bash
応用・実務Tips
1. /proc/PID/ns/ で名前空間リンクを確認する
各プロセスの名前空間は/proc/PID/ns/ 以下にシンボリックリンクとして存在します。# PID 12345 の名前空間リンクを確認 $ sudo ls -la /proc/12345/ns/ total 0 lrwxrwxrwx 1 root root 0 Apr 30 10:00 ipc -> ipc:[4026531839] lrwxrwxrwx 1 root root 0 Apr 30 10:00 mnt -> mnt:[4026532456] lrwxrwxrwx 1 root root 0 Apr 30 10:00 net -> net:[4026532513] lrwxrwxrwx 1 root root 0 Apr 30 10:00 pid -> pid:[4026532514] lrwxrwxrwx 1 root root 0 Apr 30 10:00 uts -> uts:[4026531838] lrwxrwxrwx 1 root root 0 Apr 30 10:00 user -> user:[4026531837] # ホストの名前空間と番号が違う(隔離されている)ことが確認できる $ ls -la /proc/1/ns/net lrwxrwxrwx 1 root root 0 Apr 30 10:00 /proc/1/ns/net -> net:[4026531992]
2. Dockerコンテナに外から入る方法
docker exec が使えない場面(docker デーモン停止中、Podman で起動したコンテナなど)でも nsenter は有効です。# 対象コンテナの PID を docker inspect で取得 $ docker inspect --format '{{.State.Pid}}' mycontainer 12345 # NET 名前空間に入りポートを確認 $ sudo nsenter -t 12345 --net ss -tnlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("python3",pid=1,fd=3))
Linux ポート確認の全コマンド(ss・lsof・netstat)と組み合わせることで、コンテナ内のネットワーク状況をより詳しく調査できます。
3. UTS名前空間でホスト名を確認する
# UTS 名前空間に入り、コンテナのホスト名を確認 $ sudo nsenter -t 12345 --uts hostname my-container-abc123 # ホストのホスト名とは別になっている $ hostname web01.example.com
4. ファイルシステム(MNT名前空間)の調査
# MNT 名前空間に入り、コンテナのマウント状況を確認 $ sudo nsenter -t 12345 --mnt mount | head -10 overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/...) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755) /dev/sda1 on /etc/hosts type ext4 (rw,relatime) /dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime)
トラブルシュート・エラー対処
「Operation not permitted」が出る場合
nsenter は root 権限が必要です。sudo を付けるか、root ユーザーで実行してください。# NG: 一般ユーザーで実行 $ nsenter -t 12345 --net ip addr nsenter: cannot open /proc/12345/ns/net: Permission denied # OK: sudo を付ける $ sudo nsenter -t 12345 --net ip addr
「No such process」が出る場合
指定した PID のプロセスがすでに終了しているか、PID が間違っています。pgrep や ps aux で PID を再確認してください。# PID を再確認 $ pgrep -a nginx 12347 nginx: master process /usr/sbin/nginx # 取得した PID で再実行 $ sudo nsenter -t 12347 --net ip addr
コンテナを停止したら名前空間が消える場合
コンテナ(プロセス)が終了すると名前空間は自動で消えます。調査は実行中のコンテナに対して行ってください。本記事のまとめ
Linux DNS 設定の基本やネットワーク設定の調査でも、コンテナ環境では nsenter が重宝します。以下に主なコマンドをまとめます。| やりたいこと | コマンド |
|---|---|
| NET名前空間でIPを確認 | sudo nsenter -t PID --net ip addr |
| NET名前空間でポートを確認 | sudo nsenter -t PID --net ss -tnlp |
| 複数名前空間でbashを起動 | sudo nsenter -t PID --net --pid --mnt /bin/bash |
| UTS名前空間でホスト名確認 | sudo nsenter -t PID --uts hostname |
| MNT名前空間でマウント確認 | sudo nsenter -t PID --mnt mount |
| 名前空間リンクを確認 | ls -la /proc/PID/ns/ |
| DockerコンテナのPIDを取得 | docker inspect --format コンテナ名 |
nsenterでコンテナ調査ができたら、次はサーバー構築の全体像を学びませんか?
名前空間の仕組みを理解できると、コンテナ・仮想化・セキュリティの理解が一気に深まります。そのスキルをさらに活かして、体系的なLinuxサーバー構築を学んでみませんか。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:loggerコマンドでシステムログに任意のメッセージを記録する方法|rsyslog転送やシェルスクリプト活用も
- 前のページへ:jqコマンドでJSONを解析・加工する方法|フィルタ・整形・抽出の実践例も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます