Nsenter是一个允许进入名字空间的小工具。准确地说,当你使用doker工作时,这意味着你能够进入任何docker容器,即使它们没有运行任何sshd。在一个docker容器中运行sshd用来进行调试被认为是邪恶的。
Nsenter与Boot2docker
Docker不能直接在OS X和Windows上运行,所以你需要boot2docker。让nsenter和boot2docker一起工作着实需要一点技巧。
如果你等不及的话,这里有一个简单的函数,可以让你直接从OS X(或任何一个boot2docker的宿主系统)进入任意的docker容器:
docker-enter() {
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "$@"
}
第一行安装nsenter和docker-enter。如果没有这一句,则由第二行执行实际的调用。
一旦你声明了这个函数,你可以这样使用它:
docker-enter <CONTAINER-ID/CONTAINER-NAME>
TL;DR
如果你对这个函数的工作细节感兴趣,请继续阅读下面的内容。
在boot2docker上安装nsenter
怎么才能将nsenter装到boot2docker中呢?你需要一些技巧,因为boot2docker不是一个完整的Linux系统,它基于tiny core linux,所以对它进行编译不是一项简单地工作。
但是猜猜看我们有什么,jpetazzo已经创建了一个 docker化的nsenter。它建议以如下的方式安装二进制的nsenter:
这样就可以和boot2docker一起工作了……直到你重新启动它。你应该将所有的变动存储在一个永久的/var/lib/boot2docker目录。
docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter
docker-enter脚本
docker-enter是一个帮助脚本,可以帮你完成下面两个步骤:
- 得到docker容器的PID
- 执行nsenter,选择一个程序名称进行传递,让其在名字空间中执行。如果没有特别指定的命令,一个shell将会被调用。
在前面的步骤中,安装nsenter后,要将docker-help安装在相同的目录中。
直接从OS X中运行nsenter
一些博文会建议你首先ssh进boot2docker,然后在virtual env中使用nsenter或docker-enter。但是如果你正在通过ssh执行单个命令,你可以将命令传送给boot2docker ssh <COMMAND>的最后一个参数。
用一行代码完成工作
将所有步骤整合到一个单行的函数中:
docker-enter() { boot2docker ssh -t "[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter; sudo /var/lib/boot2docker/docker-enter $@"; }
如果你想让效果是永久的,可以将上面的代码复制粘贴到~/.profile或 ~/.bash_profile,也可以将它们保存到/usr/local/bin:
curl -Lo /usr/local/bin/docker-enter j.mp/docker-enter && . /usr/local/bin/docker-enter