您的位置:首页 > 运维架构 > Docker

在boot2docker上使用nsenter进行docker调试

2014-08-16 10:37 369 查看
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:

docker run --rm -v /usr/local/bin:/target jpetazzo/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: