天天看点

在boot2docker上使用nsenter进行docker调试

      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