Аннотация: В этой статье основное внимание уделяется входу в целевой процесс с точки зрения «сети ns», то есть рассмотрению сетевого мира внутри контейнера с «точки зрения процесса в контейнере» и выполнению команд с этой точки зрения.
Эта статья опубликована в сообществе Huawei Cloud « Изучаем облачную сеть с учителем Тан» — nsenter Magic Wand , автор: tsjsdbd.
Иногда необходимое программное обеспечение отсутствует в контейнере Docker. Например, базовые программные пакеты, такие как curl, wget, ifconfig, ip, tcpdump и т. д., ничего не могут сделать, что сводит людей с ума.
[root@tsjsdbd home]# docker exec -it 8402 /bin/bash
root@8402d89fe04a:/# ifconfig
bash: ifconfig: command not found
root@8402d89fe04a:/# ip
bash: ip: command not found
root@8402d89fe04a:/# tcpdump
bash: tcpdump: command not found
root@8402d89fe04a:/# curl
bash: curl: command not found
root@8402d89fe04a:/# nslookup
bash: nslookup: command not found
root@8402d89fe04a:/# wget
wget: missing URL
Usage: wget [OPTION]... [URL]...
Столкнувшись с образом такого контейнера, будет очень сложно найти проблему, потому что после того, как вы войдете в контейнер, вам придется переустанавливать различное базовое программное обеспечение, если вы хотите выполнять команды, что очень хлопотно.
В это время мы должны взять в руки волшебную палочку «nsenter» и взмахнуть ею на хозяина.
ns-enter, как следует из названия, «входит в различные пространства имен», то есть команда nsenter может войти в перспективу ns указанного целевого процесса.
Таким образом, nsenter может смотреть на мир с «точки зрения» указанного процесса.Эта статья посвящена «сетевой ns» перспективе входа в целевой процесс, то есть с «точки зрения процесса в контейнере», чтобы посмотреть на сетевой мир внутри контейнера и выполнить в этой перспективе порядок.
Во-первых, нам нужно найти идентификатор целевого процесса «целевого ns» для входа. То есть: корневой процесс в контейнере
[root@tsjsdbd ubuntu]# docker inspect 8402d89fe04a
[
{
"Id": "8402d89fe04a7e161faf8a01a86c47f8402d4c8d7207b6897d8e6d661d670df4",
"State": {
"Status": "running",
"Pid": 18751,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-10T03:12:19.221460059Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
«Босс» в контейнере — это процесс номер 18751.
Так что мы отслеживаем этот процесс прямо на хосте Host, и входим в его «перспективу», и мы можем видеть мир внутри контейнера. А поскольку мы, как контроллер, в это время все еще находимся на хосте, мы можем выполнять на хосте различные командные строки.
следующее:
[root@tsjsdbd ubuntu]# nsenter -t 18751 -n ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 1688355 bytes 194318903 (185.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 138826 bytes 146246172 (139.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 0 (Local Loopback)
RX packets 13939 bytes 13140220 (12.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13939 bytes 13140220 (12.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Другие команды можно выполнить, скопировав их.
Например, в контейнере нет команды nslookup, а только на хосте Host, мы можем выполнить ее в контейнере:
[root@tsjsdbd ubuntu]# nsenter -t 18751 -n nslookup www.baidu.com
Server: 10.129.2.34
Address: 10.129.2.34#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 14.119.104.254
Name: www.a.shifen.com
Address: 14.119.104.189
Таким образом, поведение отладки, которое не могло быть выполнено в контейнере, может быть выполнено таким образом.
Более конкретно, если вы не принимаете последний параметр команды выполнения, вы можете напрямую ввести «целевую перспективу» для интерактивного выполнения cli:
[root@tsjsdbd ubuntu]# nsenter -t 18751 -n
#这里就进入交互模式,相当于没有填写cli时,默认执行[当前bash]
[root@tsjsdbd ubuntu]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
4261: eth0@if4262: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
[root@tsjsdbd ubuntu]# curl
curl: try 'curl --help' or 'curl --manual' for more information
[root@tsjsdbd ubuntu]# tcpdump
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
[root@tsjsdbd ubuntu]# exit
#执行exit,可退出“目标视角”
Видно, что все командные строки cli, связанные с сетью, могут быть выполнены.
Более того, все эти команды выполняются с точки зрения контейнера, поэтому эффект такой же, как и в контейнере (хотя сами они инициируются в хосте).
Подобно фильмам «Исходный код» и «Матрица», используйте «людей» во внешнем мире для управления поведением во «внутреннем мире» . Надеюсь, вы понимаете логику этой перспективы Бога :-)
![](https://pic4.zhimg.com/80/v2-1d9b6de06d5382d0fe65f08d05e68f13_720w.webp)
Суммарное использование:
(1) Найдите PID целевого процесса
docker inspect xxx
(2) Выполнять определенные команды cli напрямую
nsenter -n -t 822647 ifconfig
(3) Войдите в перспективу контейнера и выполните интерактивный клик.
nsenter -n -t 822647
exit
Нажмите, чтобы подписаться и узнать о свежих технологиях Huawei Cloud впервые~
Выпускники Национального народного университета украли информацию обо всех студентах школы, чтобы создать веб-сайт для оценки красоты, и были задержаны в уголовном порядке.Официально выпущена новая версия QQ для Windows, основанная на архитектуре NT.Соединенные Штаты ограничат использование Китая Amazon, Microsoft и других облачных сервисов, обеспечивающих обучение моделей ИИ Проекты с открытым исходным кодом объявили о прекращении разработки функций функции изображения терминала Количество регистраций потоков превысило 30 миллионов. «Изменение» Deepin использует Asahi Linux, чтобы адаптироваться к рейтингу базы данных Apple M1 в июле: Oracle растет, снова открывая счет