nsenterコマンドでLinuxの名前空間に入る方法|コンテナデバッグと実務活用も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > nsenterコマンドでLinuxの名前空間に入る方法|コンテナデバッグと実務活用も
「docker exec が使えない状況で、コンテナ内のネットワークを確認しなければならない」——そんな場面が現場ではよくあります。
docker デーモンが停止していたり、別の仕組みで起動したコンテナだったりすると、docker exec は使えません。

こういった状況で頼りになるのが nsenter コマンドです。
この記事では、nsenter の基本構文から、PID・ネット・マウント各名前空間への入り方、コンテナデバッグへの応用まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した手順を解説します。

この記事のポイント

・nsenter -t PID でプロセスの名前空間に外から入れる
・--net --pid --mnt でどの名前空間に入るか指定できる
・docker exec が使えない場面でのコンテナ調査に有効
・/proc/PID/ns/ でプロセスの名前空間リンクを確認できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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. インストール確認

nsenterutil-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

コンテナの中に入ったような状態になります。PID 1 がコンテナのメインプロセスとして見えているのがわかります。

応用・実務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))

「コンテナが特定ポートで LISTEN しているか」「コンテナ内からの外部通信」などをホスト側から安全に確認できます。
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 が間違っています。pgrepps 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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。