CentOS 6.5でnsenterを使ってDockerコンテナに入る方法

f712a111e120c65ed3ec259a3f9c812b_s

CentOS 7が出ちゃったけど、もろもろのインフラが全部6ベースだからどうしようもないのさ…という昨今。Docker使うのももちろんまだまだCentOS 6.5上です。 で、動いているDockerコンテナにつなげる方法として、一時期話題になっていた、

の件。やってみたら動かないよ…。

go での nsinit のコンパイル方法を間違ったのかと思ったらさにあらず。カーネル2.6ベースのCentOS 6.5では、 nsinit は動かないんだそうな。う、動かしてる環境を書いておいてください…。

じゃあどうするかというと、新しい util-linux に入っている nsenter を使えとのこと。依存する gettext も拾ってきてコンパイルすれば CentOS 6.5 でも動いているコンテナにアタッチするコマンドがちゃんと 手に入る。すばらしい。これでわが軍はあと十年は戦える。

手コンパイルだとこんな感じ。rpm作るべきなのかも。

# mkdir -p /opt/lib
# mkdir /tmp/make/nsenter && cd /tmp/make/nsenter
# wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.1.tar.xz
# tar xvf gettext-0.19.1.tar.xz
# cd gettext-0.19.1
# ./configure --prefix=/opt/lib/gettext-0.19.1
# make && make install
# cd /tmp/make/nsenter
# wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.2.tar.xz
# tar xvf util-linux-2.24.2.tar.xz
# cd util-linux-2.24.2
# CFLAGS=-I/opt/lib/gettext-0.19.1/include LDFLAGS=-L/opt/lib/gettext-0.19.1/lib ./configure --prefix=/opt/lib/util-linux-2.24.2
# make && make install

これで /opt/lib/util-linux-2.24.2/bin/nsenternsenter 本体がインストールされた。ただ、このままだとちょっと使い勝手が 悪いので、

#!/bin/sh
/opt/lib/util-linux-2.24.2/bin/nsenter \
    --mount --uts --ipc --net --pid --target \
    `docker inspect --format '{{.State.Pid}}' $1`

とかいうファイルを /usr/bin/docker-nsenter として置いておくとよい。 で、つなげたい動作中コンテナのコンテナIDを docker ps で調べて、

# docker-nsenter コンテナID

とやると、みごとお好きなコンテナにアタッチできました。ぱちぱち…。
…めんどくさい。